4. Sitara启动流程与远程可维护性设计

AM335x、AM62x 等 Sitara 器件的启动是一条严格分级的信任链:片上 ROM Code 先跑,它只认最原始的介质与镜像格式;随后把控制权交给 SPL(MLO),SPL 完成 DDR 初始化后再加载 U-Boot;U-Boot 负责把 Kernel、设备树、Rootfs 拉起来。对远程运维而言,这条链的每一级都既是"故障高发点",也是"可观测点"和"恢复入口"。设计远程可维护性,本质上是把每一级的可观测信号暴露出来,并在每一级预留一条不依赖上一级成功的回退路径。

各阶段的可观测点

ROM Code 阶段几乎没有软件可干预空间,但并非不可观测。AM335x 的 ROM Code 会按 SYSBOOT[4:0] 引脚决定的顺序扫描启动介质,失败后进入 UART/USB 引导。可观测点包括:BOOT 引脚电平(决定扫描顺序)、上电时 UART0 是否输出 "CCCCC"(表示等待 XMODEM 下载)、以及通过 USB 枚举是否出现 ROM 的 RNDIS 设备。这些信号能直接区分"ROM 没找到介质"和"介质里的镜像坏了"。

SPL 阶段的可观测点集中在串口早期输出和 DDR 训练结果。SPL 会打印类似 SPL: 1st stage bootloader、DDR 容量、以及从哪个介质加载 U-Boot。若 SPL 卡死,通常表现为串口只输出一行或完全无输出,此时问题多指向 DDR 时序、时钟配置或 MLO 头部校验失败。U-Boot 阶段可观测点最丰富:环境变量、bdinfo、mmc list、printenv bootcmd、以及加载 Kernel 时的 Loading Kernel from mmc0... 日志。Kernel 阶段则看 Starting kernel ... 之后是否出现解压日志、设备树匹配信息、以及 Kernel panic 或 Unable to mount root fs。Rootfs 阶段的可观测点是 init 进程是否启动、systemd 或 busybox init 的日志、以及网络服务是否拉起。

Sitara 启动链:可观测点与故障恢复入口 ROM Code SYSBOOT 引脚扫描 UART "CCCCC" SPL / MLO DDR 训练日志 介质加载信息 U-Boot printenv / bdinfo bootcmd 执行 Kernel 解压 / DTB 匹配 panic / mount 错误 Rootfs init 启动 网络服务 恢复入口 UART/USB 引导 恢复入口 备份 MLO 分区 恢复入口 U-Boot 网络加载 恢复入口 双 DTB / 备用内核 恢复入口 A/B Rootfs 远程可观测层:串口日志回传 / 启动计数 / 看门狗状态 / 环境变量快照 每一级失败时,上一级保留的日志与状态是远程定位的唯一依据 设计原则:每一级都要有"可观测信号"和"不依赖本级成功的回退路径" ROM→UART/USB | SPL→备份分区 | U-Boot→网络加载 | Kernel→双镜像 | Rootfs→A/B 切换

故障恢复入口的设计

ROM Code 的恢复入口是 UART 和 USB 引导。当 eMMC 或 SD 卡上的 MLO 损坏时,只要把 SYSBOOT 引脚拨到 UART 模式,就能通过 uart_boot 工具把 SPL 和 U-Boot 直接灌进 DDR 运行,不依赖任何板载存储。这是最底层的"救砖"手段,远程场景下需要配合带外管理(如 BMC 或继电器控制 BOOT 引脚)才能触发。

SPL 的恢复入口是备份 MLO 分区。AM335x 的 ROM Code 支持从同一介质的多个偏移位置尝试加载 MLO,因此可以在 eMMC 的 boot0 和 boot1 分区各放一份 MLO,或在 SD 卡的不同扇区放两份。当主 MLO 校验失败时,ROM 会自动尝试备份。远程运维中,这一级的关键是确保备份 MLO 与主 MLO 版本一致,否则会出现"主 MLO 升级后备份仍是旧版"的隐性风险。

U-Boot 的恢复入口最灵活:bootcmd 失败后可以进入 U-Boot 命令行,通过 tftp 或 dhcp 从网络加载 Kernel 和 Rootfs。远程场景下,可以预先在 U-Boot 环境变量里配置 altbootcmd,当 bootcount 超过阈值时自动切换到网络引导或备用分区。Kernel 的恢复入口是双 DTB 或双内核镜像:在 U-Boot 中通过 bootargs 指定不同的 DTB 路径,当主 DTB 与硬件不匹配导致 Kernel panic 时,可以手动或自动切换到备用 DTB。Rootfs 的恢复入口是 A/B 分区方案,配合 swupdate 或 rauc 实现原子切换。

远程可维护性的落地要点

把上述可观测点和恢复入口串起来,需要三个工程动作。第一,串口日志必须回传。Sitara 的 UART0 是 ROM Code 和 SPL 的唯一早期输出通道,远程设备应通过板载 MCU 或串口转以太网模块把 UART0 日志持续推送到远端。第二,启动计数与看门狗联动。U-Boot 的 bootcount 环境变量配合 bootlimit,可以在连续启动失败后自动触发 altbootcmd。第三,环境变量快照。每次成功启动后,把 printenv 的输出和当前分区状态记录到远端,作为故障时的对比基线。

远程恢复的优先级应遵循"从下往上"原则:先尝试 ROM 级 UART/USB 引导,再尝试 SPL 备份分区,然后 U-Boot 网络加载,最后才是 Kernel/Rootfs 的 A/B 切换。越底层的恢复手段越可靠,但触发条件也越苛刻。

一个可参考的启动健康检查清单

阶段 可观测信号 正常判据 异常时的恢复入口
ROM Code UART0 输出 "CCCCC" 不出现,直接进入 SPL 拨 BOOT 引脚至 UART/USB 模式
SPL DDR 容量打印、介质加载日志 输出完整且无校验错误 切换至备份 MLO 分区
U-Boot bootcmd 执行、Kernel 加载地址 成功加载并跳转 进入命令行,tftp 加载
Kernel 解压日志、DTB 匹配、panic 信息 无 panic,进入 init 切换备用 DTB 或内核
Rootfs init 启动、网络服务状态 SSH/远程管理可达 A/B 分区切换

这张清单的价值在于:它把"启动失败"从一个模糊现象拆解成可逐级定位的信号链。远程运维平台可以按阶段采集这些信号,当某一级信号缺失或异常时,自动匹配对应的恢复入口,从而把平均修复时间从"现场插串口"压缩到"远程触发回退"。