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 的日志、以及网络服务是否拉起。
故障恢复入口的设计
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 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 分区切换 |
这张清单的价值在于:它把"启动失败"从一个模糊现象拆解成可逐级定位的信号链。远程运维平台可以按阶段采集这些信号,当某一级信号缺失或异常时,自动匹配对应的恢复入口,从而把平均修复时间从"现场插串口"压缩到"远程触发回退"。