OTA在线升级:全量升级功能实现
验证固件A/B切换,回退
验证根据配置设定,从A固件切换到B固件
验证切换到B固件失败时,自动回退到A固件
【在电脑上配置板子的emmc分区表】
cd ~/Documents/Code/C/emmc3
修改rockdev/parameter.txt第12行:
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00006000@0x00004000(boot),0x00346ff0@0x00010000(rootfs),0x00006000@0x00356ff0(boot2),-@0x0035cff0(rootfs2:grow)
可以在板子上用fdisk -l命令查看分区表:
Number Start (sector) End (sector) Size Name
1 8192 16383 4096K uboot
2 16384 40959 12.0M boot
3 65536 3502063 1677M rootfs
4 3502064 3526639 12.0M boot2
5 3526640 6963135 1677M rootfs2
【在电脑上配置板子的buildroot,添加rauc软件包】
./build.sh buildroot-config
勾选Target packages ---> System tools ---> [*] rauc
mkdir buildroot/output/rockchip_rk3506_luckfox/target/etc/rauc
cp ../ominicly_OTA_upgrade/rk3506/build/system.conf buildroot/output/rockchip_rk3506_luckfox/target/etc/rauc
cp ../ominicly_OTA_upgrade/rk3506/build/example_sha1.crt buildroot/output/rockchip_rk3506_luckfox/target/etc/rauc
修改buildroot/output/rockchip_rk3506_luckfox/target/etc/init.d/rcS,在末尾添加rauc status mark-good。
备注:/etc/init.d/rcS是开机脚本。sh脚本里面调用另一个sh脚本文件,如果找不到文件,会报line x: xxx.sh: command not found错误,但脚本不会停止,会继续执行后续内容。
【在电脑上配置uboot】
cd u-boot
cp configs/rk3506_luckfox_defconfig .config
make menuconfig
Environment ---> Select the location of the environment
选择Environment in an MMC device。
Environment offset设置为0x7f8000(键盘的backspace键无效,需要按键盘的delete键退格),Environment size设置为0x8000。
0x7f8000是uboot分区的最后0x8000字节,可以保证每次用瑞芯微的烧录软件烧录镜像后都会被清空,使用uboot代码里面的默认环境变量。
勾选Command line interface ---> Shell scripting commands ---> [*] itest和[*] setexpr
然后保存。
cp .config configs/rk3506_luckfox_defconfig
cd ..
【在电脑上修改uboot代码】
[u-boot/arch/arm/mach-rockchip/boot_rkimg.c]
注释掉第236行的env_update("bootargs", boot_options);。
[u-boot/arch/arm/mach-rockchip/fit.c]
fit_get_blob函数里面,在第147行int blk_num;下方按回车键加一行空行,再按回车键添加
if (env_get("bootpart") != NULL) {
part_name = env_get("bootpart");
printf("%s: part_name=%s\n", __func__, part_name);
}
[u-boot/include/configs/rk3506_common.h]
删除第82-89行
#ifdef CONFIG_FIT_SIGNATURE
#define RKIMG_BOOTCOMMAND \
"boot_fit;"
#else
#define RKIMG_BOOTCOMMAND \
"boot_fit;" \
"boot_android ${devtype} ${devnum};"
#endif
改成../ominicly_OTA_upgrade/rk3506/build/RKIMG_BOOTCOMMAND.py脚本输出的内容。
【在电脑上交叉编译fw_printenv和fw_setenv】
不能使用buildroot里面的host u-boot tools软件包,因为板子用的uboot版本(2017.09)与buildroot自带的u-boot tools版本(2021.07)不符。
make -C u-boot CROSS_COMPILE=../prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf- envtools
cp u-boot/tools/env/fw_printenv buildroot/output/rockchip_rk3506_luckfox/target/sbin
ln -rs buildroot/output/rockchip_rk3506_luckfox/target/sbin/fw_printenv buildroot/output/rockchip_rk3506_luckfox/target/sbin/fw_setenv
echo "/dev/mmcblk0 0x7f8000 0x8000" > buildroot/output/rockchip_rk3506_luckfox/target/etc/fw_env.config
【在电脑上配置板子的linux内核】
./build.sh kernel-config
勾选:
CONFIG_MD
CONFIG_BLK_DEV_DM
CONFIG_BLK_DEV_LOOP
CONFIG_DM_VERITY
CONFIG_SQUASHFS
CONFIG_SQUASHFS_ZLIB
CONFIG_CRYPTO_SHA256
即
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
<*> Device mapper support
<*> Verity target support
Device Drivers --->
[*] Block devices --->
<*> Loopback device support
File systems --->
[*] Miscellaneous filesystems --->
<*> SquashFS 4.0 - Squashed file system support
[*] Include support for ZLIB compressed file systems
-*- Cryptographic API --->
Hashes, digests, and MACs --->
-*- SHA-224 and SHA-256
修改rockdev/parameter.txt第11行:GROW_ALIGN: 0改成1。
修改kernel/arch/arm/boot/dts/rk3506b-luckfox-lyra-pi.dts设备树文件,删除第15行bootargs里面的root=/dev/mmcblk0p3。
然后用./build.sh编译内核,并烧录到板子上。
【在电脑上制作升级包】
cd ../ominicly_OTA_upgrade/rk3506/build
cp ../../../emmc3/rockdev/boot.img ../bundle
cp ../../../emmc3/rockdev/rootfs.img ../bundle
#openssl req -x509 -nodes -days 365 -newkey rsa:2048 -sha1 -keyout example_sha1.key -out example_sha1.crt
rm test.raucb
rauc bundle --cert=example_sha1.crt --key=example_sha1.key ../bundle test.raucb
【上传升级包到板子上】
adb push "\\oct1158-ubuntu\oct1158\Documents\Code\C\ominicly_OTA_upgrade\rk3506\build\test.raucb" /root
注意:必须确保板子上有/etc/rauc/system.conf和/etc/rauc/example_sha1.crt这两个文件。
这两个文件是放到板子上,并没有打包到test.raucb里面。
如果板子上没有,用下面的命令上传到板子上。
adb shell mkdir /etc/rauc
adb push "\\oct1158-ubuntu\oct1158\Documents\Code\C\ominicly_OTA_upgrade\rk3506\build\system.conf" /etc/rauc
adb push "\\oct1158-ubuntu\oct1158\Documents\Code\C\ominicly_OTA_upgrade\rk3506\build\example_sha1.crt" /etc/rauc
每次修改system.conf,都要记得更新板子上的文件。
【在板子上安装升级包】
date -s "2026-10-19 14:00:00"(注意改成当前的时间)
rauc install test.raucb
reboot