跳到主要内容

组合 U-Boot FIT

现在手里有了 bl31.bin,却还不能直接把它烧到 eMMC。SPL 后面至少还要接上 U-Boot proper 和 U-Boot 自己使用的设备树,三者的加载地址、入口地址和引用关系必须一起交给 SPL。

FIT 是这个阶段使用的固件容器。它用设备树格式描述各个镜像、加载地址和启动关系,SPL 解析 FIT 后,会把 BL31、U-Boot proper 和 DTB 分别加载到约定位置。

这里还没有 Linux Image 和 Linux DTB。它们体积更大,要等 U-Boot proper 运行后再从 FAT 分区读取。把两套设备树、两个加载阶段分开,是读懂后续构建产物的关键。

检查 Avaota A1 的 U-Boot 配置

进入 mainline-a1,复用上一章的 cross 变量:

make -C u-boot-v2026.07 ARCH=arm CROSS_COMPILE="$cross" clean
make -C u-boot-v2026.07 ARCH=arm CROSS_COMPILE="$cross" \
avaota-a1_defconfig

先核对实际展开的 .config

grep -E 'CONFIG_DEFAULT_DEVICE_TREE=|CONFIG_MACH_SUN55I_A523=|CONFIG_SPL=|CONFIG_SUPPORT_EMMC_BOOT=' \
u-boot-v2026.07/.config

四项均应存在,其中设备树名称为 allwinner/sun55i-t527-avaota-a1。这一步证明构建目标是 Avaota A1,而不是只凭输出文件名判断。

这四个配置项分别控制不同构建分支:CONFIG_MACH_SUN55I_A523 选择 SoC 初始化,CONFIG_SPL 生成 BootROM 能进入的第一阶段,CONFIG_SUPPORT_EMMC_BOOT 启用 eMMC 硬件启动分区处理,CONFIG_DEFAULT_DEVICE_TREE 决定 U-Boot 自己使用的 DTB。最后一项不是 Linux DTB 的别名;即使两者来自相近的上游 DTS,U-Boot 构建仍会裁剪并加入自己的运行期属性。

生成包含三类镜像的 FIT

bl31="$PWD/trusted-firmware-a-a523/build/sun55i_a523/debug/bl31.bin"
test -s "$bl31"

make -C u-boot-v2026.07 -j"$(nproc)" \
ARCH=arm CROSS_COMPILE="$cross" \
BL31="$bl31" SCP= all

BL31= 指向 TF-A 产物;SCP= 为空表示本次 FIT 不加入独立 SCP 固件。生成结果中需要关注三个文件:

u-boot-v2026.07/
├── spl/u-boot-spl.bin
├── u-boot-sunxi-with-spl.fit.fit
└── u-boot-sunxi-with-spl.bin

三者不能按文件名互换:

  • spl/u-boot-spl.bin 只有第一阶段代码,没有 eGON 头后的完整 FIT;
  • u-boot-sunxi-with-spl.fit.fit 只保存后续固件容器,BootROM 不能直接启动它;
  • u-boot-sunxi-with-spl.bin 才是 eGON SPL 与 FIT 按对齐规则组合后的部署文件。

因此下一章检查的是组合文件的头和偏移,本节则先验证容器内部引用是否正确。

使用 dumpimage 检查 FIT 内容

u-boot-v2026.07/tools/dumpimage -l \
u-boot-v2026.07/u-boot-sunxi-with-spl.fit.fit

检查输出中的类型、加载地址和配置引用:

FIT 节点类型加载地址作用
ubootStandalone Program0x4a000000U-Boot proper
atfFirmware0x00054000TF-A BL31
fdt-1Flat Device Tree由 U-Boot 处理Avaota A1 的 U-Boot DTB

默认配置还应显示 Firmware: atfLoadables: ubootallwinner/sun55i-t527-avaota-a1。它们之间的关系是:

如果 FIT 中没有 atf,SPL 无法按 64 位启动链进入 TF-A;如果板级 DTB 名称错误,即使 U-Boot proper 能加载,也可能在控制台或存储初始化阶段使用错误硬件描述。

Firmware: atf 表示 SPL 把 BL31 作为下一跳入口,Loadables: uboot 表示 U-Boot proper 是由 BL31 随后启动的 BL33。两者的顺序不能通过交换节点名称改变。atf0x54000 来自上一节的 TF-A 链接布局,uboot0x4a000000 则是 U-Boot proper 的初始执行地址;后者进入运行后还会再次选择重定位地址。

如果更换 TF-A 平台或 U-Boot 链接地址,应先重新生成 FIT,再用 dumpimage 检查地址。直接替换 FIT 中的二进制而不更新节点属性,会得到“文件存在但跳转失败”的镜像。

核对 FIT 中的固件来源

strings -a u-boot-v2026.07/u-boot-sunxi-with-spl.fit.fit \
| grep -E 'BL31: v2\.5|sun55iw3p1|BOOT0 commit|SyterKit'

当前 FIT 不应包含这些字符串。如果命令产生输出,应重新核对 BL31 输入文件和 U-Boot 构建目录;这项检查不能替代 dumpimage 对节点和地址的检查。

继续:启动 U-Boot SPL