本文介绍在 RK3588 上通过 OTA 技术进行系统升级的流程和技术细节,帮助开发者更好地理解升级过程并注意关键事项。
1. 检查系统是否包含 userdata 分区
在板子上执行以下命令查看 /userdata 是否存在:
ls /userdata
若不存在 userdata 分区,需要在 SDK 中打开该分区配置。
启用 userdata 分区
修改 SDK 中的 parameter.txt 配置文件:
文件路径:SDK/Linux_Pack_Firmware/rockdev/rk3588-package-file
--- a/device/rockchip/rk3588/parameter.txt
+++ b/device/rockchip/rk3588/parameter.txt
@@ -8,6 +8,6 @@ MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
-CMDLINE: mtdparts=rk29xxnand:0x00000800@0x00001800(env),0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),-@0x00078000(rootfs:grow)
+CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x01c00000@0x00078000(rootfs),0x00040000@0x01c78000(oem),-@0x01cb8000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
修改 SDK 中的 rk3588-package-file 配置文件:
--- a/tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
+++ b/tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
@@ -12,7 +12,8 @@ misc Image/misc.img
boot Image/boot.img
recovery Image/recovery.img
rootfs Image/rootfs.img
+userdata Image/userdata.img
如果是Ubuntu文件系统,还需要修改 SDK 中的 fstab 配置文件:
--- a/ubuntu/overlay/etc/fstab
+++ b/ubuntu//overlay/etc/fstab
@@ -9,4 +9,4 @@ sysfs /sys sysfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
pstore /sys/fs/pstore pstore defaults 0 0
#PARTLABEL=oem /oem ext2 defaults 0 2
-#PARTLABEL=userdata /userdata ext2 defaults 0 2
+PARTLABEL=userdata /userdata ext2 defaults 0 2
2. 编译 Recovery 相关程序
3. 升级流程
3.1. 编译各组件
./build.sh // 编译 uboot、kernel 和 rootfs
./build.sh debian // 编译 Debian 文件系统;如果Ubuntu文件系统,此处执行./build.sh focal
3.2. 打包完整固件
./build.sh updateimg // 生成完整固件 `update.img`,保存路径为 SDK/rockdev/update.img
3.3. 查看升级后的 compatible 字段
cat /proc/device-tree/compatible
显示类似于 neardi,lkd3588-linux-f04,rockchip,rk3588 的信息。
4. OTA 升级包准备
修改 tools/linux/Linux_Pack_Firmware/rockdev/package-file
文件,根据需要升级的分区配置。升级包可以只包含部分分区,以减少包大小。
注意事项:
- recovery.img 在升级包中不会在 Recovery 模式下升级,以避免掉电时导致分区损坏。此分区将在 normal 系统下升级。
- misc 分区不建议打包进升级包,因为该分区会在升级成功后被清空。
- 如果升级包存放在 userdata 分区,确保 package-file 中未包含 userdata.img,以避免文件系统损坏。
示例:仅升级 boot.img
修改设备树
编辑设备树文件 kernel/arch/arm64/boot/dts/rockchip/rk3588-neardi-linux-lkd3588-f0.dts
:
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3588-neardi-linux-lkd3588-f0.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3588-neardi-linux-lkd3588-f0.dts
@@ -24,5 +24,5 @@
#include "rk3588-neardi-linux-ld160-ov13855-os04a10-dphy1.dtsi" //dphy1
/ {
model = "Rockchip RK3588 NEARDI LKD3588 Board";
- compatible = "neardi,lkd3588-linux-f04,", "rockchip,rk3588";
+ compatible = "neardi,lkd3588-linux-f05,", "rockchip,rk3588";
};
**编译内核**
```bash
./build.sh kernel
修改 rk3588-package-file 文件
在 tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file 文件中仅保留 boot.img:
--- a/tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
+++ b/tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
@@ -5,14 +5,15 @@ package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
#trust Image/trust.img
-uboot Image/uboot.img
-misc Image/misc.img
+#uboot Image/uboot.img
+#misc Image/misc.img
#resource Image/resource.img
#kernel Image/kernel.img
boot Image/boot.img
recovery Image/recovery.img
-rootfs Image/rootfs.img
+#rootfs Image/rootfs.img
+#oem Image/oem.img
+#userdata Image/userdata.img
打包升级包
./build.sh updateimg
5. 执行升级
将编译服务器生成的 update.img 复制到设备的 /userdata 目录:
sudo scp neardi@192.168.1.200:~/sdk/rk3588/linux/rk3588-linux/rockdev/update.img /userdata/
执行 OTA 升级命令:
sudo update ota /userdata/update.img
升级过程中可通过串口调试查看进度:
Checking in progress on 1 disk (24.2% complete)
Checking in progress on 1 disk (25.6% complete)
升级完成后,验证 compatible 是否更新:
cat /proc/device-tree/compatible
如显示 neardi,lkd3588-linux-f05,说明升级成功。