组合 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 节点 | 类型 | 加载地址 | 作用 |
|---|---|---|---|
uboot | Standalone Program | 0x4a000000 | U-Boot proper |
atf | Firmware | 0x00054000 | TF-A BL31 |
fdt-1 | Flat Device Tree | 由 U-Boot 处理 | Avaota A1 的 U-Boot DTB |
默认配置还应显示 Firmware: atf、Loadables: uboot 和 allwinner/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。两者的顺序不能通过交换节点名称改变。atf 的 0x54000 来自上一节的 TF-A 链接布局,uboot 的 0x4a000000 则是 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 对节点和地址的检查。