<强>问题情形:强>
1。电量跳变到
50%2。电池ID脚接地
3。温度脚来判断电池是否在位
<>强推测原因:强>
判断电池在位的方法:
qpnp-linear-charger.c enum bpd_type { BPD_TYPE_BAT_ID=" bpd_id ", BPD_TYPE_BAT_THM=" bpd_thm ", BPD_TYPE_BAT_THE_BAT_ID=" bpd_thm_id ", }
先在设备树查找桶是否有值
<代码> of_property_read_string(芯片→spmi→dev.of_node,“qcom bpd-detection”,和桶)代码>
找不到的话,用代码的定义(通过温度脚判断)
<代码>芯片→cfg_bpd_detection=BPD_TYPE_BAT_THM; 代码>
把参数配置到结构体中。
计算电池容量:
<代码> get_prop_capacity (struct qpnp_lbd_chip *芯片)代码>
如果电池不在位并且或为假电池,返回默认电量(50)
电池在位检测函数:(调用流程)
get_prop_batt_present (struct qpnp_lbc_chip *芯片) →→qpnp_lbc_read(芯片,芯片bat_if_base + BAT_IF_PRES_STATUS_REG【(】,和reg_val, 1) →__qpnp_lbc_read (val spmi,基地数) →spmi_ext_register_read (spmi→ctrl, spmi→sid,基地,val,计数) →spmi_read_cmd (ctrl, SPMI_CMD_EXT_READL sid, addr, len-1 buf) →ctrl→read_cmd (ctrl,操作码,sid, addr,公元前buf)
温度检测函数:
<代码> get_prop_batt_temp (struct qpnp_lbc_chip *芯片)代码>
如果是假电池并且电池不在位,返回默认温度
<代码> qpnp_vadc_read(芯片vadc_dev LR_MUX1_BATT_THEM,和结果)代码>
如果读取失败,返回默认温度
<代码>→如果(==VBAT_SNS)频道代码>
读电压
<代码> qpnp_vadc_conv_seq_request (vadc ADC_SEQ_NONE,通道,结果)代码>
读温度
<代码> qpnp_vadc_conv_seq_request (vadc、ADC_SEQ_NONE DIE_TEMP,, die_temp_result) 代码>
读补偿
<代码> qpnp_vbat_sns_comp(及结果→物理、vadc die_temp_result.physical) 代码>
最后返回
<代码> qpnp_vadc_con_seq_request (vadc ADC_SEQ_NONE,通道,结果)代码>
此项目通过软件计算电量,没有专用的电量计芯片
计算电量的要素:温度电压电流
虚拟电量计qpnp-vm-bms.c
所以一旦温度采集不准,必导致电量百分比计算错误
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!