实现一个需求,在机器关机状态下,只要充电中并电量达到10%就自己开机。
修改bootloader的charge_mode流程
一开始想着既然要在充电时判断电量启动,不如就在bootloader改动,因为bootloader作为系统的引导器,在按键的触发下,会选择对应的模式往下走,比如charge_mode,fastboot_mode,normal_mode(正常启动)等.
当插入充电器时,bootloader一般会走charge_mode流程,我们直接在charge_mode的函数实现内判断当前电压是否大于最低启动电压,如果大于则判断电量,因为只有电压的情况,所以找硬件要了份电池曲线表,找到电量10%对应的电压,如果大于这个电压则进入normal_mode开机,否则继续charge_mode流程.
获取当前电压的函数和最低启动电压的值,可在bootloader/uboot目录下搜索VBAT/BAT/VOL相关的字段
比如展讯9820平台的最低启动电压的值是在uboot/include/configs/XXXX.h(对应项目头文件)
1 |
|
而获取当前电压的函数在sprd_battery.c
1 |
|
修改编译刷机测试,正常实现了充电自开机,需求完成!
……
但是问题来了,测试员反馈自动开机不稳定,怎么不稳定?原本定义10%自动开机,但实际电量在1%-20%区间都有可能触发,还有30%电量还不触发的情况.
难道是获取当前电压的函数有问题?于是我加了log打印当前电压的值,bootloader的log可以通过串口输出日志看到.
结果发现获取当前电压的函数返回的值浮动很大,很不稳定,这时候只能提个case给平台商了.
平台商的回复如下:
| 电池的开路电压很难通过电池工作状态下来计算出来,计算出来的误差非常大,因此我们不能通过在uboot来检测电池开路电压的方式计算电池容量是否已经冲上来了,所以我们就用电池的工作电压,充电器在位的时候3.3V,充电器不在位的时候3.4V开机,保证开机过程不会掉电
更好的实现方法:在关机充电动画处判断电压开机
充电动画的代码一般是平台厂商定制的,所以直接到vendor目录下搜索charge字段,找到charge动画相关代码.由于是充电动画相关的代码,所以肯定有获取显示电量的代码,这就节省了我们依据电压去判断电量的不准确性.
下面直接贴代码
展讯:
1 |
|
MTK:
vendor/mediatek/proprietary/external/charger/charging_control.cpp