2. Sitara硬件平台与启动链路解析

在工业Linux产品交付中,调试工作往往从“板子能不能起来”开始。要判断问题出在电源、时钟、DDR、存储介质还是软件镜像,必须先理解Sitara SoC的硬件架构与从上电到内核的完整启动链路。本节围绕AM335x、AM437x、AM57xx三类典型器件,梳理SoC内部结构、ROM Code启动流程、SPL与U-Boot的阶段划分,以及工业板级设计中最容易踩坑的硬件要点。

一、三类典型SoC的架构差异

AM335x是单核Cortex-A8,主频常见为600MHz~1GHz,片内集成SGX530 GPU、PRU-ICSS(可编程实时单元)和双千兆以太网MAC。它的启动介质选择通过SYSBOOT[15:0]引脚在上电复位时锁存,支持NAND、NOR、MMC/SD、SPI、UART、USB等。AM335x没有独立的MCU域,实时任务通常交给PRU或外挂MCU。

AM437x升级为单核Cortex-A9,主频可达1GHz,增加了Quad-SPI、更丰富的显示子系统,并保留PRU-ICSS。其启动引脚为SYSBOOT[18:0],启动介质顺序与AM335x类似但位定义不同,不能直接照搬AM335x的配置表。

AM57xx则是异构多核:双核Cortex-A15负责运行Linux,双核Cortex-M4用于实时控制,另含DSP(C66x)和PRU-ICSS。它的启动由A15主导,M4和DSP的固件由A15侧的U-Boot或内核加载,因此启动链路比前两者更长,镜像布局也更复杂。

Sitara SoC 启动链路与硬件要点 上电 / 复位 锁存 SYSBOOT 引脚 ROM Code 按启动列表探测介质 SPL / MLO 初始化 DDR、时钟、引脚 U-Boot 加载内核 / 设备树 / 根文件系统 启动介质探测顺序 MMC/SD → SPI → NAND → UART → USB (依 SYSBOOT 配置) 工业板级硬件要点 电源时序 VDD_CORE 先于 VDD_IO 复位需保持足够时长 时钟与晶振 24MHz 主晶振 + 32.768kHz DDR 参考时钟匹配 DDR 布线 等长、阻抗控制 VREF 与去耦 启动介质 eMMC / QSPI / SD 上拉电阻与电平 调试观察点: 串口 ROM Code 输出 → SPL 打印 DDR 容量 → U-Boot 打印启动介质与镜像地址 → 内核解压日志

二、ROM Code启动流程

上电复位后,CPU首先执行固化在芯片内部的ROM Code。它做三件事:读取SYSBOOT引脚确定启动介质列表;按列表顺序依次探测每种介质,寻找有效的引导头;找到后把第一阶段引导程序(SPL,在AM335x上文件名为MLO)搬入片内SRAM并跳转执行。

ROM Code对镜像有格式要求:MLO头部必须包含有效的配置头(CH)和GP头,包含镜像大小、目标地址、校验和等字段。如果MLO头部损坏或校验失败,ROM Code会继续尝试下一种介质,最终可能落到UART或USB启动模式。工业现场常见的“板子无输出”问题,很多就是SYSBOOT引脚被误配置或MLO头部不合法导致。

以AM335x为例,SYSBOOT[4:0]决定启动顺序,SYSBOOT[15:14]决定晶振频率选择。设计时应把SYSBOOT引脚通过电阻上拉或下拉到确定电平,并预留测试点,方便量产时切换启动模式。

三、SPL与U-Boot的阶段划分

SPL运行在片内SRAM中,空间通常只有几十到一百多KB,因此它只做最关键的初始化:配置PLL和时钟、初始化DDR控制器、配置启动介质引脚复用,然后把完整的U-Boot从存储介质搬到DDR中并跳转。SPL阶段一旦DDR初始化失败,后续所有镜像都无法加载,串口通常只打印到“SPL”或“U-Boot SPL”就停止。

U-Boot阶段运行在DDR中,功能完整:初始化网络、USB、MMC等外设,读取环境变量,根据bootcmd加载内核镜像(zImage)、设备树(.dtb)和根文件系统,最后跳转到内核入口。U-Boot还负责传递启动参数(bootargs),例如根文件系统位置、控制台串口、内存大小等。

在AM57xx上,U-Boot还需要加载M4和DSP的固件。通常做法是把固件打包进根文件系统,由remoteproc驱动在内核启动后加载;也可以在U-Boot阶段通过fatload把固件搬到指定内存地址,再由内核接管。调试异构核时,要分别确认A15侧Linux是否正常、M4/DSP是否被正确复位和加载。

四、工业板级硬件要点

电源时序是首要问题。Sitara要求内核电源(VDD_CORE)先建立,I/O电源(VDD_IO)后建立,且复位信号要在所有电源稳定后保持足够长的低电平。若时序错误,芯片可能无法完成ROM Code执行,表现为完全无串口输出。

时钟方面,主晶振通常为24MHz,RTC晶振为32.768kHz。晶振负载电容、串联电阻和PCB走线要按芯片手册推荐值设计。DDR时钟需要与数据线做等长匹配,VREF电压和去耦电容要靠近芯片引脚放置。

启动介质的选择直接影响量产和现场升级。eMMC适合大容量、高可靠性场景;QSPI NOR适合小容量、快速启动;SD卡适合开发调试。工业板通常同时保留SD和eMMC,通过SYSBOOT引脚或U-Boot环境变量切换启动源。

调试启动链路时,建议按“电源→时钟→复位→ROM Code串口输出→SPL DDR打印→U-Boot介质识别→内核日志”的顺序逐级确认。每一级都有明确的观察点,不要跳级猜测。

五、启动链路排查示例

假设一块AM335x工业板串口只打印“CCCC”,说明ROM Code进入了UART启动模式,没有找到有效MLO。此时应检查:SYSBOOT引脚是否被误设为UART优先;SD卡或eMMC中MLO头部是否完整;启动介质供电和引脚复用是否正确。若串口打印到“U-Boot SPL”后停止,则重点检查DDR初始化参数是否与板载颗粒匹配,包括容量、位宽、时序参数。

若U-Boot能启动但找不到内核,应检查bootcmd中的镜像路径、文件系统类型和分区表。常见错误包括:设备树文件名与实际不匹配、根文件系统分区号写错、bootargs中console参数与硬件串口不一致。通过这些观察点,可以把启动问题定位到具体阶段,而不是盲目更换镜像。