说到底,编译文件系统其实就是生成一堆文件和文件夹,同时引入一些依赖库。怎么打包成可以烧录的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  ← 烧录工具最终认的文件
  1. buildroot从网上下载需要的包。

    这个步骤Buildroot 从 defconfig 读取包列表,下载源码

  2. 交叉编译以适配目标开发板。

    配置了交叉编译器、编译生成需要的文件、安装到 staging 目录

  3. 生成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.cfg
    

    ubinize.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 xz
    jffs2mkfs.jffs2 -d 目录 -o 镜像
    erofsmkfs.erofs 镜像 目录

    本质上都是把目录 + 元数据 + 压缩选项丢给一个 mkfs 工具。

  4. 使用afptool打包出update.img

    核心是 2 个工具tools/linux/Linux_Pack_Firmware/

    afptool — 把多个子镜像打包成一个

    mk-update_pack.sh:223

    afptool -pack 镜像目录 update_tmp.img
    

    afptool 读取 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-file
    

    afptool 把所有子镜像按分区顺序拼接成一个 update_tmp.img,并在头部写入每个分区的偏移和大小信息。

    rkImageMaker — 加上 Rockchip 头部

    mk-update_pack.sh:225

    rkImageMaker -RK1106 download.bin update_tmp.img update.img -os_type:androidos
    

    rkImageMakerupdate_tmp.img 前面加上:

    • 芯片标识(-RK1106
    • download.bin(含 DDR 初始化 + SPL 的 loader)

    最终产出 update.img,这就是烧录工具(rkflash.sh / RKdevTool)识别的完整固件包。