跳到主要内容

Rockchip Linux updateEngine升级方案介绍

:::info 文档信息

文档标识:RK-KF-YF-348 · 发布版本:V1.1.0 · 发布日期:2021-02-18 · 页数:19 · 语言:中文

原始文档:Rockchip_Developer_Guide_Linux_Upgrade_CN.pdf

:::

章节大纲​

  • Rockchip Linux updateEngine升级方案介绍(P1)
    • 简介以及代码(P4)
      • 简介(P4)
      • 代码(P4)
    • Recovery 模式(P4)
      • 概述(P4)
      • 配置和编译(P5)
      • OTA升级(P6)
      • 日志的查看(P7)
    • Linux A/B 模式(P7)
      • 概述(P7)
      • 引导流程以及数据格式(P8)
        • 数据格式及存储(P8)
        • 引导流程(P9)
        • 引导流程图(P9)
      • 编译配置(P10)
        • uboot(P10)
        • Buildroot(P11)
        • 分区表(P11)
        • 固件输出(P11)
      • OTA升级(P13)
      • 分区引导设置(P13)
        • 可引导设置(P13)
        • 升级分区设置(P14)
    • SD 卡制作启动盘升级(P14)
      • 制作SD卡启动盘(P14)
      • Recovery系统模式的SD卡启动盘制作说明(P15)
      • AB系统模式的SD卡启动盘制作说明(P15)
    • 恢复出厂设置(P16)
    • 升级程序详细说明(P16)
      • 参数说明(P16)
      • 自定义分区升级(P18)
    • 附录(P19)
      • 固件打包工具(P19)
        • windows 工具(P19)
        • linux工具(P19)
      • Misc 分区说明(P19)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. 简介以及代码​

1.1 简介​

Rockchip Linux 平台支持两种启动方案,Recovery 模式和Linux A/B 模式:

  1. Recovery 模式,设备上有一个单独的分区(recovery)用于升级操作。2. Linux A/B 模式,设备上有两套固件,可切换使用。

这两种启动模式各有优缺点,用户根据需求选择使用。

1.2 代码​

Rockchip Linux 平台有两套升级方案代码。

升级方案代码路径是否支持 Recovery 启动模式 升级是否支 持A/B 启动模 式升级简介
updateEngineexternal/recovery/update engine _ external/recovery支持支持RV1126/RV1109平 台使用
rkupdateexternal/rkupdate支持不支持其它平台使用,本 文档不作介绍

2. Recovery 模式​

2.1 概述​

Recovery 模式是在设备上多一个Recovery分区,该分区由kernel+resource+ramdisk 组成,主要用于升级操作。u-boot会根据misc分区(详见misc 分区章节)存放的字段来判断将要引导的系统是Normal 系统还是Recovery 系统。由于系统的独立性,所以Recovery模式能保证升级的完整性,即升级过程被中断,如异常掉电,升级仍然能继续执行。

优点:

  1. 能保证升级的完整性

缺点:

  1. 系统多了一个分区,该分区仅用于升级2. 升级过程必须重启进入recovery模式,不能在Normal系统直接进行升级

分区简介:

分区名镜像名简介
loaderMiniLoaderAll.bin一级loader
u-bootuboot.img二级loader
trusttrust.img安全环境,如OP-TEE、ATF (有些平台上会把trust和uboot合并)
miscmisc.img引导参数分区
recoveryrecovery.imgkernel+dtb+ramdisk 组成的根文件系统
bootboot.imgkernel+dtb
rootfsrootfs.img根文件系统,只读
oemoem.img厂商预制,可读写
userdatauserdata.img用于数据,可读写

2.2 配置和编译​

Buildroot:recovery 配置文件选择如下(make menuconfig)

BR2_PACKAGE_RECOVERY=y #开启升级相关功能

BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE``=``y ``#使用新升级程序,不配置则默认使用原有升级流程

BR2_PACKAGE_RECOVERY_RECOVERYBIN=y #开启recovery bin 文件
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
BR2_PACKAGE_RECOVERY_NO_UI=y # 关掉UI

Buildroot:rootfs 配置文件选择如下(make menuconfig)

BR2_PACKAGE_RECOVERY=y #开启升级相关功能
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y #使用新升级程序
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
BR2_PACKAGE_RECOVERY_NO_UI=y # 关掉UI

带屏与不带屏

目前只有RK3308使用不带屏的recovery,如有其它要让recovery不显示界面,在文件

buildroot/package/rockchip/recovery/recovery.mk做如下配置即可:

TARGET_MAKE_ENV += RecoveryNoUi=true

SDK默认会开启以上配置,用户无需再次配置。源码目录位于external/recovery/,若有进行相关修改,则按照如下进行编译:

1. source envsetup.sh

2``. 选择某一个平台的rootfs配置

3. make recovery-dirclean
4. source envsetup.sh

5``. 选择某一平台的recovery配置

6. make recovery-dirclean
7. ./build.sh

8``. 重新烧写固件

如果SDK版本比较新,可以尝试如下编译:

./build.sh external/recovery
./build.sh

# 重新烧写固件

2.3 OTA升级​

升级支持网络下载和本地升级,且可指定要升级的分区,在normal系统运行如下命令:

网络升级:

# updateEngine --misc=update --image_url=固件地址 --partition=0x3FFC00 --
version_url=版本文件地址 --savepath=/userdata/update.img --reboot
updateEngine --image_url=http://172.16.21.110:8080/recovery/update.img \
--misc=update --savepath=/userdata/update.img --reboot &

本地升级:

updateEngine --image_url=/userdata/update.img --misc=update \
--savepath=/userdata/update.img --reboot &

流程介绍:

  1. 固件版本比较(--version_url) 2. 下载固件(--image_url),并保存到本地(--savepath) 3. 升级recovery 分区4. 重启(--reboot) 5. 进入recovery模式,升级指定的分区(--partition) 6. 升级成功,重启进入normal系统

可缺省参数:

  1. --version_url:远程地址或本地地址,没有设置该参数,则不会进行版本比较2. --savepath:固件保存地址,缺省时为/tmp/update.img,建议传入/userdata/update.img 3. --partition:设置将要升级的分区,建议使用0x3FFC00,不支持升级parameter 和loader分区。详见 参数说明章节。4. --reboot:升级recovery 完后,重启进入recovery模式

2.4 日志的查看​

  1. 串口日志查看

buildroot/output/rockchip_***/target 目录下

touch .rkdebug

创建这个隐藏文件,可将 recovery 模式中升级的 log 在串口中打印出来。

  1. 通过查看 userdata/recovery/Log 文件查看

升级之后,在设备 userdata/recovery 目录中查看 log 文件。

cat userdata/recovery/Log

3. Linux A/B 模式​

3.1 概述​

Linux A/B,即准备两份独立的系统固件,分别存放在 flash 上,系统可以从其中一个 slot 启动,如果当前 slot 启动失败,可以从另外一个 slot 启动,在Normal模式下直接升级系统,无需进入系统升级模式,只需重启系统即可进入升级过的系统。

Linux A/B 由于有两个引导 slot,所以具有以下优点:

  1. 升级无需重启进入升级模式,即机器可以在当前系统上直接进行升级。2. 防止由于升级失败导致机器变砖,如果升级失败,机器可以回到当前版本。3. 当前系统如果由于一些误操作被破坏掉,系统会自动切换到另外一个 slot 上。

缺点:

  1. Linux A/B 有两个 slot,所以会增加 flash 上系统固件的占用率。

分区:

由于 miniloader,trust,uboot,机器上原有已经进行了多备份,所以目前这几个分区暂不支持双分区方案,只对 boot 和 system 进行了双分区。分区表如下:

分区名镜像名简介
loaderMiniloader.bin一级loader,机器备份4份
uboot a _uboot.img二级loader,机器备份2份,可修改u-boot/make.sh来修改备份份数
uboot b _uboot.imguboot a的备份分区 _
trusttrust.img安全相关,机器备份2份,可修改u-boot/make.sh来修改备份份数 (有些平台上会把trust和uboot合并)
miscmisc.img引导参数分区
boot a _boot.imgkernel+dtb,引导system a _
boot b _boot.imgkernel+dtb,引导system b _
system a _rootfs.img根文件系统
system b _rootfs.img根文件系统
oemoem.img厂商预制,可读写
userdatauserdata.img用于数据,可读写,无备份

3.2 引导流程以及数据格式​

3.2.1 数据格式及存储​

存储位置为 misc 分区偏移 2K 位置,AvbABSlotData 和 AvbABData 数据结构如下:

AvbABSlotData:存储 slot_a 和 slot_b

数据名称数据作用
unsigned char priority分区优先级,0~15,0 为不可自动,15 为最高优先级
unsigned char tries remaining _尝试启动次数,最高为 7 次,可修改
unsigned char successful boot _0:不可启动,1:可启动
unsigned char is update:1 _0:升级失败,1:升级成功,后 7 位为保留数据

AvbABData:slot_a 和 slot_b 的引导信息

数据名称数据作用
unsigned char magic[AVB AB MAGIC LEN] _ _ _结构体头部信息:\0AB0
unsigned char version major _版本信息
unsigned char version minor _版本信息
unsigned char reserved1[2]保留数据
AvbABSlotData slots[2]分区引导信息
unsigned char last boot _上一次成功启动的分区:0->slot a,1->slot b _ _
unsigned char reserved2[11]保留数据
unsigned char crc32Crc 数据校验

3.2.2 引导流程​

根据上层 bootcontrol 程序的设置方式,可分为两种引导方式 successful_boot 和 reset retry。 两种模式的对比如下:

模式优点缺点成功启动设置 的数据(A启 动)升级时设置 的数据(A 启动,B升 级)
Successful boot只要正常启动 系统,不会回 退到旧版本固 件设备长时间工作后,如果 存储某些颗粒异常,会导 致系统一直重启tries remaining=0 _ successful boot=1 _ last boot=0 _A:priority=14 B:priority=15
Reset retry始终保持 retry 机制,可以应 对存储异常问 题1.机器会回到旧的版本 上,可能出现版本不可控 问题 2.如果因为用户误操作, retry尝试次数过了,会误 判为当前分区为可启动tries remaining=7 _ last boot=0 _A:priority=14 B:priority=15

3.2.3 引导流程图​

3.3 编译配置​

3.3.1 uboot​

defconfig 增加如下配置,如 rk3308 64bit:u-boot/configs/rk3308_defconfig

CONFIG_AVB_LIBAVB=y
CONFIG_AVB_LIBAVB_AB=y
CONFIG_AVB_LIBAVB_ATX=y
CONFIG_AVB_LIBAVB_USER=y
CONFIG_RK_AVB_LIBAVB_USER=y
CONFIG_ANDROID_AB=y

3.3.2 Buildroot​

BR2_PACKAGE_RECOVERY=y #开启升级功能
BR2_PACKAGE_RECOVERY_BOOTCONTROL=y #开启引导控制脚本
BR2_PACKAGE_RECOVERY_RETRY=y #引导方式为retry模式,不配置则默认为
successful_boot模式
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y #使用新升级程序
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
BR2_PACKAGE_RECOVERY_NO_UI=y # 关掉UI

注意:设置完成之后,须进行重新编译,如下:

make recovery-dirclean
make recovery
./build.sh

如果SDK版本比较新,可以尝试如下编译:

./build.sh external/recovery
./build.sh

# 重新烧写固件

3.3.3 分区表​

相应的 BoardConfig.mk,设置 parameter 分区表,如下:

#选择了 device/rockchip/rk3308/parameter-ab-64bit.txt 文件
# parameter for GPT table
export RK_PARAMETER=parameter-ab-64bit.txt

64bit:参考/device/rockchip/rk3308/parameter-ab-64bit.txt

32bit:参考/device/rockchip/rk3308/parameter-ab-32bit.txt

3.3.4 固件输出​

选择相应的板级配置(如BoardConfig***-ab.mk)。如果要使用SD卡启动盘升级AB系统模式,方式如下:

# enable build update_sdcard.img
export RK_UPDATE_SDCARD_ENABLE_FOR_AB=true

设置完成之后,运行

./build.sh

即可生成如下固件:

tree rockdev/
rockdev/
├── boot.img
├── MiniLoaderAll.bin
├── misc.img
├── oem.img
├── parameter.txt
├── rootfs.img
├── uboot.img
├── update_ab.img
├── update_sdcard.img
├── update_ota.img
└── userdata.img

升级固件

rockdev 和 IMAGE 目录下,都会有 update_ota.img,用于 OTA 升级,该 IMAGE 包,包含boot.img 和

rootfs.img。可根据实际需求修改 tools/linux/Linux_Pack_Firmware/rockdev/rv1126_rv1109-

package-file-2-ota 文件。如下图:

# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
uboot_a Image/uboot.img
boot_a Image/boot.img
system_a Image/rootfs.img
oem Image/oem.img

烧写固件

rockdev 和 IMAGE 目录下,都会生成 update_ab.img,该固件用于烧写。根据需求修改该文件

tools/linux/Linux_Pack_Firmware/rockdev/rv1126_rv1109-package-file-2-ab 文件。如下图:
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
misc Image/misc.img
uboot_a Image/uboot.img
uboot_b Image/uboot.img
boot_a Image/boot.img
boot_b Image/boot.img
system_a Image/rootfs.img
system_b Image/rootfs.img
oem Image/oem.img

3.4 OTA升级​

网络升级:

# updateEngine --update --image_url=固件地址 --partition=0x3FFC00 --version_url=版

本文件地址 --savepath=保存的固件地址 --reboot

updateEngine --image_url=http://172.16.21.110:8080/linuxab/update_ota.img --
update --reboot

本地升级:

# updateEngine --update --image_url=固件地址(update_ab.img 或 update_ota.img) --
partition=0x3FFC00 --version_url=版本文件地址 --savepath=保存的固件地址 --reboot
updateEngine --image_url=/userdata/update_ota.img --update --reboot

流程介绍:

  1. 固件版本比较2. 下载固件(--image_url),并保存到本地(--savepath) 3. 升级指定的分区(--partition) 4. 设置升级分区为将要引导分区5. 重启6. 尝试引导升级的分区

可缺省参数:

  1. --partition:设置将要升级的分区 ,Linux A/B模式下,建议只升级uboot_a/uboot_b、boot_a/boot_b和system_a/system_b,即0xFC00,不支持升级parameter 和loader分区。详见参数说明2. --version:没有设置该参数,则不会进行版本比较3. --savepath:固件保存地址,缺省时为/tmp/update.img,建议使用默认值4. --reboot:升级完后重启

3.5 分区引导设置​

3.5.1 可引导设置​

通过misc设置当前分区为可引导分区,要在 system 成功引导之后执行,标记系统成功启动,参考如下脚本

$external/recovery/update_engine$ cat S99_bootcontrol
case "$1" in
start)
/usr/bin/updateEngine --misc=now
;;
stop)
printf "stop finished\n"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0

3.5.2 升级分区设置​

updateEngine --misc=other --reboot

流程介绍:

  1. 往misc 偏移4K位置写入一个命令,该命令为引导另一个分区的命令2. 重启

可缺省参数:

  1. --reboot,缺省则机器不会立即重启,在下一次重启才会生效

注意:updateEngine程序在OTA升级结束之后会自动设置,无需重复设置。

4. SD 卡制作启动盘升级​

SD卡启动盘升级指将通过SDDiskTool 制卡工具制作的SD卡插入到机器中进行升级,详细描述 SD 卡启动盘的制作及相关升级的问题。

4.1 制作SD卡启动盘​

如图所示,使用工程目录 tools\windows\SDDiskTool 中的 SD 卡启动盘升级制作工具制作 SD 卡启动盘。选择固件中选择打包好的 update.img 文件。

所有准备工作完成后,点击开始创建按钮,如果创建成功,会弹窗提示。

此时 SD 卡中根目录会存在两个文件,其中选择升级的固件 update.img,会被命名为 sdupdate.img.

所有准备工作做好后,设备中插入 SD 卡,并重新上电。

4.2 Recovery系统模式的SD卡启动盘制作说明​

Recovery系统模式的SD卡启动盘制作只要把update.img用SDDiskTool工具直接制作成sdupdate.img即可。

4.3 AB系统模式的SD卡启动盘制作说明​

SDK编译AB系统模式时, ./build.sh updateimg 命令会打包出3个update.img,如下:

update_ab.img: 包含完整的AB系统分区,可用于完整烧录update_ota.img: 只包含A slot分区系统或B slot分区系统update_sdcard.img: 只能用于制作AB系统模式SD卡启动盘

制作AB系统模式SD卡启动盘时,使用SDDiskTool工具加载update_sdcard.img,制作好SD卡启动盘后,再将update_ab.img或update_ota.img拷贝到SD卡启动盘上即可。

rksdfw.tag
sd_boot_config.config
sdupdate.img
update_ab.img # first priority
update_ota.img # second priority

5. 恢复出厂设置​

我们把可以读写的配置文件保存在 userdata 分区, 出厂固件会默认一些配置参数, 用户使用一段时间后会生成或修改配置文件,有时用户需要清除这些数据,我们就需要恢复到出厂配置。

SDK 实现:

功能键 RECOVERY + VOLUMEUP 触发恢复出厂配置,代码请参考:

buildroot/board/rockchip/rk3308/fs-overlay/etc/input-event-daemon.conf

board/rockchip/rk3308/fs-overlay/usr/sbin/factory_reset_cfg

updateEngine --misc=wipe_userdata --reboot

流程介绍:

  1. 往misc 分区偏移4k位置处写入格式命令2. 重启(--reboot) 3. S21mountall.sh 识别misc中有格式化命令4. 格式化userdata

可缺省参数:

  1. --reboot 如果没有传入该参数,则在机器下次重启后才会恢复出厂设置。

6. 升级程序详细说明​

6.1 参数说明​

updateEngine主要包含升级分区和写Misc配置功能,支持命令参数如下:

*** update_engine: Version V1.1.0 ***.
--misc=now Linux A/B mode: Setting the current partition to bootable.
--misc=other Linux A/B mode: Setting another partition to bootable.
--misc=update Recovery mode: Setting the partition to be upgraded.
--misc=wipe_userdata Format data partition.
--update Upgrade mode.
--partition=0x3FFC00 Set the partition to be upgraded.(NOTICE: OTA not support
upgrade loader and parameter)
0x3FFC00: 0011 1111 1111 1100 0000 0000.
uboot trust boot recovery rootfs oem
uboot_a uboot_b boot_a boot_b system_a system_b.
000000000000000000000000: reserved
100000000000000000000000: Upgrade loader
010000000000000000000000: Upgrade parameter
001000000000000000000000: Upgrade uboot
000100000000000000000000: Upgrade trust
000010000000000000000000: Upgrade boot
000001000000000000000000: Upgrade recovery
000000100000000000000000: Upgrade rootfs
000000010000000000000000: Upgrade oem
000000001000000000000000: Upgrade uboot_a
000000000100000000000000: Upgrade uboot_b
000000000010000000000000: Upgrade boot_a
000000000001000000000000: Upgrade boot_b
000000000000100000000000: Upgrade system_a
000000000000010000000000: Upgrade system_b
000000000000001000000000: Upgrade misc
000000000000000100000000: Upgrade userdata
--reboot Restart the machine at the end of the program.
--version_url=url The path to the file of version.
--image_url=url Path to upgrade firmware.
--savepath=url save the update.img to url.

--misc

now:供Linux A/B 模式使用,将当前分区设置为可引导分区。

注意:external/recovery/update_engine/S99_bootcontrol 脚本在开机最后阶段会运行该命令,将当前分区设置为可引导分区,需要开启

BR2_PACKAGE_RECOVERY_BOOTCONTROL=y

other:供Linux A/B 模式使用,将另外一个分区设置为升级完成分区,重启之后会尝试从另外一个分区引导。

注意:如果使用updateEngine升级,在升级结束之后,会自动设置,无需重复设置。

update:供Recovery模式使用,在normal系统升级recovery分区,在recovery 系统升级其余分区。

display:调试使用,显示misc分区的数据结构

--update

sdboot:走sdboot升级流程,即直接对flash操作,没有分区概念。

不带参数:主要供Linux A/B使用,在当前模式下,直接进行升级。

--partition=0x0000

设置将要升级的分区,如果缺省,默认值为0x3FFC00,升级uboot,trust,boot,recovery,rootfs,oem,uboot_a,uboot_b,boot_a,boot_b,system_a,system_b分区。高16位已经使用,低8位为保留位,可扩展使用。

1:升级,0:不升级

位 数2322212019181716151413121110987~0
分 区loaderparameteruboottrustbootrecoveryrootfsoemuboota _ubootb _boota _bootb _systema _systemb _miscuserdata保 留

--reboot updateEngine 运行成功之后,机器重启

--vsersion_url

如果有传入路径,升级之前会与/etc/version 文件中的 RK_VERSION= 版本值进行比较

本地路径:从固件中读取版本号

远程路径:从远程下载版本文件,远程版本文件格式必须跟/etc/version 一致

--image_url

设置升级固件的路径,可为远程或本地路径。

--savepath

设置保存固件的位置,如果没有传入且升级的固件路径为远程地址,则默认值为/tmp/update.img

6.2 自定义分区升级​

typedef struct {
char name[32]; //固件名称
bool need_update; //需要升级
bool is_ab; //是否为A/B双分区
long long size; //固件长度
long long offset; //在update.img 中的偏移位置
long long flash_offset; //flash上的偏移位置
char dest_path[100]; //目标路径
update_func cmd; //升级函数
}UPDATE_CMD, *PUPDATE_CMD;

如要升级自定义分区,factory,则再下面添加一行, 且--partition 需要对应设置位值为1

{"factory", false, false, 0, 0, 0, "", flash_normal},

external/recovery/update_engine/update.cpp

UPDATE_CMD update_cmd[] = {
{"bootloader" , false , false , 0 , 0 , 0 , "" , flash_bootloader} ,
{"parameter" , false , false , 0 , 0 , 0 , "" , flash_parameter} ,
{"uboot" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"trust" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"boot" , false , true , 0 , 0 , 0 , "" , flash_normal} ,
{"recovery" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"rootfs" , false , true , 0 , 0 , 0 , "" , flash_normal} ,
{"oem" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"uboot_a" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"uboot_b" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"boot_a" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"boot_b" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"system_a" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"system_b" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"misc" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
{"userdata" , false , false , 0 , 0 , 0 , "" , flash_normal} ,
};

7. 附录​

7.1 固件打包工具​

7.1.1 windows 工具​

Windows 打包工具在 tools\windows\AndroidTool\rockdev 目录下。先修改 package-file 文件将需要升级的image 加入打包。注意路径是这里的路径是相对路径。 mkupdate.bat 批处理程序会把tools\windows\AndroidTool\rockdev\Image 链接到根目录下的 rockdev 目录。所以请保证 rockdev 下的相应image 存在。接着执行 mkupdate.bat。mkupdate.bat 脚本会把根目录下 rockdev 中的相应的 image 打包成update.img 存放在根目录下 rockdev。

7.1.2 linux工具​

Linux 打包工具在 tools/linux/Linux_Pack_Firmware/rockdev 目录下。先修改 package-file 文件将需要升级的 image 加入打包。注意路径是这里的路径是相对路径。 tools/linux/Linux_Pack_Firmware/rockdev/Image会链接到根目录下rockdev 目录。所以请保证 rockdev 下的相应 image 存在。接着执行mkupdate.sh。mkupdate.sh脚本会把根目录下rockdev中的相应的image打包成update.img 存放在根目录下 rockdev。

7.2 Misc 分区说明​

Misc分区是一个没有文件系统的分区,用于存放一些引导配置参数,现有结构如下,详见external/recovery/bootloader.h、external/recovery/update_engine/rkbootloader.cpp

偏移地址作用
2kLinux A/B 分区引导信息
4k格式化命令
16kRecovery 系统与Normal系统通信