recovery 升级过程LED灯闪烁

Android设备在进入recovery升级的过程,我们在屏幕上面可以看到升级的机器人动画,以及升级的进度显示。这仅限于有屏幕的设备,比如平板PAD,电视TV等,对与没有屏幕的盒子BOX,那么在不接入输出设备的时候,升级过程无法可视化的显示,所以就有了这个需求,在升级过程,通过控制面板LED等的闪烁,来告知用户,正在升级,升级完成等状态。

 

我们添加这个功能,需要分两个步骤:

 

    第一,控制LED的闪烁,这个需要kernel提供方法或者接口,我们掉用kernel提供的API,或者控制某个节点(/sys/class/leds/xxxx/xxxx)来控制灯的闪烁,这个每个平台的硬件配置不一样,控制ledgpio也不一样,所以首先要找到控制led灯的方法。

 

    第二,我们在recovery.cpp中,当需要升级的时候,在升级开始之前,创建一个线程,在线程里,按照第一步的方法,循环点亮LED等,在升级完成之后,终止线程即可。如果升级成功,则LED等常亮,若升级失败,则LED熄灭。即可通过LED的状态,判断升级过程,升级结果等。

 

参考流程:bootable/recovery/recovery.cpp

 

//LED控制实现
int set_led_status(int status){
    //LED 控制方法实现
}

//LED 控制线程
void* LED_thread(void *cookie){
    int flag = 0;
    for(;;){
        if(strcmp(cookie,"over")==0) {
            break;
        }

        if(flag == 0) {
            set_led_status(1);
            flag = 1;
        } else {
            set_led_status(0);
            flag = 0;
        }
        usleep(500000);
    }
    return NULL;
}


int main(int argc, char **argv) {
    if (update_package != NULL) {
        //创建LED线程控制线程
        //pthread_create(&ntid, NULL, LED_thread, (void *)message);
        status = install_package(update_package, &wipe_cache, TEMPORARY_INSTALL_FILE, true);
        if (status == INSTALL_SUCCESS && wipe_cache) {
            if (erase_volume("/cache")) {
                LOGE("Cache wipe (requested by package) failed.");
            }
        }
        //终止LED线程
        ..........
        ..........
    }
    ..........
    ..........
}
posted @ 2019-01-30 17:39  leo21sun  阅读(532)  评论(0编辑  收藏  举报