跳到主要内容

启动 U-Boot SPL

FIT 已经生成,但上电后的 T527 并不知道它位于存储介质的哪个位置。第一个访问存储介质的是固化在芯片内部的 BootROM;它不认识文件名、不解析 extlinux,也不会遍历普通磁盘分区。

BootROM 只识别约定偏移处的 eGON 启动头。魔数、校验和和长度均正确时,BootROM 才会把 SPL 搬入片内 SRAM。随后,容量受限的 SPL 完成串口、时钟、DRAM 和 eMMC 的最小初始化,并把 FIT 加载到 DRAM。

检查 SPL 的 eGON 启动头

进入 mainline-a1

bootloader=u-boot-v2026.07/u-boot-sunxi-with-spl.bin
xxd -g 1 -l 64 "$bootloader"

偏移 0x04 处应出现 ASCII 字符串 eGON.BT0。BootROM 依靠该标记、长度和校验和判断第一阶段代码是否有效。

这三个字段承担不同职责:魔数用于识别格式,长度告诉 BootROM/SPL 当前启动块覆盖到哪里,校验和用于发现传输或封装损坏。只看到 eGON.BT0 不能证明整段 SPL 有效;板卡直接进入 FEL 时,还要核对长度、校验和以及写入介质的实际偏移。

头部偏移 0x10 保存 SPL 对齐后的长度。使用下面的命令读取:

spl_size_hex=$(xxd -e -g 4 -l 4 -s 16 "$bootloader" | awk '{print $2}')
spl_size=$((16#$spl_size_hex))
printf 'SPL length: 0x%x (%d bytes)\n' "$spl_size" "$spl_size"

当前构建结果为 0xc000,即 48 KiB。U-Boot 在 SPL 之后按该长度放置 FIT,因此组合镜像中的关系为:

直接检查 FIT 魔数:

xxd -p -l 4 -s "$spl_size" "$bootloader"

输出应为 d00dfeed。这是扁平设备树格式的魔数,firmware FIT 也使用该容器格式。

0xc000 是加入填充后的边界,不等于 spl/u-boot-spl.bin 的普通文件大小。SPL 改动导致代码增长时,构建工具可能把边界推进到新的对齐值,FIT 的读取扇区也随之改变。后续镜像检查必须从 eGON 头重新计算,不能永久写死 0xc000 或扇区 0x60

根据 SPL 长度定位 FIT

为首次上板保留 FIT 节点输出:

scripts/config --file u-boot-v2026.07/.config -e SPL_FIT_PRINT
make -C u-boot-v2026.07 olddefconfig
make -C u-boot-v2026.07 -j"$(nproc)" \
ARCH=arm CROSS_COMPILE="$cross" BL31="$bl31" SCP=

重新执行上一节的 eGON、长度和 FIT 魔数检查,避免配置变化后仍使用上一次生成的二进制。

CONFIG_SPL_FIT_PRINT 只增加诊断输出,不负责启用 FIT 本身。它的价值是把“eMMC 读到了若干字节”推进到“解析器识别出 atf、uboot 和 fdt-1”。发布版本可以关闭详细列表,但第一次移植应保留,直到 FIT 加载与跳转都稳定。

从串口确认 SPL 启动阶段

当前固件在 Avaota A1 上已经取得以下连续日志:

U-Boot SPL 2026.07-dirty (Sep 01 2026 - 23:27:38 -0400)
DRAM: 4096 MiB
LYNX_RECOVERY_FEL: armed after boot device 2
Trying to boot from MMC2

前两行证明 BootROM 接受了 eGON 头、SPL 已经执行,并且 DRAM 训练得到 4 GiB 容量。Trying to boot from MMC2 只是说明 SPL 开始访问板载 eMMC 控制器,还不能证明后续 FIT 已经读出。

判断标准如下:

串口现象能确认的范围
没有 U-Boot SPL,板卡进入 FELBootROM 没有接受当前 SPL
出现 U-Boot SPL 2026.07eGON 头有效,BootROM 已跳转到 SPL
出现 DRAM 容量SPL 已完成基本时钟和 DRAM 初始化
打印 FIT 的 atfubootfdt-1,随后出现 BL31SPL 已读到后续 FIT、完成解析并发生跳转

这四种现象不能互相替代。尤其是出现 SPL 版本并不表示 FIT 已经从 eMMC 读取成功。本次固件最终进入了 BL31,因此 BootROM、SPL、DRAM 和 FIT 解析已经形成一条实机证据链;下一节继续说明 eMMC 分区选择与控制器时序如何影响 FIT 读取。

更换 SoC 时,需要重新确认 BootROM 认可的头格式、SRAM 容量和 SPL 最大尺寸;更换存储布局时,需要重新确认组合镜像写入位置与 FIT 偏移。eGON 头属于 SoC 启动协议,extlinux 属于后续 U-Boot 启动协议,两者不在同一阶段解决问题。

继续:从 eMMC 读取 FIT