高通关机电压过高

1.文件目录

kernel/msm-4.9/drivers/power  驱动代码

kernel/msm-4.9/arch/arm64/boot/dts/qcom/  dtsi

kernel\msm-4.9\Documentation\devicetree\bindings\batterydata  说明文档

2. 参考文档

高通平台电池曲线 https://blog.csdn.net/zmk0810612124/article/details/83070109
电池驱动调试总结,电池服务+电量计驱动+调试方法 https://blog.csdn.net/WY_stutdy/article/details/81358363
高通电池管理系统(BMS)驱动分析 http://huaqianlee.github.io/2015/06/24/Android/qaulcomm-bms-driver-analysis/
高通电池管理基于QPNP电压模式  https://blog.csdn.net/dgy163com/article/details/59105760
高通8X16电池BMS算法(一) https://blog.csdn.net/yanleizhouqing/article/details/51592243
高通8X16电池BMS算法(二) https://blog.csdn.net/yanleizhouqing/article/details/51649737

3.问题:关机电压过高(3.58v)要求3.3-3.5之间
思路步骤:
复现问题,查找关键soc 当soc为0是会关机
参考文件:kernel/msm-4.9/drivers/power/supply/qcom/qg-soc.c
1)抓取开机log 查找电池电量驱动如:QG-K: qpnp_qg_probe: QG initialized! battery_profile=
2)走读下probe函数找到更新soc的处理函数INIT_WORK(&chip->udata_work, process_udata_work) -> int qg_adjust_sys_soc(struct qpnp_qg *chip)
3)分析qg_adjust_sys_soc代码

int qg_adjust_sys_soc(struct qpnp_qg *chip)
{
    int soc, vbat_uv, rc;
    int vcutoff_uv = chip->dt.vbatt_cutoff_mv * 1000;

    chip->sys_soc = CAP(QG_MIN_SOC, QG_MAX_SOC, chip->sys_soc);

//    if (chip->sys_soc == QG_MIN_SOC) {//修改前QG_MIN_SOC为0 而chip->sys_soc 值小于50时会通过DIV_ROUND_CLOSEST把soc从1->0导致关机
    if (chip->sys_soc == QG_MIN_SOC || chip->sys_soc <= 50) {
        /* Hold SOC to 1% of VBAT has not dropped below cutoff */
        rc = qg_get_battery_voltage(chip, &vbat_uv);
//        if (!rc && vbat_uv >= (vcutoff_uv + VBAT_LOW_HYST_UV))//考虑到压降,这个截至电压设置为3.4v默认为3.45v
        if (!rc && vbat_uv >= (vcutoff_uv))
            soc = 1;
        else
            soc = 0;
    } else if (chip->sys_soc == QG_MAX_SOC) {
        soc = FULL_SOC;
    } else if (chip->sys_soc >= (QG_MAX_SOC - 100)) {
        /* Hold SOC to 100% if we are dropping from 100 to 99 */
        if (chip->last_adj_ssoc == FULL_SOC)
            soc = FULL_SOC;
        else /* Hold SOC at 99% until we hit 100% */
            soc = FULL_SOC - 1;
    } else {
        soc = DIV_ROUND_CLOSEST(chip->sys_soc, 100);
    }

    qg_dbg(chip, QG_DEBUG_SOC, "last_adj_sys_soc=%d  adj_sys_soc=%d\n",
                    chip->last_adj_ssoc, soc);
    chip->last_adj_ssoc = soc;

    return soc;
}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值