【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.
相关推荐
handler0122 分钟前
Linux基础知识(1)
linux·服务器·c语言·开发语言·数据结构·c++
ん贤25 分钟前
手敲Linux命令
linux·运维·服务器
泽020232 分钟前
OJBalancer ----- 基于负载均衡仿leetcode的刷题界面
linux·leetcode·负载均衡
花间相见37 分钟前
【Linux进阶01】—— tmux原理与实战教程
linux·运维·服务器
Bert.Cai40 分钟前
Linux groupadd命令详解
linux·运维
路溪非溪40 分钟前
抓取手机的蓝牙HCI日志并分析
linux·arm开发·驱动开发·智能手机
有谁看见我的剑了?41 分钟前
新服务器上线优化调整
linux·运维·服务器
成为你的宁宁41 分钟前
【apt update突然报错Temporary failure resolving ‘cn.archive.ubuntu.com‘】
linux·运维·ubuntu
凤年徐1 小时前
【Linux从入门到进阶】打包压缩、跨平台互传、内核版本、热键历史、关机与Shell原理一篇全搞定
linux·运维·服务器
i建模1 小时前
Linux 服务器上配置 XFCE 桌面以实现远程登录
linux·运维·服务器