说到底,编译文件系统其实就是生成一堆文件和文件夹,同时引入一些依赖库。怎么打包成可以烧录的rootfs.img,再结合rk提供的构建工具将uboot,kernel,rootfs等打包成一个update.img整体
源代码/Buildroot包
↓
目录树(bin, lib, etc, usr, ...)
│
│ mkfs.ubifs -d 目录 ...
↓
rootfs.img (UBI 格式,含卷头)
│
│ + uboot.img + boot.img + oem.img + ...
│ afptool -pack 目录 update_tmp.img
│ rkImageMaker -RK1106 download.bin update_tmp.img update.img
↓
update.img ← 烧录工具最终认的文件
-
buildroot从网上下载需要的包。
这个步骤Buildroot 从 defconfig 读取包列表,下载源码
-
交叉编译以适配目标开发板。
配置了交叉编译器、编译生成需要的文件、安装到 staging 目录
-
生成rootfs.img
两个步骤:
① 目录 → UBIFS 镜像(
sysdrv/tools/pc/mtd-utils/mkfs_ubi.sh)# 第 190 行:目录 → ubifs 裸镜像 mkfs.ubifs -x lzo -e 0x1FC00 -m 2048 -c 468 -d rootfs_uclibc_rv1106/ -o rootfs.ubifs │ │ │ │ │ │ │ │ │ │ │ └── 源目录 │ │ │ │ └── 最大逻辑擦除块数 (分区大小/LEB) │ │ │ └── 最小 IO 大小 (NAND 页大小) │ │ └── LEB 大小 (块大小 - 2×页大小) │ └── lzo 压缩 └── mkfs.ubifs 工具 # 第 202 行:ubifs → UBI 镜像 (包含 UBI 头部) ubinize -o rootfs.img -m 2048 -p 0x20000 -v ubinize.cfgubinize.cfg描述了卷信息:[ubifs] mode=ubi vol_id=0 vol_name=rootfs vol_type=dynamic vol_flags=autoresize image=rootfs.ubifs最终产出
rootfs.img,可以直接烧录到 NAND 的 rootfs 分区。② 编译时用的是
build_mkimg()(project/build.sh:2332-2333):# 对于 ubifs 类型,直接调 mkfs_ubi.sh $RK_PROJECT_TOOLS_MKFS_UBIFS $src $dst $part_size $part_name $fs_type $comp其他文件系统也一样简单:
文件系统 命令 ext4mkfs.ext4 -d 目录 镜像 大小squashfsmksquashfs 目录 镜像 -comp xzjffs2mkfs.jffs2 -d 目录 -o 镜像erofsmkfs.erofs 镜像 目录本质上都是把目录 + 元数据 + 压缩选项丢给一个 mkfs 工具。
-
使用afptool打包出update.img
核心是 2 个工具
tools/linux/Linux_Pack_Firmware/:①
afptool— 把多个子镜像打包成一个mk-update_pack.sh:223:afptool -pack 镜像目录 update_tmp.imgafptool读取package-file清单文件,它列出了每个分区的文件名:# package-file(自动生成) bootloader download.bin env env.img uboot uboot.img boot boot.img oem oem.img rootfs rootfs.img userdata userdata.img package-file package-fileafptool把所有子镜像按分区顺序拼接成一个update_tmp.img,并在头部写入每个分区的偏移和大小信息。②
rkImageMaker— 加上 Rockchip 头部mk-update_pack.sh:225:rkImageMaker -RK1106 download.bin update_tmp.img update.img -os_type:androidosrkImageMaker在update_tmp.img前面加上:- 芯片标识(
-RK1106) - download.bin(含 DDR 初始化 + SPL 的 loader)
最终产出
update.img,这就是烧录工具(rkflash.sh/RKdevTool)识别的完整固件包。 - 芯片标识(