Android实现关机状态下充电自开机

Android实现关机状态下充电自开机

实现一个需求,在机器关机状态下,只要充电中并电量达到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
#define LOW_BAT_VOL            3500 /*phone battery voltage low than this value will not boot up*/

而获取当前电压的函数在sprd_battery.c

1
unsigned int  vbat_vol = sprdfgu_read_vbat_vol();

修改编译刷机测试,正常实现了充电自开机,需求完成!

……

但是问题来了,测试员反馈自动开机不稳定,怎么不稳定?原本定义10%自动开机,但实际电量在1%-20%区间都有可能触发,还有30%电量还不触发的情况.

难道是获取当前电压的函数有问题?于是我加了log打印当前电压的值,bootloader的log可以通过串口输出日志看到.

结果发现获取当前电压的函数返回的值浮动很大,很不稳定,这时候只能提个case给平台商了.

平台商的回复如下:

| 电池的开路电压很难通过电池工作状态下来计算出来,计算出来的误差非常大,因此我们不能通过在uboot来检测电池开路电压的方式计算电池容量是否已经冲上来了,所以我们就用电池的工作电压,充电器在位的时候3.3V,充电器不在位的时候3.4V开机,保证开机过程不会掉电


更好的实现方法:在关机充电动画处判断电压开机

充电动画的代码一般是平台厂商定制的,所以直接到vendor目录下搜索charge字段,找到charge动画相关代码.由于是充电动画相关的代码,所以肯定有获取显示电量的代码,这就节省了我们依据电压去判断电量的不准确性.

下面直接贴代码

展讯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
vendor/sprd/proprietories-source/charge/ui.c

void *charge_thread(void *cookie) {
int fd, err;
char buf;
int bat_stat = 0;
int bat_level = 0;
for (; !is_exit; ) {
usleep(1000000/ PROGRESSBAR_INDETERMINATE_FPS);
// update the progress bar animation, if active
if (bat_stat == BATTERY_STATUS_CHARGING) {
gProgressBarType = PROGRESSBAR_TYPE_INDETERMINATE;
} else {
gProgressBarType = PROGRESSBAR_TYPE_NORMAL;
}

bat_level = battery_capacity();
bat_stat = battery_status();
update_progress_locked(bat_level);
+ //如果电量大于10%则开机启动
+ if(bat_level > 20)
+ syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, "charger");

usleep(500000);
}
usleep(200);
return NULL;
}

MTK:

vendor/mediatek/proprietary/external/charger/charging_control.cpp

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×