• 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线程
            ..........
            ..........
        }
        ..........
        ..........
    }
  • 相关阅读:
    逻辑学的基本运算
    第一性原理:First principle thinking是什么?
    人类认识的基本技能
    编程的本质:简化+抽象+再现
    区块链
    信号、系统、传递、树
    MVVM
    数据驱动 状态驱动
    事件与状态机 事件驱动编程
    数据一致性举例:登录系统
  • 原文地址:https://www.cnblogs.com/codeking100/p/10339125.html
Copyright © 2020-2023  润新知