There are currently 5 posts.
Font size: Small - 100% (Default)▼  Content converter: No conversion▼
 
Clicks Replies
63 4
rk3506 rauc全量升级
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 1 Posted at: 10/21/26 10:59
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

巨大八爪鱼
武林盟主 二十一级
Reply
Floor 2 Posted at: 10/21/26 11:00
【build/RKIMG_BOOTCOMMAND.py】
#!/usr/bin/env python3
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))

lines = []
with open("uboot.sh", "r", encoding = "utf-8") as file:
    for line in file:
        line = line.strip()
        i = line.find("#")
        if i != -1:
            line = line[0:i]
        if line == "":
            continue
        line = line.replace("\\", "\\\\")
        line = line.replace('"', '\\"')
        lines.append(line)

print("#define RKIMG_BOOTCOMMAND \\")
for i, line in enumerate(lines):
    if i != len(lines) - 1:
        print('    "' + line + ';" \\')
    else:
        print('    "' + line + '"')
巨大八爪鱼
武林盟主 二十一级
Reply
Floor 3 Posted at: 10/21/26 11:00
【build/system.conf】
[system]
compatible=ominicyl-rk3506
bootloader=uboot
mountprefix=/mnt/rauc

[keyring]
path=example_sha1.crt

[slot.rootfs.0]
device=/dev/mmcblk0p3
type=ext4
bootname=A

[slot.rootfs.1]
device=/dev/mmcblk0p5
type=ext4
bootname=B

[slot.boot.0]
device=/dev/mmcblk0p2
type=raw
parent=rootfs.0

[slot.boot.1]
device=/dev/mmcblk0p4
type=raw
parent=rootfs.1

巨大八爪鱼
武林盟主 二十一级
Reply
Floor 4 Posted at: 10/21/26 11:00
【build/uboot.sh】
# This is only an example to show a possible bootcmd script to implement A/B
# slot selection for kernel on NAND and rootfs on eMMC. It's expected that
# you'll have to adjust it for your use-case.

test -n "${BOOT_ORDER}" || setenv BOOT_ORDER "A B"
test -n "${BOOT_A_LEFT}" || setenv BOOT_A_LEFT 3
test -n "${BOOT_B_LEFT}" || setenv BOOT_B_LEFT 3

setenv bootargs
for BOOT_SLOT in "${BOOT_ORDER}"; do
  if test "x${bootargs}" != "x"; then
    # skip remaining slots
  elif test "x${BOOT_SLOT}" = "xA"; then
    if itest ${BOOT_A_LEFT} -gt 0; then
      echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
      setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
      setenv bootpart "boot"
      setenv bootargs "root=/dev/mmcblk0p3 rauc.slot=A"
    fi
  elif test "x${BOOT_SLOT}" = "xB"; then
    if itest ${BOOT_B_LEFT} -gt 0; then
      echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
      setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
      setenv bootpart "boot2"
      setenv bootargs "root=/dev/mmcblk0p5 rauc.slot=B"
    fi
  fi
done

if test -n "${bootargs}"; then
  saveenv
else
  echo "No valid slot found, resetting tries to 3"
  setenv BOOT_A_LEFT 3
  setenv BOOT_B_LEFT 3
  saveenv
  reset
fi

echo "Starting kernel"
boot_fit

巨大八爪鱼
武林盟主 二十一级
Reply
Floor 5 Posted at: 10/21/26 11:01
【bundle/manifest.raucm】
[update]
compatible=ominicyl-rk3506
version=2026.10-1

[image.boot]
sha256=dfdfb96337a6ea454128e7a852be66e918c995cd9f25dfcd702e4447c0d9591c
size=6451200
filename=boot.img

[image.rootfs]
sha256=1e9598747f9d58cc99dc1ce6abc07afc8ae75887d3ba83dc1e88e0986249fea5
size=271122432
filename=rootfs.img

Reply the post
Content:
User: You are currently anonymous.
Captcha:
Unclear? Try another one.
(Shortcut key: Ctrl+Enter)
Post Information
Clicks: 63 Replies: 4
Author: 巨大八爪鱼
Last reply: 巨大八爪鱼
Last reply time: 10/21/26 11:01
Announcements