最近在适配新机型的过程中遇到一个问题,关机后充电呼吸灯不亮.
刚开始遇到这个问题时,一时束手无策,因为对这关机充电的流程根本不清楚.最后查阅资料和同事交流后发现关键充电的代码在/system/core/healthd目录下.
知道代码在哪里后首先来看看main函数(healthd.cpp)
int main(int argc, char **argv) {
int ch;
int ret;
klog_set_level(KLOG_LEVEL);
healthd_mode_ops = &android_ops;//默认类型
if (!strcmp(basename(argv[0]), "charger")) {
healthd_mode_ops = &charger_ops;
} else {
while ((ch = getopt(argc, argv, "cr")) != -1) {
switch (ch) {
case 'c':
healthd_mode_ops = &charger_ops;
break;
case 'r':
healthd_mode_ops = &recovery_ops;
break;
case '?':
default:
KLOG_ERROR(LOG_TAG, "Unrecognized healthd option: %c\n",
optopt);
exit(1);
}
}
}
ret = healthd_init();//初始化
if (ret) {
KLOG_ERROR("Initialization failed, exiting\n");
exit(2);
}
periodic_chores();
healthd_mode_ops->heartbeat();//主要的逻辑代码
healthd_mainloop();
KLOG_ERROR("Main loop terminated, exiting\n");
return 3;
}
通过healthd_mode_ops-heartbeat()调用
void healthd_mode_charger_heartbeat()
{
struct charger *charger = &charger_state;
int64_t now = curr_time_ms();
handle_input_state(charger, now);
handle_power_supply_state(charger, now);
/* do screen update last in case any of the above want to start
* screen transitions (animations, etc)
*/
update_screen_state(charger, now);
}
void healthd_mode_charger_heartbeat()
{
struct charger *charger = &charger_state;
int64_t now = curr_time_ms();
handle_input_state(charger, now);
handle_power_supply_state(charger, now);
/* do screen update last in case any of the above want to start
* screen transitions (animations, etc)
*/
update_screen_state(charger, now);
update_leds();//更新LED状态
}
char const *const WHITE_FILE = "/sys/class/leds/white/brightness";//定义白色灯的设备节点
void write_leds(int brightness)
{
char str[200];
sprintf(str, "%d", brightness);
write_str(WHITE_FILE, str);
}
void update_leds()
{
static int status = -1;
int cap;
if(batt_prop != NULL)
cap = batt_prop->batteryLevel;
else
return;
if (cap<=99) {
if (status != 0) {
write_leds(255);
status = 0;
}
} else if (cap == 100) {
if (status != 1) {
write_leds(0);
status = 1;
}
} else{
if (status != 2) {
write_leds(255);
status = 2;
LOGW("cap = %d\n",cap);
}
}
}
通过如上修改后,充电LED确实就亮了起来.
未完待续,有空继续深入分析...