1. 程式人生 > >android關機充電呼吸燈不亮

android關機充電呼吸燈不亮

最近在適配新機型的過程中遇到一個問題,關機後充電呼吸燈不亮.

剛開始遇到這個問題時,一時束手無策,因為對這關機充電的流程根本不清楚.最後查閱資料和同事交流後發現關鍵充電的程式碼在/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);
}


在這裡也沒有看見相關LED的操作.那我們是否可以加一些程式碼來點亮LED呢?當然是可以的,做如下修改

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確實就亮了起來.

未完待續,有空繼續深入分析...