一、Recovery升级概述
在嵌入式Linux系统开发中,对终端设备升级的方式有很多种,主要包括:1,SD卡或U盘启动烧写;2,OTA(空间下载技术)升级;3,远程在线烧录;4,文件拷贝的方式升级。本文主要介绍的是OTA技术升级时下载升级包到设备端后,再采用的Recovery模式对指定的分区进行烧写的升级流程。
Recovery升级流程图
根据上面Recovery升级流程图可以看出,实现调用升级功能的三个关键应用程序为:
RecoverySystem程序:作用为启动进入Recovery模式,并检查是否需要烧写Recovery.img镜像。
recovery程序:recovery模式的核心程序。
rkupdate程序:作用为解析update.img固件中各个分区数据,并执行对各分区烧写升级关键程序。
二、升级前准备
编译rootfs.img主文件系统镜像:
1,在根目录执行 source envsetup.sh,选择对应平台的编译配置(如:rockchip_rk3308_release);
2,执行make menuconfig,打开recoverySystem的支持;
recoverySystem源码位于:external/recoverySystem/
3,编译
执行make recoverySystem-rebuild,然后执行./build.sh rootfs 编译出rootfs主文件系统。
编译recovery.img镜像:
1,执行source envsetup.sh,选择recovery对应的平台编译配置(如:rockchip_rk3308_recovery);
2,执行make menuconfig,打开recoverySystem的支持;
recovery源码位于:external/recovery/
rkupdate源码位于:external/rkupdate/
3,编译
执行make recovery-rebuild和 make rkupdate-rebuild,然后执行./build.sh recovery编译出recovery.img镜像。
制作update.img升级包镜像
1,修改tools/linux/Linux_Pack_Firmware/rockdev/package-file
# vim tools/linux/Linux_Pack_Firmware/rockdev/package-file
根据需要升级分区的配置,修改package-file文件。
2,执行./mkfirmware.sh,会将生成的固件拷贝到reckdev目录
3,执行./build.sh updateimg,该命令执行会将update.img升级包放在reckdev目录下。
三、Recovery升级过程
1,将update.img通过http上传到嵌入式板子上,需要放到/userdata目录或/mnt/sdcard目录 或/udisk目录,否则无法正常识别到update.img。
2,执行recoverySystem ota /userdata/update.img;
3,在进入recovery模式前,会解析update.img,检查是否包含recovery.img镜像,包含则先烧录recovery.img。
4,写入misc分区升级命令,并重启系统,设备会进入recovery模式。
5,进入recovery模式,对misc命令进行解析,如果为升级,则执行rkupdate升级程序,对指定分区进行烧写。
6,升级成功,清除misc命令并重启进入到normal系统。
解析misc过程
rkupdte程序进行固件烧写
注意事项:
1,进行打包update.img时,需要先修改package-file文件,打开需要升级的分区,屏蔽掉不需要升级的分区,可以减小update.img的大小;
2,为避免升级recovery.img过程中掉电导致升级无法进行的情况,因此将对recovery的升级放在主系统模式,而不是recovery模式下;
3,如果需要将升级包放在/userdata目录下,请不要在package-file中打开userdata分区,不能在/userdata下升级包含userdata.img镜像的升级包,以免在烧写userdata过程中会损坏update.img镜像。
4,对misc.img有以下几个RK准备的镜像
常用的为blank-misc.img和wipe_all-misc.img
其中blank-misc.img为空白的misc分区文件,wipe_all-misc.img为格式化用户分区使用的misc分区文件。
如需定制化修改可以查看external/recovery/recovery.c文件。