【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.
相关推荐
C-2002几秒前
kali系统的安装及配置
linux·运维·服务器
神秘的土鸡29 分钟前
Apache 高级配置实战:从连接保持到日志分析的完整指南
linux·运维·apache
GineLee1 小时前
吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)
linux
余辉zmh1 小时前
【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化
linux·网络·php
christine-rr1 小时前
【25软考网工】第九章(2)网络管理命令
linux·运维·网络·网络工程师·软考
s_little_monster1 小时前
【Linux】网络--传输层--深入理解TCP协议
linux·运维·经验分享·笔记·网络协议·学习·tcp/ip
2401_858286112 小时前
OS8.【Linux】基本权限(上)
linux·运维·服务器
孙克旭_2 小时前
day023-面试题总结
linux·运维·面试题
专注VB编程开发20年2 小时前
QuickBASIC QB64 支持 64 位系统和跨平台Linux/MAC OS
linux·运维·服务器·qb·quickbasic
aigoushan2 小时前
零基础开始的网工之路第十六天------Linux安全管理
linux·服务器·网络