android關機充電呼吸燈不亮
阿新 • • 發佈:2018-12-12
最近在適配新機型的過程中遇到一個問題,關機後充電呼吸燈不亮.
剛開始遇到這個問題時,一時束手無策,因為對這關機充電的流程根本不清楚.最後查閱資料和同事交流後發現關鍵充電的程式碼在/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確實就亮了起來.
未完待續,有空繼續深入分析...