【HD-RK3576-PI】定制用户升级固件

硬件:HD-RK3576-PI

软件:Linux6.1+Ubuntu22.04

在进行 Rockchip 相关开发时,制作自定义的烧写固件是一项常见且重要的操作。这里主要介绍文件系统的修改以及打包成完整update包升级的过程。

一、修改文件系统镜像(Ubuntu环境操作)

环境准备

复制代码
sudo apt-get update && sudo apt-get install qemu-user-static

挂载镜像文件

复制代码
mkdir -p ~/rootfs  # 创建临时挂载目录
sudo mount -o loop rootfs.img ~/rootfs  # 挂载镜像到目录

进入Chroot环境

使用ch-mount.sh脚本,内容脚本如下:

bash 复制代码
#!/bin/bash
mnt() {
        echo "MOUNTING"
        sudo mount -t proc /proc ${2}/proc
        sudo mount -t sysfs /sys ${2}/sys
        sudo mount -o bind /dev ${2}/dev
        sudo mount -o bind /dev/pts ${2}/dev/pts
        sudo chroot ${2}
}
umnt() {
        echo "UNMOUNTING"
        sudo umount ${2}/proc
        sudo umount ${2}/sys
        sudo umount ${2}/dev/pts
        sudo umount ${2}/dev
}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
        mnt $1 $2
        umnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
        umnt $1 $2
else
        echo ""
        echo "Either 1'st, 2'nd or both parameters were missing"
        echo ""
        echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
        echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
        echo ""
        echo "For example: ch-mount -m /media/sdcard/"
        echo ""
        echo 1st parameter : ${1}
        echo 2nd parameter : ${2}
fi

执行如下命令,我们就可以像在虚拟机中一样,通过shell运行这个chroot中的所有程序了!

bash 复制代码
sudo cp /usr/bin/qemu-aarch64-static ~/rootfs/usr/bin
sudo ./ch-mount.sh -m ~/rootfs  # 挂载系统依赖

输入用户密码后进入Chroot环境,提示符变为:

bash 复制代码
root@ubuntu:/#

然后我们就可以支持直接编辑文件或安装软件:

bash 复制代码
apt update && apt install <package_name>  # 安装所需软件

修改完后,按Ctrl+D退出Chroot环境,自动卸载虚拟文件系统。

然后取消文件系统挂载就可以

bash 复制代码
sudo umount ~/rootfs  # 确保退出后执行

二、打包烧写固件

update.img 系统固件组成

update.img 完整系统镜像由以下多个文件共同构成:

|-------------------|--------------------|
| 文件 | 描述 |
| MiniLoaderAll.bin | 引导文件 |
| uboot.img | uboot 镜像 |
| boot.img | 内核镜像 |
| recovery.img | recovery 镜像 |
| rootfs.img | 文件系统镜像如ubuntu |
| misc.img | 来自 rockchip 的自定义文件 |
| oem.img | oem 分区的固件镜像 |
| parameter.txt | 分区表 |
| userdata.img | 用户空间的固件镜像 |
| update.img | 由上述文件打包而成的完整系统镜像 |

下载与准备固件打包工具

从HD-RK3576-PI在线文档上中的软件开发参考资料处获取固件打包工具的下载地址(也可以从附件资源下载)。将下载得到的工具压缩包解压到电脑的 Linux 环境中。解压后,其目录结构如下:

bash 复制代码
Linux_Pack_Firmware_RK/
└── rockdev
    ├── Image
    ├── afptool
    ├── mkupdate.sh -> rk3576-mkupdate.sh  
    ├── package-file -> rk3576-package-file
    ├── readme.txt
    ├── revision.txt
    ├── rk3576-mkupdate.sh
    ├── rk3576-package-file
    ├── rkImageMaker
    ├── sdcard-update-package-file
    └── unpack.sh
  • package-file:此文件用于配置需要打包的文件包,决定了哪些文件最终会被包含在 update.img 镜像中。
  • Image 目录:该目录用于存放需要打包的文件,例如 Miniloader.bin、uboot.img 等文件可放置在此处。
执行打包操作

完成上述准备工作,并且确认 package-file 配置无误以及相关文件已放置在 Image 目录后,即可执行打包操作。在终端中进入到rockdev目录,执行mkupdate.sh脚本:

bash 复制代码
cd Linux_Pack_Firmware_RK/rockdev
./mkupdate.sh

脚本执行成功后,会在mkupdate.sh脚本所在的目录rockdev下生成一个update.img镜像,此镜像即为完整的系统烧写固件,可用于后续的设备烧录操作。

bash 复制代码
vanxoak@ubuntu:~ /Linux_Pack_Firmware_RK/rockdev$ ./mkupdate.sh
start to make update.img...
Android Firmware Package Tool v2.27
------ PACKAGE ------
Add file: ./package-file
package-file,Add file: ./package-file done,offset=0x800,size=0x28b,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
bootloader,Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0xb91f9,userspace=0x173
Add file: ./Image/parameter.txt
parameter,Add file: ./Image/parameter.txt done,offset=0xba800,size=0x1f8,userspace=0x1,flash_address=0x00000000
Add file: ./Image/uboot.img
uboot,Add file: ./Image/uboot.img done,offset=0xbb000,size=0x400000,userspace=0x800,flash_address=0x00004000
Add file: ./Image/misc.img
misc,Add file: ./Image/misc.img done,offset=0x4bb000,size=0xc000,userspace=0x18,flash_address=0x00006000
Add file: ./Image/boot.img
boot,Add file: ./Image/boot.img done,offset=0x4c7000,size=0x317a800,userspace=0x62f5,flash_address=0x00008000
Add file: ./Image/recovery.img
recovery,Add file: ./Image/recovery.img done,offset=0x3641800,size=0x42b4e00,userspace=0x856a,flash_address=0x00028000
Add file: ./Image/rootfs.img
rootfs,Add file: ./Image/rootfs.img done,offset=0x78f6800,size=0x3cc00000,userspace=0x79800,flash_address=0x00078000
Add file: ./Image/oem.img
oem,Add file: ./Image/oem.img done,offset=0x444f6800,size=0x11ef000,userspace=0x23de,flash_address=0x00a78000
Add file: ./Image/userdata.img
userdata,Add file: ./Image/userdata.img done,offset=0x456e5800,size=0x44e000,userspace=0x89c,flash_address=0x00ab8000
Add CRC...
Make firmware OK!
------ OK ------
********rkImageMaker ver 2.23********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making ./Image/update.img OK.
相关推荐
月昤昽2 分钟前
KDE面板背景个性化设置技巧
linux
久绊A9 分钟前
Copy Fail Linux内核提权漏洞(CVE-2026-31431)
linux·运维·服务器
源远流长jerry9 分钟前
TCP 连接队列解析:从 listen () 到 connect ()
linux·服务器·网络·网络协议·tcp/ip
剑神一笑10 分钟前
Linux grep 命令深度解析:从正则表达式到性能优化
linux·运维·正则表达式
苏宸啊12 分钟前
linux缓冲区的理解
linux
Bert.Cai16 分钟前
Linux bc命令详解
linux·运维·服务器
rjszcb16 分钟前
Linux.之系统性能监控脚本, CPU、内存、DDR、CMA、ISP、MPP、ION、DRM、进程
linux·服务器
桌面运维家21 分钟前
Linux磁盘IO调度器配置技巧 提升系统读写性能
linux·运维·服务器
Lehjy24 分钟前
【Linux】进程地址空间与写时拷贝
linux·运维·服务器
努力的小帅1 小时前
使用 Tailscale 实现 Ubuntu 远程开发(VSCode Remote SSH + NoMachine)
linux·ide·vscode·ubuntu·编辑器·copilot