先看is_bat_low函数的代码:
#ifndef LOW_BAT_VOL
//# define LOW_BAT_VOL 3400
#define LOW_BAT_VOL 3672
#endif
#ifndef LOW_BAT_VOL_CHG
//# define LOW_BAT_VOL_CHG 3500
#define LOW_BAT_VOL_CHG 3719
#endif
int is_bat_low(void)
{
int32_t vbat_vol;
uint16_t comp_vbat;
...............
if (charger_connected()) {
comp_vbat = LOW_BAT_VOL_CHG;
} else {
comp_vbat = LOW_BAT_VOL;
}
vbat_vol = sprdfgu_read_vbat_vol();
dprintf(ALWAYS,"sprd_chg: %s vbat_vol:%d,comp_vbat:%d\n",
__func__, vbat_vol, comp_vbat);
if (vbat_vol < comp_vbat)
return 1;
else
return 0;
}
函数包含充电状态、非充电状态电池电量是否过低的检查,3400、3500是原有的电压宏定义,计量单位mV(毫伏),这个定义的标准需要参考当前电池的电池曲线,根据配置的dts文件查找,
查到的是:
................
<3706000 11 >,
..............
<3687000 7 >,
<3684000 6 >,
<3680000 5 >,
<3672000 4 >,
<3649000 3 >,
<3610000 2 >,
................
左面参数是电压,uV(微伏);右侧是电池电量百分比,开机后显示的电池电量和电池电压的对应关系就在这。好吧,my god,差了好多,这是只要有电就开机。
参考电池曲线对应的电压标准重新定义,让他电量低于一个标准就没法从开机。
充电状态下,电池电压会略微高点,根据实测值调整。
本以为到这就结束了,又碰到一种电池,低压状态下电池输出功率不够,电压变化非常大,还要继续改。
手机上看到的电池电量也是这么计算,电池老化后,电压波动也会非常大,显示的结果就是电池电量掉的非常快。