4. BootROM与启动介质识别

在Marvell芯片平台上,BootROM是芯片上电后第一段真正运行的代码,它固化在片内ROM中,不可修改,却决定了整个系统“从哪里取第一段可执行镜像”。理解BootROM的行为,是Bring-up阶段判断“板子为什么起不来”的起点。BootROM的核心职责可以概括为三件事:采样启动模式引脚(strap)、按优先级探测并识别启动介质、从被选中的介质加载镜像并校验后跳转。它不负责初始化DDR、不负责复杂外设驱动,因此BootROM能识别的介质和协议非常有限,通常只覆盖SPI-NOR、eMMC、SD以及UART(或类似的串行下载通道)。

BootROM在启动链中的位置

上电复位后,CPU从复位向量进入BootROM。此时DDR尚未初始化,可用RAM只有片内SRAM(大小通常在几十KB到几百KB量级,具体以芯片手册为准)。BootROM必须在这个受限环境里完成介质探测、读取镜像头、校验、把镜像搬入SRAM并跳转。因此BootROM对镜像格式有严格要求:一般需要合法的头部(如magic、长度、校验和、目标地址等字段),否则会被判定为无效镜像并继续尝试下一介质。这也解释了为什么“镜像烧进去了但板子不启动”——往往是头部或校验不满足BootROM的约定,而不是介质本身坏了。

启动模式选择与介质识别顺序

Marvell平台通常通过一组strap引脚(有时称为boot mode pins或configuration pins)在上电复位期间被采样,决定BootROM的搜索顺序。常见策略是:若strap指定了固定介质(如SPI-NOR优先),BootROM先尝试该介质;若失败,再按内置顺序回退到其它介质,最后进入UART下载模式。另一种常见策略是“自动探测”:BootROM依次探测SPI-NOR、eMMC、SD,任一介质上找到合法镜像即停止。strap引脚一般在复位释放前必须保持稳定,因此硬件上常用上拉/下拉电阻设定默认值,再用测试点或跳线改变。

BootROM 启动介质识别与加载路径 上电复位 POR / RESET 采样 strap 引脚 BOOT_MODE[2:0] BootROM 片内 SRAM 运行 按优先级探测 镜像头是否合法? SPI-NOR CS/CLK/MOSI/MISO 0x00 起始读取 eMMC CMD/CLK/DAT Boot Partition SD 卡 CMD/CLK/DAT FAT 分区镜像 UART 下载 XMODEM / YMODEM 兜底恢复通道 校验通过 → 搬入 SRAM 跳转到镜像入口 进入下一级 Bootloader 失败则尝试下一介质

SPI-NOR启动的识别要点

SPI-NOR是最常见的启动介质,因为它接口简单、上电即可随机读取。BootROM通常通过标准SPI(单线)或Quad SPI读取NOR的起始区域。识别过程大致是:拉低片选CS,发送读命令(如0x03或0x0B),从地址0x00开始读取若干字节,检查镜像头magic。若magic匹配且校验通过,则继续按头部长度读取完整镜像。Bring-up时若SPI-NOR启动失败,优先检查:CS是否接对、时钟极性/相位是否与BootROM默认一致、NOR的地址映射是否从0x00开始、以及镜像是否真的烧在0x00偏移。有些平台要求镜像前若干字节包含特定BootROM头,直接烧一个裸bin往往无法启动。

eMMC与SD启动的识别要点

eMMC和SD都走MMC协议,但BootROM对两者的处理略有差异。eMMC通常从Boot Partition(Boot0/Boot1)读取,而不是User Data Area,因此烧录时必须明确写到Boot分区。SD卡则一般从FAT分区中读取固定文件名(如boot.bin或类似约定)的镜像。识别时BootROM会先发送CMD0复位、CMD1/CMD8协商电压、ACMD41获取OCR,再进入传输状态读取数据。Bring-up常见问题是:eMMC的Boot Partition未使能、SD卡未格式化为FAT、或DAT线宽与BootROM默认(1-bit或4-bit)不一致。若eMMC启动无反应,可用示波器观察CMD线是否有初始化命令,以判断是硬件链路问题还是分区配置问题。

UART启动与strap配置

UART启动是Bring-up阶段的“救命通道”。当所有板载介质都无效时,BootROM会进入UART下载模式,等待主机通过串口发送镜像。典型流程是:BootROM在UART上输出提示字符(如“BootROM”或特定握手字节),主机工具收到后按XMODEM/YMODEM协议分块发送镜像,BootROM接收并写入SRAM后跳转。strap配置在这里至关重要:若strap被设成“强制SPI-NOR启动”,BootROM可能不会回退到UART;只有把strap设成“自动探测”或“UART优先”,才能进入下载模式。因此Bring-up板通常会把strap做成跳线或拨码开关,方便在NOR启动和UART恢复之间切换。

Bring-up建议:先用UART模式确认芯片能正常输出BootROM信息,再切换到SPI-NOR或eMMC启动。这样可以把“芯片是否活着”和“介质是否可用”两个问题分开定位。

启动引脚与strap配置的实操判断

strap引脚的值在复位释放瞬间被锁存,之后改变无效。因此测量时应在复位期间用示波器或逻辑分析仪抓取引脚电平,而不是复位后再测。常见配置包括:BOOT_MODE[2:0]选择介质优先级、BOOT_DEV_SEL选择具体设备、以及某些平台上的BOOT_WIDTH选择数据线宽。若发现实际启动介质与预期不符,先核对原理图上strap电阻的上下拉方向,再确认复位芯片是否在释放前给了足够稳定的时间。对于Marvell平台,部分strap还复用为其它功能引脚,复位后会被外设驱动改变,因此“复位后测到的电平”不能代表strap值。

Bring-up检查清单(示例)

检查项观察点正常判据异常处理
复位期间strap电平BOOT_MODE引脚与设计优先级一致调整上下拉电阻或跳线
UART输出TX引脚上电后有BootROM提示字符检查波特率、TX是否接反
SPI-NOR片选CS引脚复位后出现拉低脉冲检查CS走线、NOR供电
eMMC Boot分区Boot0/Boot1镜像已写入Boot分区用烧录器重写Boot分区
镜像头介质0x00偏移magic与校验合法用平台工具重新打包镜像

把以上环节串起来看,BootROM启动失败通常落在三类原因:strap配置与预期介质不符、介质本身或链路不可用、镜像格式不满足BootROM约定。Bring-up时按“先UART确认芯片、再strap确认路径、最后介质确认数据”的顺序排查,能最快定位问题所在。