根据串口日志分析启动故障
主线系统停住时,最容易做的事是同时修改 TF-A、U-Boot 和设备树,然后全部重编。这样即使偶然启动,也不知道究竟哪一处判断是对的。
串口最后一行不一定是故障原因,但可以确定系统最后完成的启动动作。先检查当前阶段输出的文件、地址和参数,再只修改对应的源码工程。一次只改变一个变量,才能从下一次日志中判断修改是否有效。
案例一:SPL 在读取 FIT 时停止
典型现象是 SPL 已有串口输出,却没有列出 FIT 中的 BL31、U-Boot 和设备树。
SPL 无法读取 FIT 时,串口可能出现:
Trying to boot from MMC2
mmc_load_image_raw_sector: mmc block read error
Error: -38
SPL: Unsupported Boot Device!
按顺序检查:
- raw 的 8 KiB 位置是否存在本次 U-Boot;
- eGON 头记录的 SPL 长度是否正确;
8 KiB + SPL 长度处是否为 FIT 魔数;- eMMC 当前硬件分区是否已经从 Boot1/Boot0 切回 User Area;
- MMC2 在 SPL 阶段是否使用保守的 25 MHz 时钟。
主机端先执行镜像检查,若 raw 内部正确,再增加 CONFIG_SPL_FIT_PRINT=y 和 eMMC 读扇区日志。不要在偏移未知时反复修改 FIT load address。
离线镜像正确而板端读错,问题集中在硬件分区选择、控制器时钟、采样或实际烧录内容;离线镜像本身已错,则上板重复测试不会提供更多信息。先使用成本更低且确定性更高的检查。
当前修复让 SPL 强制执行 Boot1 → User Area 切换,并按 TM4 控制器采用 4-bit、25 MHz、每次 128 块的读取参数。修复后的第一处决定性变化不是“错误消失”,而是日志继续从 read sector=0x70 进入 BL31: v2.12.0。
TF-A 阶段:检查 BL31 与 U-Boot
如果 SPL 能列出 FIT,BL31 也能进入,但 U-Boot proper 在重定位前后同步异常或直接复位,应检查运行地址是否落入 T527 当前可安全访问的 DRAM 区域。
U-Boot 命令行中记录:
bdinfo
printenv fdt_addr_r kernel_addr_r ramdisk_addr_r
当前 avaota-a1_defconfig 已启用 CONFIG_SKIP_RELOCATE=y,同时 board_get_usable_ram_top() 将 U-Boot 可用顶端限制为 0x50000000。因此现有产物属于“跳过重定位的诊断路径”;若要关闭这个问题,必须另行保存关闭该选项后的启动日志和冷启动结果。
案例二:U-Boot 找到 extlinux,却读不完 Image
如果日志已经显示 Found /extlinux/extlinux.conf,随后在 Retrieving file: /Image 报 CMD18 超时,可继续查看诊断行中的块数。blocks=65535 表示一次请求接近 32 MiB;此时 FAT 路径和文件名已经基本正确,检查重点应转向 MMC 请求规模和控制器等待时间。
当前 cfg->b_max = 128 将读取拆成 64 KiB 小段,并在控制器复位后只允许重试当前小段一次。修改后日志继续出现 DTB 读取与 Starting kernel ...,因此可以把结果归因到 MMC 大请求路径,而不是重新修改 extlinux 文件名。
需要手动检查 FAT 时,先以 mmc list 的实际结果为准。本次 U-Boot 自动扫描使用的是 mmc 1:1:
mmc list
mmc list
mmc dev 1
part list mmc 1
fatls mmc 1:1 /
fatls mmc 1:1 /extlinux
fatload mmc 1:1 ${loadaddr} /extlinux/extlinux.conf
依次回答四个问题:eMMC 是否枚举、分区表是否正确、FAT 是否可读、配置文件路径是否匹配。只有前三项都成功时,才检查 extlinux 语法。
Linux 阶段:检查根分区
如果内核已经运行并最终报 VFS: Unable to mount root fs,关注内核命令行和驱动是否内建。本次成功固件使用的是:
root=/dev/mmcblk1p2 rootwait rw
eMMC 主机驱动、块设备层和 ext4 驱动必须在根文件系统挂载前可用,不能只编译成 rootfs 中的模块。主机端同时检查:
tune2fs -l output/images/rootfs.ext2 | grep 'Filesystem volume name'
grep -E '^CONFIG_(MMC|MMC_SUNXI|EXT4_FS)=' output/build/linux-*/.config
课程工程使用 root=LABEL=rootfs。还要把 ext4 卷标与命令行对应起来:
tune2fs -l output/images/rootfs.ext2 \
| grep 'Filesystem volume name'
mtype -i output/images/boot.vfat ::/extlinux/extlinux.conf \
| grep -o 'root=LABEL=[^ ]*'
前者应显示 rootfs,后者应为 root=LABEL=rootfs。若两者不一致,Linux 可能已经列出 eMMC 分区,却仍无法把命令行中的卷标解析成根设备。检查对象必须是最终 FAT 中的 extlinux.conf,而不只是源码目录里的副本。
确认镜像包含当前构建产物
镜像检查脚本会把 raw 8 KiB 处的内容与本次生成的 U-Boot 逐字节比较。二者不一致时会直接输出:
raw image does not contain the exact U-Boot image at 8 KiB
出现该提示时,重新运行 post-image/genimage,让 raw 吸收本次构建产物,再重新生成 SHA-256 和发布目录。FES loader 不随主线 raw 重建,但它的固定哈希仍要进入同一个发布记录。这一检查可以阻止不同构建批次的文件进入同一个发布包。
按启动阶段逐项定位
一次修改后至少保存以下四项:
故障阶段:
判断依据:
修改文件与符号:
修改后的第一处日志变化:
如果日志没有在预期位置发生变化,说明当前判断没有被验证,应回到上一条可靠证据,而不是继续叠加更多补丁。
迁移到其他板卡时,故障树的阶段仍然成立,但地址、控制器编号和时钟值必须来自新板。可复用的是“根据交接对象缩小范围”的方法,不是 Avaota A1 的具体补丁常量。