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;
}