3. Sitara启动流程与量产测试切入点

在TI Sitara(AM335x/AM437x/AM57xx等)平台上,从上电到系统可用并不是“一步到位”,而是由若干职责明确的阶段接力完成。理解这条链路的阶段划分、每阶段可观测的信号与接口,以及失败时如何分层定位,是量产测试方案设计的起点——因为测试介入点必须落在“可观测、可控制、可判定”的位置上。

启动阶段的职责划分

Sitara的启动链通常可划分为四个阶段:ROM Code、SPL(Secondary Program Loader,即MLO)、U-Boot、Kernel。

ROM Code固化在芯片内部ROM中,上电复位后首先运行。它完成最基础的时钟与PLL初始化、部分引脚复用配置,然后按BOOT顺序(SYSBOOT引脚采样结果)依次尝试各启动介质:MMC/SD、NAND、SPI、UART、USB、以太网等。ROM Code的核心任务是找到并加载一个足够小的“第一级引导镜像”,它本身不具备文件系统解析能力,只按固定格式(如MMC上的原始扇区、FAT分区中的MLO文件)读取。此阶段可观测的关键点包括:SYSBOOT引脚电平、各启动介质的时钟/数据线活动、UART0上的“CCCC”字符(UART启动等待)以及ROM Code的失败回退行为。

SPL/MLO由ROM Code加载到片内SRAM(AM335x约128KB)运行,空间极其受限。它的职责是:初始化DDR控制器与DDR颗粒、配置时钟树、设置引脚复用,然后把完整的U-Boot镜像从启动介质搬运到DDR中并跳转。SPL是“从SRAM到DDR”的关键桥梁,也是量产中最容易出问题的环节之一——DDR参数不匹配、MLO镜像损坏、启动介质读取失败都会在此阶段暴露。可观测信号包括:DDR初始化后的时钟输出、DDR电源与参考电压、UART上的SPL打印信息(若开启early debug)、以及通过JTAG读取PC指针判断是否卡死。

U-Boot运行在DDR中,空间充裕,功能完整。它负责更全面的外设初始化(网络、USB、存储、显示等)、环境变量加载、镜像校验(如FIT镜像的hash校验)、以及最终加载并跳转到Kernel。U-Boot阶段是量产测试介入最灵活的位置:可以通过环境变量控制启动行为、通过命令行执行内存测试、通过tftp/dfu加载测试固件、通过fastboot烧写镜像。可观测点包括:U-Boot版本与编译时间戳、环境变量内容、各外设探测日志、以及bootcmd执行路径。

Kernel启动后完成驱动加载、根文件系统挂载、init进程启动。此阶段的可观测点包括:内核启动日志(dmesg)、设备树加载情况、各驱动probe结果、根文件系统挂载点、以及用户空间服务状态。量产测试通常关注Kernel是否正常启动到用户空间、关键外设(以太网、USB、显示、音频)是否被正确识别。

Sitara启动链路与量产测试介入点 ROM Code 片内ROM · 上电复位 SYSBOOT采样 · 介质探测 SPL / MLO 片内SRAM · DDR初始化 搬运U-Boot到DDR U-Boot DDR运行 · 外设初始化 镜像校验 · 加载Kernel Kernel 驱动加载 · 根文件系统 init · 用户空间 可观测信号 SYSBOOT引脚电平 UART0 "CCCC" MMC/NAND时钟活动 DDR电源/参考电压 SPL串口打印 JTAG PC指针 U-Boot版本/时间戳 环境变量 外设探测日志 dmesg日志 驱动probe结果 根文件系统挂载 量产测试介入点 SYSBOOT配置验证 启动介质连通性 UART启动模式测试 DDR参数校准 MLO完整性校验 SRAM加载验证 内存读写测试 网络/USB功能测试 镜像烧写与校验 外设驱动验证 文件系统读写 启动时间测量 启动失败分层定位: 无任何串口输出 → 查ROM Code/SYSBOOT/电源时钟 | 有"CCCC"无后续 → 查启动介质/MLO | 有SPL打印卡住 → 查DDR参数 | 进入U-Boot但无法加载Kernel → 查镜像/环境变量 | Kernel panic → 查设备树/驱动/根文件系统

各阶段可观测信号与测试介入点

量产测试的核心思路是:在每个阶段找到“可观测”的信号,并在“可控制”的位置注入测试。ROM Code阶段的可观测信号主要是SYSBOOT引脚电平和启动介质活动,测试介入点包括验证SYSBOOT配置是否正确、启动介质是否可读、UART启动模式是否可用。SPL阶段的可观测信号是DDR初始化后的电源与时钟、SPL串口打印、JTAG PC指针,测试介入点包括DDR参数校准、MLO完整性校验、SRAM加载验证。U-Boot阶段的可观测信号是版本信息、环境变量、外设探测日志,测试介入点包括内存读写测试、网络/USB功能测试、镜像烧写与校验。Kernel阶段的可观测信号是dmesg日志、驱动probe结果、根文件系统挂载状态,测试介入点包括外设驱动验证、文件系统读写、启动时间测量。

启动失败的分层定位方法

启动失败时,最忌讳“从头到尾盲目排查”。正确做法是按阶段分层定位,利用每个阶段的“边界信号”快速缩小范围。以下是基于实际工程经验的判断路径:

  • 无任何串口输出:问题在ROM Code或更早。检查SYSBOOT引脚电平是否符合预期、电源与时钟是否正常、复位信号是否释放。可用示波器测量晶振输出和复位引脚。
  • 串口输出"CCCC"但无后续:ROM Code已运行,但未找到有效启动镜像。检查启动介质(SD卡/NAND/SPI)是否插入、MLO文件是否存在且格式正确、介质接口是否连通。
  • 有SPL打印但卡住:SPL已运行,问题在DDR初始化或U-Boot搬运。检查DDR参数(时序、电压、参考电阻)是否与硬件匹配,MLO是否完整,DDR颗粒是否焊接良好。
  • 进入U-Boot但无法加载Kernel:U-Boot已运行,问题在镜像加载或环境变量。检查bootcmd、bootargs、镜像路径、网络/tftp配置、存储设备识别。
  • Kernel panic或卡在启动:Kernel已加载,问题在设备树、驱动或根文件系统。检查dmesg中的错误信息、设备树是否匹配硬件、根文件系统是否可挂载。
在实际量产测试中,建议在U-Boot阶段预留一个“测试模式”入口:通过环境变量或GPIO触发,进入一个专用的测试命令行,执行内存测试、外设自检、镜像校验等操作。这样可以在不依赖Kernel的情况下完成大部分硬件功能验证,显著提高测试效率和故障定位速度。

量产测试切入点的选择原则

选择测试切入点时,应遵循三个原则:可观测——该位置有明确的信号或日志可供判断;可控制——可以通过配置或命令改变测试行为;可判定——有明确的通过/失败判据。例如,DDR测试的最佳切入点是SPL之后、U-Boot之前,因为此时DDR已初始化但尚未被大量使用,可以通过U-Boot的内存测试命令(mtest)进行读写校验。而以太网测试的最佳切入点是U-Boot阶段,因为此时网络驱动已加载,可以通过ping或tftp进行连通性验证。

对于量产环境,还需要考虑测试的自动化程度和节拍。ROM Code和SPL阶段的测试通常依赖硬件夹具和JTAG,适合在产线首件调试时使用;U-Boot和Kernel阶段的测试可以通过串口或网络自动化执行,适合批量生产。将不同阶段的测试项合理分配到产线工位,可以在保证覆盖率的同时控制测试时间。

# 示例:U-Boot阶段内存测试命令
# 在U-Boot命令行执行,测试DDR从0x80000000开始的64MB区域
mtest 0x80000000 0x84000000 0x5A5A5A5A

# 示例:U-Boot阶段网络连通性测试
setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.1
ping 192.168.1.1

# 示例:Kernel启动后检查关键外设
dmesg | grep -E "eth0|mmc0|usb|i2c"
cat /proc/mounts | grep rootfs

上述命令中的IP地址、内存地址范围均为示例,实际使用时需根据硬件设计和网络环境调整。内存测试的地址范围应避开U-Boot自身占用的区域,通常从DDR起始地址加偏移开始。

总结来说,Sitara启动流程的四个阶段各有明确的职责和可观测信号,量产测试的切入点应落在“可观测、可控制、可判定”的位置。启动失败时,按阶段分层定位可以快速缩小问题范围,避免盲目排查。掌握这条链路的每个环节,是设计高效量产测试方案的基础。