rockchip RV1126升级调试记录

RK 分区和启动流程
    分区
        loader:        MiniLoaderAll.bin, 其实就是uboot中的spl, MiniLoaderAll就是RK自己开发的spl,负责加载uboot和trust
        Parameter:        parameter.txt, 参数文件,描述分区设置和地址
        uboot:             uboot.img, uboot引导程序
        trust:            trust.img, 证书签名,信赖文件,和安卓的类似
        misc:            存放升级标志
        rootfs:            根文件系统
        boot:            Linux系统内核+dtb
        recovery:        kernel+dtb+ramdisk 组成的根文件系统
        oem:            用户程序存放分区
        userdata:        用户文件,数据,配置存放区
        
        
    启动流程:
        第一阶段:
            上电-->片内bootrom启动-->MiniLoaderAll(RK闭源SPL)-->parameter.txt-->trust.img
        第二阶段:
            uboot-->查看misc分区内容决定进入recovery分区或者正常系统启动
            -->进入recovery:recovery模式中会读取misc的recovery内容,然后进行升级或者恢复出厂设置,或擦除用户分区数据
            -->进入正常系统kernel
            -->挂载根文件系统
        
        
        U盘挂载路径:/udisk
        SD卡挂载路径: /mnt/sdcard/ 或 /sdcard
        flash挂载路径:/userdata

    升级流程:
        --> 带屏设备需要配置buildroot/package/rockchip/recovery/recovery.mk,修改后操作如下:
            1. source envsetup.sh rockchip_xxxx_recovery (xxxx 为具体芯片平台)
            2. make menuconfig ,打开配置No UI for recovery。
            3. make recovery-dirclean && make recovery
            4. ./build.sh recovery
            5. ./mkimage.sh
            6. 烧录 rockdev/recovery.img

        --> 制作并烧写recovery.img(我们应该在出厂的时候烧写好) 
        --> 修改tools/linux/Linux_Pack_Firmware/rockdev/package-file 文件,修改需要升级的分区
        --> 制作update.img : ./build.sh updateimg
        --> 将update.img 放在SD卡或者U盘的根目录,或者放在设备的/userdata目录下
        --> 系统正常运行情况下,运行 update ota /xxx/update.img 进行升级
        --> 升级成功后会rebott到正常的normal系统

升级编译及操作流程:
    1、选择一个平台: source envsetup.sh,选择90. rockchip_rv1126_rv1109
    2、配置:make menuconfig, 配置如下:
            Target packages --->
            [*] Rockchip BSP packages --->
                [*] Rockchip OTA update for linux
    3、./build.sh recovery, 会生成文件 buildroot/output/rockchip_rkxxxx_recovery/images/recovery.img 
    4、./mkfirmware.sh, 会将生成的固件拷贝至 rockdev/目录下
    5、修改 tools/linux/Linux_Pack_Firmware/rockdev/package-file 根据需要修改相关分区
    6、./build.sh updateimg, 会将package-file指定的分区镜像打包生成update.img 升级固件,放在 rockdev/目录下
    6、把update.img 拷贝到/mnt/sdcard(sd卡挂载路径), /udisk(U盘挂载路径), /userdata(flash挂载路径) 目录下
    7、在正常系统中执行: update ota /xxx/update.img,无法升级
    8、执行: updateEngine --image_url=/xxx/update.img --misc=update(Recovery模式升级) --savepath=/xxx/update.img \
            --misc=wipe_userdata(格式化userdata分区) --update(Upgrade 模式) --reboot

        可以成功升级,需要比较两种方式有何差别,为何使用update 命令无法升级???
            --> update方式有调用ui显示相关,最终是调用rkupdate或者updateEngine命令进行升级
        
        具体命令例子:updateEngine --image_url=/mnt/sdcard/update.img --misc=update --savepath=/mnt/sdcard/update.img --reboot

    9、经过比较,查看源码,调试发现:
        update命令内部也是调用updateEngine, 但是传参是 --pipefd=xx --image_url=xxx --update --partition=xxx(hex),
        使用updateEngine --help 命令查看到 --partition=0x3FFC00,设置这个值能正常升级,如果是使用update设置的值则无法升级
        
        设置将要升级的分区,如果缺省,默认值为0x3FFC00,升级uboot,trust,boot,recovery,rootfs,
        oem,uboot_a,uboot_b,boot_a,boot_b,system_a,system_b分区。高16位已经使用,低8位为保留
        位,可扩展使用。

恢复:
    直接运行:update
    

你可能感兴趣的:(嵌入式Linux,linux)