Rockchip Linux Recovery升级开发指南
:::info 文档信息
文档标识:RK-KF-YF-353 · 发布版本:V1.2.1 · 发布日期:2021-07-30 · 页数:20 · 语言:中文
原始文档:Rockchip_Developer_Guide_Linux_Recovery_CN.pdf
:::
章节大纲
- Rockchip Linux Recovery升级开发指南(P1)
- OTA升级(P4)
- 概述(P4)
- 编译(P4)
- 升级流程(P5)
- 升级固件准备(P5)
- 升级过程(P5)
- 恢复出厂模式(P6)
- 注意事项(P7)
- 运行调试(P7)
- Recovery 模式中log的查看(P7)
- 带屏设备与不带屏设备(P8)
- 带屏设备的旋转与显示(P9)
- Debian 与 Ubuntu 系统的升级(P9)
- SD 卡制作启动盘升级(P10)
- 附录(P11)
- misc 分区说明(P12)
- misc.img 选择(P13)
- Recovery 不同场景下的使用(P13)
- 第一次开机(P13)
- 恢复出厂设置(P14)
- 升级(P14)
- 常见问题汇总(P15)
- “cannot find/open a drm device ”(P15)
- misc 分区固件修改默认命令(P16)
- userdata 分区设置为 vfat 文件系统(P17)
- userdata (或/data )分区不格式化(P18)
- SD卡升级问题(P19)
- misc 分区说明(P12)
- OTA升级(P4)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. OTA升级
1.1 概述
OTA(Over-the-Air)即空间下载技术。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络,例如 WIFI、3G/4G 自动下载 OTA 升级包、自动升级,也支持通过下载 OTA 升级包到 SD 卡/U 盘升级,OTA 的升级包非常的小,一般几 MB 到十几 MB。
本文主要介绍了使用 OTA 技术升级时,本地升级程序 recovery 执行升级的流程及技术细节,以便用户在开发过程中了解升级的过程及注意事项。
1.2 编译
rootfs 主系统
rootfs 需要打开update 的支持,configs 文件配置 BR2_PACKAGE_UPDATE=y。
| 1 source envsetup.sh 2 #choose a combo number to build rootfs according to platform chip 3 make menuconfig | |
|---|---|
| 1 2 3 | source envsetup.sh #choose a combo number to build rootfs according to platform chip make menuconfig |
具体配置如下:
| 1 Target packages ---> 2 [*] Rockchip BSP packages ---> 3 [*] Rockchip OTA update for linux | |
|---|---|
| 1 2 3 | Target packages ---> [*] Rockchip BSP packages ---> [*] Rockchip OTA update for linux |
Recovery
buildroot/configs/rockchip/recovery.config 中已经将不同平台的recovery配置抽取出来了。
只需系统根目录下执行:
| 1 ./build.sh recovery | |
|---|---|
| 1 | ./build.sh recovery |
成功后,会生成文件 buildroot/output/rockchip_rkxxxx_recovery/images/recovery.img 。
rkxxxx为具体某一芯片名称。
执行:
| 1 ./mkfirmware.sh | |
|---|---|
| 1 | ./mkfirmware.sh |
会将生成的固件拷贝至 rockdev/目录下。
与 recovery 相关的主要源码路径:
external/recovery/ :主要生成 recovery 二进制 bin 程序,recovery 模式下的关键程序。external/rkupdate/ :主要生成 rkupdate 二进制 bin 程序,解析 update.img 固件中各个分区数据,并执行对各分区执行升级的关键程序,该程序被recovery 二进制bin程序内部调用。
若有修改以上两个目录中的源码文件之后的编译方法:
1. source envsetup.sh
- 选择某一平台的 recovery 配置
3. make recovery-dirclean && make recovery
4. make rkupdate-dirclean && make rkupdate
5. ./build.sh recovery
6. ./mkfirmware.sh
- 烧写 recovery.img
1.3 升级流程
1.3.1 升级固件准备
修改 tools/linux/Linux_Pack_Firmware/rockdev/package-file ,根据需要升级的分区配置,修改
该文件。
根目录下执行命令:
| 1 ./build.sh updateimg | |
|---|---|
| 1 | ./build.sh updateimg |
命令执行成功后,会将package-file指定的分区镜像打包生成update.img 升级固件,放在 rockdev/目录下。使用该update.img 升级。
如果升级过程中遇到错误“Error!imageHead.uiTag !=0x57464B52”,该错误表明固件打包有错误,请按照上述操作,重新生成 update.img 重试。
1.3.2 升级过程
将升级固件 update.img 放在 SD 卡或 U 盘根目录或者设备的/userdata 目录下。
Normal 系统下执行升级程序 update ota /xxx/update.img ,设备将会进入 recovery 模式,并进行升级。
可使用的路径如下:
U 盘的挂载路径: /udisk
sdcard 的挂载路径: /mnt/sdcard/ 或/sdcard
flash 的挂载路径: /userdata/
升级成功后会 reboot 到正常的 normal 系统。升级流程图如下:
1.4 恢复出厂模式
我们把可以读写的配置文件保存在 userdata 分区,出厂固件会默认一些配置参数,用户使用一段时间后会生成或修改配置文件,有时用户需要清除这些数据,我们就需要恢复到出厂配置。直接运行 update后面不加任何参数或者加 factory/reset 参数均可进入 recovery 后恢复出厂配置。
1.5 注意事项
打包 update.img 固件时需要注意,升级固件不一定要全分区升级,可修改 package-file 文件,将不要升级的分区去掉,这样可以减少升级包(update.img )的大小。package-file 中 recovery.img 如果打包进去的话 ,不会在 Recovery 模式中升级,为了预防升级recovery.img过程中掉电导致后面其他分区无法正常升级的问题,该分区升级放在 normal 系统下升级,即,执行 update 命令时会先检测 update.img 升级包中是否有打包 recovery.img,若有则升级recovery 分区,再进入 Recovery 模式升级其他分区固件。misc 分区不建议打包进 update.img 中,即使有打包进去,也会在升级程序中加载判断到而忽略该分区,即使升级了 misc 分区,升级成功后 recovery 程序仍会清空 misc 分区中所有的命令及参数,从而导致达不到预想的结果。如果将 update.img 升级包放置在 flash 中的 userdata 分区,则需要保证 package-file 中括不包括userdata.img 被打包进去,原因是可能会导致文件系统的损坏,升级成功后可能使 oem或 userdata 分区mount不成功。若从SD卡或 U 盘升级时,可以打包 userdata.img,从而对userdata 分区进行升级。升级完成后会对 userdata 分区重新resize 操作。
2. 运行调试
2.1 Recovery 模式中log的查看
buildroot/output/rockchip_rkxxxx_recovery/target 目录下创建一个隐藏文件,
| 1 touch .rkdebug | |
|---|---|
| 1 | touch .rkdebug |
可将Recovery 模式中升级的 log 在串口中打印出来。
另外一种是通过查看 userdata/recovery/Log 文件升级之后,在设备 userdata/recovery 目录中查看 log 文件。
| 1 cat userdata/recovery/log | |
|---|---|
| 1 | cat userdata/recovery/log |
2.2 带屏设备与不带屏设备
Recovery 执行过程中如果失败,且提示如下 log 信息:
failed to read font: res=-1, fall back to the compiled-in font
cannot find/open a drm device: No such file or directory
从log 可知,找不到或者打不开一个 drm 设备,此时如果开发的是带屏的设备,需要接上显示屏,如果是开发不带屏的设备需要进行如下配置。
默认 SDK 代码 recovery 配置中为不带屏设备。
| 1 cd Path to SDK/buildroot/package/rockchip/recovery _ _ 2 3 vim recovery.mk | |
|---|---|
| 1 2 3 | cd Path to SDK/buildroot/package/rockchip/recovery _ _ vim recovery.mk |
打开 buildroot/package/rockchip/recovery 中的 recovery Makefile 文件如下图所示:
上图中,若配置了BR2_PACKAGE_RECOVERY_NO_UI,则定义RecoveryNoUi的宏定义为true。否则会链接显示相关的库。
| 1 ifeq ($(BR2 PACKAGE RECOVERY NO UI),y) _ _ _ _ 2 TARGET MAKE ENV += RecoveryNoUi=true _ _ 3 else 4 RECOVERY BUILD OPTS += -lz -lpng -ldrm _ _ 5 RECOVERY DEPENDENCIES += libzlib libpng libdrm _ 6 endif | |
|---|---|
| 1 2 3 4 5 6 | ifeq ($(BR2 PACKAGE RECOVERY NO UI),y) _ _ _ _ TARGET MAKE ENV += RecoveryNoUi=true _ _ else RECOVERY BUILD OPTS += -lz -lpng -ldrm _ _ RECOVERY DEPENDENCIES += libzlib libpng libdrm _ endif |
修改后的编译:
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
- 烧录 rockdev/recovery.img
2.2.1 带屏设备的旋转与显示
若需要将 Recovery 升级过程中显示的界面根据显示设备的方向做一些旋转操作,可按如下说明操作。
- 更新Recovery 代码到最新。2. 修改 minui/graphics.c 中 gr_init 函数调用的 gr_rotate 接口函数的参数。 旋转参数说明:ROTATION_NONE 默认不做旋转 ROTATION_RIGHT 顺时针旋转 90° ROTATION_DOWN 顺时针旋转 180° ROTATION_LEFT 顺时针旋转 270° 3. 重新编译 Recovery,生成 Recovery 分区固件,烧录。若需要调整 UI 显示的亮度,可修改 gr_color 接口中最后一个参数 alpha 透明度。最大值 255 为不透明,最小值0 表示全透明。
更换 Recovery 中 UI 显示的背景图片。可自行更换 external/recovery/res/images 目录下的图片文件,保持文件名不变。
2.3 Debian 与 Ubuntu 系统的升级
与 Buildroot recovery 升级一样,该Recovery OTA升级方案也支持 Debian 或 Ubuntu 系统下的升级。由于Recovery 模式下升级需要通过设备各个分区节点来识别并写入不同设备分区节点的固件数据,Buildroot系统是通过 udev 中的别名方式(by-name)来对设备分区节点做了通用的易识别的处理。Debian 或Ubuntu 系统中因为缺少这样的方式,导致了实际中不 Recovery 不能正常运行的情况,所以只需要将Debian 或 Ubuntu 系统中设备分区的节点也跟Buildroot 系统下可通过 by-name 别名方式标识出来,Recovery 即可正常工作。
具体修改方式如下:
buildroot/output/rockchip_rkxxxx/target/lib/udev/rules.d/61-partition-init.rules ,或
者 buildroot/output/rockchip_rkxxxx_recovery/target/lib/udev/rules.d/61-partition-
init.rules
拷贝到 Debian 或 Ubuntu 系统下相关的位置,如 rootfs/overlay-debug/lib/udev/rules.d/ 下。此处 rkxxxx 为具体某一 rk芯片平台(RK3308、RK3328、RK3399、RK3326 等)。修改的目的就是开机启动后可以将 Debian 系统或 Ubuntu 系统中各个分区节点形如 /dev/mmcblk0p0
、 /dev/mmcblk0p1 、 /dev/mmcblk0p2 、 /dev/mmcblk0p3 ... 修改为 /dev/block/by-
name/uboot 、 /dev/block/by-name/misc 、 /dev/block/by-name/boot 、 /dev/block/by-
若还是出现如下类似设备节点:
| 1 root@linaro-alip:~# ls /dev/block/ 2 179:0 179:3 179:5 179:7 179:96 7:0 7:3 7:6 3 179:1 179:32 179:6 179:8 1:0 7:1 7:4 7:7 4 179:2 179:4 179:64 179:9 254:0 7:2 7:5 | |
|---|---|
| 1 2 3 4 | root@linaro-alip:~# ls /dev/block/ 179:0 179:3 179:5 179:7 179:96 7:0 7:3 7:6 179:1 179:32 179:6 179:8 1:0 7:1 7:4 7:7 179:2 179:4 179:64 179:9 254:0 7:2 7:5 |
可尝试将 61-partition-init.rules放在 Debian 或 Ubuntu /etc/udev/rules.d/ 或 /lib/udev/rules.d/ 。
3. SD 卡制作启动盘升级
本章节主要为了解决使用 SD 卡启动,进行裸片升级的需求,详细描述 SD 卡启动盘的制作及相关升级的问题。
使用工程目录中 tools\windows\SDDiskTool 中的 SD 卡启动盘升级制作工具制作 SD卡启动盘。
选择固件中选择打包好的 update.img 文件。
所有准备工作完成后,点击开始创建按钮,如果创建成功,会弹窗提示。
此时 SD 卡中根目录会存在两个文件,其中选择升级的固件 update.img,会被命名为 sdupdate.img.
所有准备工作做好后,设备中插入 SD 卡,并重新上电。
Log 中如果出现下面内容,说明 SD 卡启动设备成功:
| 1 U-Boot 2017.09-g1bee468 (Oct 11 2018 - 16:53:06 +0800) V1.000 2 Model: USM-110 a102-1 3 Board:Advantech usm110 rk3288 Board,HW version:0 _ 4 DRAM: 2 GiB 5 Relocation Offset is: 7ff5a000 6 PMIC: RK808 7 vdd arm 1100000 uV _ 8 vdd gpu 1100000 uV _ 9 vcc io 3300000 uV _ 10 regulator(LDO REG2) init 3300000 uV _ 11 regulator(LDO REG3) init 1100000 uV _ 12 regulator(LDO REG4) init 1800000 uV _ 13 regulator(LDO REG5) init 3300000 uV _ 14 regulator(LDO REG6) init 1100000 uV _ 15 regulator(LDO REG7) init 1800000 uV _ 16 regulator(LDO REG8) init 1800000 uV _ 17 MMC: dwmmc@ff0c0000: 1, dwmmc@ff0f0000: 0 18 SF: Detected w25q32bv with page size 256 Bytes, erase size 4 KiB, total 4 MiB 19 *** Warning - bad CRC, using default environment 20 In: serial 21 Out: serial 22 Err: serial 23 switch to partitions #0, OK 24 mmc1 is current device 25 do rkimg test found IDB in SDcard _ _ 26 Boot from SDcard 27 enter Recovery mode! 28 SF: Detected w25q32bv with page size 256 Bytes, erase size 4 KiB, total 4 MiB 29 Skipped ethaddr assignment due to invalid,using default! 30 Net: No ethernet found. 31 Hit any key to stop autoboot: 0 32 ANDROID: reboot reason: "recovery" 33 FDT load addr 0x10f00000 size 263 KiB 34 Booting kernel at 0x3575c70 with fdt at 42cf470... | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | U-Boot 2017.09-g1bee468 (Oct 11 2018 - 16:53:06 +0800) V1.000 Model: USM-110 a102-1 Board:Advantech usm110 rk3288 Board,HW version:0 _ DRAM: 2 GiB Relocation Offset is: 7ff5a000 PMIC: RK808 vdd arm 1100000 uV _ vdd gpu 1100000 uV _ vcc io 3300000 uV _ regulator(LDO REG2) init 3300000 uV _ regulator(LDO REG3) init 1100000 uV _ regulator(LDO REG4) init 1800000 uV _ regulator(LDO REG5) init 3300000 uV _ regulator(LDO REG6) init 1100000 uV _ regulator(LDO REG7) init 1800000 uV _ regulator(LDO REG8) init 1800000 uV _ MMC: dwmmc@ff0c0000: 1, dwmmc@ff0f0000: 0 SF: Detected w25q32bv with page size 256 Bytes, erase size 4 KiB, total 4 MiB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial switch to partitions #0, OK mmc1 is current device do rkimg test found IDB in SDcard _ _ Boot from SDcard enter Recovery mode! SF: Detected w25q32bv with page size 256 Bytes, erase size 4 KiB, total 4 MiB Skipped ethaddr assignment due to invalid,using default! Net: No ethernet found. Hit any key to stop autoboot: 0 ANDROID: reboot reason: "recovery" FDT load addr 0x10f00000 size 263 KiB Booting kernel at 0x3575c70 with fdt at 42cf470... |
| 若串口 | |
| firmware update will from SDCARD. is sdcard update out _ _ sdupdate package = /mnt/sdcard/sdupdate.img _ Command: "/usr/bin/recovery" sdboot update will update from /mnt/sdcard/sdupdate.img start with main. | |
| 1 2 3 4 5 6 | firmware update will from SDCARD. is sdcard update out _ _ sdupdate package = /mnt/sdcard/sdupdate.img _ Command: "/usr/bin/recovery" sdboot update will update from /mnt/sdcard/sdupdate.img start with main. |
4. 附录
4.1 misc 分区说明
misc 其实是英文 miscellaneous 的前四个字母,杂项、混合体、大杂烩的意思。
misc 分区的概念来源于 Android 系统,Linux 系统中常用来作为系统升级时或者恢复出厂设置时使用。
misc 分区的读写:misc 分区在以下情况下会被读写。
- Uboot:设备加电启动时,首先启动 Uboot,在 Uboot 中会读取 misc 分区的内容。根据 misc分区中command 命令内容决定是进入正常系统还是 recovery 模式。
Command 为 boot-recovery,则进入 recovery 模式。
Command 为空,则进入正常系统。
- Recovery:在设备进入 recovery 模式中,可以读取 misc 分区中 recovery 部分的内容,从而执行不同的动作,或升级分区固件,或擦除用户分区数据,或其他操作等等。
misc 分区的结构及内容:
misc 分区的结构组成详见下图。
下面以 RK3308 平台使用的 misc 分区为例,使用 winhex 或 ultraEdit 等工具,以二进制形式打开misc.img文件,在距文件开始位置偏移 16K(16384 Byte)字节位置处开始,存放 BootLoader Msg结构体的内容。
Recovery 中支持的命令部分,可参考 external/recovery/recovery.c 中 OPTIONS 结构中内容。
4.1.1 misc.img 选择
SDK 根目录 device/rockchip/rockimg 目录下是经常使用的 misc.img 文件。生成固件的时候根据配置选择拷贝哪一个 misc.img 的文件。
| 1 . 2 ├ ── blank-misc.img #空白的 misc 分区文件 3 ├── pcba small misc.img #不常用 _ _ 4 ├── pcba whole misc.img #不常用 _ _ 5 └── wipe all-misc.img #格式化用户分区使用的 misc 分区文件 _ | |
|---|---|
| 1 2 3 4 5 | . ├ ── blank-misc.img #空白的 misc 分区文件 ├── pcba small misc.img #不常用 _ _ ├── pcba whole misc.img #不常用 _ _ └── wipe all-misc.img #格式化用户分区使用的 misc 分区文件 _ |
常用的两种 misc.img 文件是 blank-misc.img 与 wipe_all-misc.img。
打开具体芯片平台的 BoardConfig.mk 文件,可配置 misc.img 的具体使用。
cd device/rockchip/rkxxxx
vim BoardConfig.mk
从上图中可看到,默认使用 wipe_all-misc.img 作为 misc 分区的固件,使用该 misc固件,烧写后会格式化用户(/userdata 或/data )分区与客制(/oem)分区的数据。若希望开机不进入 recovery 模式,而进入正常系统,可以修改 BoardConfig.mk 这里 misc image 的具体文件为 blank-misc.img 。然后重新编译,生成新的固件。
4.2 Recovery 不同场景下的使用
4.2.1 第一次开机
烧写过 misc.img、recovery.img 的设备会进入第一次开机流程。
串口log打印如下内容:
Boot command: boot-recovery
Got arguments from boot message
Command: "recovery" "--wipe_all"
format '/dev/block/by-name/userdata' to ext2 filesystem
executing '/sbin/mke2fs'
executed '/sbin/mke2fs' done
executed '/sbin/mke2fs' return 0
executing '/sbin/e2fsck'
e2fsck 1.43.9 (8-Feb-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/block/by-name/userdata: 11/2304 files (0.0% non-contiguous), 82/2299
blocks
executed '/sbin/e2fsck' done
executed '/sbin/e2fsck' return 0
executing '/usr/sbin/e2fsck'
e2fsck 1.43.9 (8-Feb-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/block/by-name/oem: 18/2448 files (0.0% non-contiguous), 513/16384
blocks
executed '/usr/sbin/e2fsck' done
executed '/usr/sbin/e2fsck' return 1
executing '/usr/sbin/resize2fs'
resize2fs 1.43.9 (8-Feb-2018)
The filesystem is already 16384 (1k) blocks long. Nothing to do!
executed '/usr/sbin/resize2fs' done
executed '/usr/sbin/resize2fs' return 0
4.2.2 恢复出厂设置
命令行运行 update 程序,设备会进入 recovery,并进行格式化,格式化完成之后会自动进入 normal 系
update (或 update reset)
串口log打印如下内容:
1 I:Boot command: boot-recovery 2 I:Got arguments from boot message 3 Command: "recovery" "--wipe data" _ 4 format '/dev/block/by-name/userdata' to ext2 filesystem 5 executing '/sbin/mke2fs' 6 [ 4.692437] vendor storage:20160801 ret = -1 7 [ 6.030842] phy phy-ff008000.syscon:usb2-phy@100.0: charger = 8 USB SDP CHARGER _ _ 9 [ 10.891460] random: nonblocking pool is initialized | |
|---|---|
| 1 2 3 4 5 6 7 8 9 | I:Boot command: boot-recovery I:Got arguments from boot message Command: "recovery" "--wipe data" _ format '/dev/block/by-name/userdata' to ext2 filesystem executing '/sbin/mke2fs' [ 4.692437] vendor storage:20160801 ret = -1 [ 6.030842] phy phy-ff008000.syscon:usb2-phy@100.0: charger = USB SDP CHARGER _ _ [ 10.891460] random: nonblocking pool is initialized |
执行 update ota /xxx/update.img ,设备会进入 recovery,并进行升级。
| 1 update ota /udisk/update.img | |
|---|---|
| 1 | update ota /udisk/update.img |
以从 U 盘升级为例,串口可能打印的 log 如下:
| 1 I:Boot command: boot-recovery 2 I:Got arguments from boot message 3 Command: "recovery" "--update package=/udisk/update.img" _ 4 。。。。 5 librkupdate ui print = parameter writing.... _ _ 6 ########### RKA Gpt Download ######### _ _ 7 librkupdate ###### Download trust ... ####### _ | |
|---|---|
| 1 2 3 4 5 6 7 | I:Boot command: boot-recovery I:Got arguments from boot message Command: "recovery" "--update package=/udisk/update.img" _ 。。。。 librkupdate ui print = parameter writing.... _ _ ########### RKA Gpt Download ######### _ _ librkupdate ###### Download trust ... ####### _ |
4.3 常见问题汇总
4.3.1 “cannot find/open a drm device ”
常见在非 RK3308 平台,进入 recovery 模式后串口打印如下 log:
| 1 we are in recovery, skip init oem/userdata 2 start debug recovery... 3 Starting recovery on Fri Jan 18 09:19:51 2013 4 failed to read font: res=-1, fall back to the compiled-in font 5 Starting network: cannot find/open a drm device: No such file or directory | |
|---|---|
| 1 2 3 4 5 | we are in recovery, skip init oem/userdata start debug recovery... Starting recovery on Fri Jan 18 09:19:51 2013 failed to read font: res=-1, fall back to the compiled-in font Starting network: cannot find/open a drm device: No such file or directory |
遇到此情况时,解决方法是:接上设备支持的显示屏,或者 HDMI 设备。
原因分析:从提示的 log 看是找不到或者打开drm 设备失败。因为,默认非 RK3308 平台 recovery程序的编译是打开支持 UI 显示的,如果进入 recovery 模式之后,打开显示设备失败,则会导致 recovery执行失败。
解决方式:
1、 source envsetup.sh
2、现在使用平台的recovery配置编号,回车
3、 make menuconfig ,打开 No UI for recovery 的配置
| 1 > Target packages ---> 2 [*] Rockchip BSP packages ---> 3 [*] Rockchip recovery for linux 4 [*] No UI for recovery 5 [ ] Linux AB bool control 6 Linux A/B bringup features. (successful boot) ---> _ 7 choice the update bin of recovery. (rkupdate) ---> 8 -*- recovery bin 9 [ ] updateEngine bin | |
|---|---|
| 1 2 3 4 5 6 7 8 9 | > Target packages ---> [*] Rockchip BSP packages ---> [*] Rockchip recovery for linux [*] No UI for recovery [ ] Linux AB bool control Linux A/B bringup features. (successful boot) ---> _ choice the update bin of recovery. (rkupdate) ---> -*- recovery bin [ ] updateEngine bin |
| exte | rnal/recovery/Makefile |
4、重新编译 recovery包
| 1 make recovery-dirclean && make recovery | |
|---|---|
| 1 | make recovery-dirclean && make recovery |
5、重新生成 recovery 固件
| 1 ./build.sh recovery | |
|---|---|
| 1 | ./build.sh recovery |
6、生成固件。
| 1 ./mkfirmware.sh | |
|---|---|
| 1 | ./mkfirmware.sh |
4.3.2 misc 分区固件修改默认命令
如果想修改 misc 固件中打包不同的 recovery 命令,或者使用空白的 misc 分区固件。可按如下方式修改:
工程根目录下:修改 mkfirmware.sh。
4.3.3 userdata 分区设置为 vfat 文件系统
SDK 中默认 userdata 分区为 ext2/ext4 文件系统,若想修改为 vfat32 文件系统,可按如下修改:
1. 修改 board/rockchip/rkxxxx/fs-overlay-recovery/etc/fstab
修改前:
| 1 /dev/block/by-name/userdata /userdata ext2 defaults0 | |
|---|---|
| 1 | /dev/block/by-name/userdata /userdata ext2 defaults0 |
修改后:
| 1 /dev/block/by-name/userdata /userdata vfat defaults0 0 | |
|---|---|
| 1 | /dev/block/by-name/userdata /userdata vfat defaults0 0 |
2. 修改 configs/rockchip_rkxxxx_release_defconfig
增加以下配置:
| 1 BR2 PACKAGE DOSFSTOOLS=y _ _ 2 BR2 PACKAGE DOSFSTOOLS FATLABEL=y _ _ _ 3 BR2 PACKAGE DOSFSTOOLS FSCK FAT=y _ _ _ _ 4 BR2 PACKAGE DOSFSTOOLS MKFS FAT=y _ _ _ _ | |
|---|---|
| 1 2 3 4 | BR2 PACKAGE DOSFSTOOLS=y _ _ BR2 PACKAGE DOSFSTOOLS FATLABEL=y _ _ _ BR2 PACKAGE DOSFSTOOLS FSCK FAT=y _ _ _ _ BR2 PACKAGE DOSFSTOOLS MKFS FAT=y _ _ _ _ |
3. 修改 package/rockchip/usbdevice/S50usbdevice
| 1 start) 2 mkdir /dev/usb-ffs -m 0770 3 mkdir /dev/usb-ffs/adb -m 0770 4 mount -t configfs none /sys/kernel/config 5 mkdir /sys/kernel/config/usb gadget/rockchip -m 0770 _ 6 echo 0x2207 > /sys/kernel/config/usb gadget/rockchip/idVendor _ 7 echo "ums adb" > _ 8 /sys/kernel/config/usb gadget/rockchip/configs/b.1/strings/0x409/configu _ ration 9 mount -t functionfs adb /dev/usb-ffs/adb 10 mount -t vfat /dev/disk/by-partlabel/userdata /media/usb0 11 export service adb tcp port=5555 _ _ _ 12 adbd & 13 sleep 1 | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | start) mkdir /dev/usb-ffs -m 0770 mkdir /dev/usb-ffs/adb -m 0770 mount -t configfs none /sys/kernel/config mkdir /sys/kernel/config/usb gadget/rockchip -m 0770 _ echo 0x2207 > /sys/kernel/config/usb gadget/rockchip/idVendor _ echo "ums adb" > _ /sys/kernel/config/usb gadget/rockchip/configs/b.1/strings/0x409/configu _ ration mount -t functionfs adb /dev/usb-ffs/adb mount -t vfat /dev/disk/by-partlabel/userdata /media/usb0 export service adb tcp port=5555 _ _ _ adbd & sleep 1 |
| 确保已 |
0001-common-mk-userdata-Fix-wrong-FS_TYPE-check.patch
| 1 case $FS TYPE in _ 2 ext[2-4]) 3 $COMMON DIR/mke2img.sh $USERDATA DIR $USERDATA IMG _ _ _ 4 ;; 5 fat|vfat) 6 SIZE=$(du -h -BM --max-depth=1 $USERDATA DIR|awk '{print int($1)}') _ 7 # echo "create image size=${SIZE}M" 8 dd if=/dev/zero of=$USERDATA IMG bs=1M count=$SIZE >/dev/null 2>&1 _ 9 mkfs.vfat $USERDATA IMG >/dev/null 2>&1 _ 10 mcopy -i $USERDATA IMG $USERDATA DIR/* ::/ >/dev/null 2>&1 _ _ 11 ;; 12 *) 13 echo "file system: $FS TYPE not support." _ 14 exit 1 15 ;; 16 Esac | |
|---|---|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | case $FS TYPE in _ ext[2-4]) $COMMON DIR/mke2img.sh $USERDATA DIR $USERDATA IMG _ _ _ ;; fat|vfat) SIZE=$(du -h -BM --max-depth=1 $USERDATA DIR|awk '{print int($1)}') _ # echo "create image size=${SIZE}M" dd if=/dev/zero of=$USERDATA IMG bs=1M count=$SIZE >/dev/null 2>&1 _ mkfs.vfat $USERDATA IMG >/dev/null 2>&1 _ mcopy -i $USERDATA IMG $USERDATA DIR/* ::/ >/dev/null 2>&1 _ _ ;; *) echo "file system: $FS TYPE not support." _ exit 1 ;; Esac |
| 修改 c | |
| 1 | |
| 2 3 4 5 6 7 | |
| 修改 |
export RK_USERDATA_FS_TYPE=ext2
# Set userdata partition type, including ext2, fat
export RK_USERDATA_FS_TYPE=vfat
4.3.4 userdata (或/data )分区不格式化
BoardConfig.mk 中配置了 wipe_all-misc.img ,却不希望格式化用户或客制(userdata 或 oem)分区,此时需要修改 recovery 的代码。修改 external/recovery/reocvery.c : main 函数中如下图的代码,将下图红框中的代码注释掉后,重新编译 recovery 分区固件,烧写 recovery 分区固件即可。
4.3.5 SD卡升级问题
在实际项目开发中,经常遇到使用 SD 卡制作启动盘,用以升级裸片或者升级Flash固件。在第3章节,我们阐述了SD 卡制作启动盘并可以正常进入 recovery 模式,进行升级的情况,但实际使用过程中,常遇到SD 卡升级无法正常进行,串口亦无任何输出的情况。本小节就此情景下做针对性的说明。
此处,以 RK1808 平台为例,其他 RK 平台芯片(RK3288、RK3399、RK3399PRO)类似,给出SD卡管脚与 UART 2 调试串口 IO复用后,SD卡作为启动卡升级的解决方案。
-
首先检查硬件原路图,查看 SD 卡 GPIO 管脚是否与 uart2 串口管脚复用,若硬件有复用,需调整uboot 下的dtsi,打开使能 sdmmc,禁用 uart2 (系统默认使用uart 2 作为调试串口)。若无复用,检查SD 卡上电与初始化部分。
-
修改 loader,将 loader 中 uart 的打印重新配置,修改 SDK/rkbin/tools/ddrbin_param.txt 中 uart id 。假如可以将串口飞线连接到 uart1 m0,则 uart id=1;如果飞到 uart1 m1,那么 uart id=1 uart iomux=1。
-
重新生成 ddr.bin,执行以下命令
| 1 cd SDK/rkbin/tools 2 rkbin/tools$./ddrbin tool ddrbin param.txt _ _ ../bin/rk1x/rk1808 ddr 933MHz v1.04.bin _ _ _ | |
|---|---|
| 1 2 | cd SDK/rkbin/tools rkbin/tools$./ddrbin tool ddrbin param.txt _ _ ../bin/rk1x/rk1808 ddr 933MHz v1.04.bin _ _ _ |
此处 rk1808_ddr_933MHz_v1.04.bin 文件,根据 SDK 中当前 rkbin/bin/rk1x/ 目录下的文件名保持一致。
具体平台目录有差异,根据实际芯片平台的前两个数字命名。
ddrbin_tool工具参数详细内容,可参考说明文档:
SDK/rkbin/tools/ddrbin_tool_user_guide.txt 。
- 修改 kernel dts配置。
修改调试串口,除了 ddr.bin 修改外,内核也需要修改。
- 修改启动参数 cmdline:
kernel/arch/arm64/boot/dts/rockchip/rk1808-evb-v10.dts
| 1 chosen { 2 bootargs = "earlycon=uart8250,mmio32,0xff550000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait swiotlb=1 kpti=0 snd aloop.index=7"; _ 3 }; | |
|---|---|
| 1 2 3 | chosen { bootargs = "earlycon=uart8250,mmio32,0xff550000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait swiotlb=1 kpti=0 snd aloop.index=7"; _ }; |
此处 0xff550000 这个地址要根据实际的串口修改,各个不同串口地址在arch/arm64/boot/dts/rockchip/rk1808.dtsi 这个文件里可以搜索找到,其他平台类似,查找对应平台的设备树文件。
如:RK1808 平台 uart2: serial@ff550000, uart1: serial@ff540000。6. 编译固件
uboot编译: ./build.sh uboot 或者进入u-boot目录中,执行 ./make.sh rk1808
编译后生成文件在 u-boot 目录下:
| 1 u-boot/ 2 ├── rk1808 loader v1.03.104.bin _ _ 3 ├── trust.img 4 └── uboot.img | |
|---|---|
| 1 2 3 4 | u-boot/ ├── rk1808 loader v1.03.104.bin _ _ ├── trust.img └── uboot.img |
kernel编译: ./build.sh kernel
recovery编译: ./build.sh recovery 最后 ./build.sh updateimg 。
- 正确烧录编译好的固件以后
打包生成 update.img 升级包,使用“SDDiskTool_v1.62”或更新版本,烧录 update.img 到SD卡中。开发板断电,插上SD卡,上电。此时串口可以从uart1或其他当前所指定的飞线的串口打印log,观察log,并根据log具体分析SD卡升级问题。