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