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确实就亮了起来.

未完待续,有空继续深入分析...

猜你喜欢

转载自blog.csdn.net/aa787282301/article/details/61417688