硬件: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.