4. SPI/I2C Flash启动与固件加载

Broadcom 交换芯片(如 Trident、Tomahawk、Helix 系列)上电后并不会直接运行用户固件,而是先由芯片内部固化的 BootROM 接管。BootROM 根据一组启动模式引脚(strap)决定从哪里取固件:SPI Flash、I2C EEPROM、PCIe 主机下载或内部 ROM 模式。理解这条链路,是板级 Bring-up 阶段判断“板子为什么起不来”的第一手依据。

启动模式选择:strap 引脚决定第一跳

芯片复位释放瞬间,若干复用引脚被采样为启动配置位。典型配置包括:启动介质选择(SPI / I2C / PCIe / ROM)、SPI 时钟分频、地址位宽(3 字节或 4 字节)、镜像校验是否使能。这些引脚通常在复位期间由外部上拉/下拉电阻设定,采样完成后引脚恢复为普通功能。因此 Bring-up 时第一件事是用万用表或示波器确认 strap 电平与设计一致——一个焊错的下拉电阻就可能让芯片去 I2C 找根本不存在的 EEPROM,表现为“无任何启动日志”。

常见约定(以具体芯片数据手册为准):SPI 启动时,BootROM 从 Flash 偏移 0x0 读取头部;I2C 启动时,从 7 位地址(如 0x50)的 EEPROM 读取。若 strap 选择 PCIe 启动,则芯片等待主机通过 BAR 空间写入固件,这在仿真/加速卡场景更常见。

BootROM 流程:从复位向量到固件入口

BootROM 的执行顺序大致为:初始化最小时钟与 SPI/I2C 控制器 → 读取镜像头部 → 校验(CRC/签名)→ 若校验失败尝试备份镜像或进入恢复模式 → 校验通过后将镜像搬运到片上 SRAM 或直接跳转到入口地址。整个过程不依赖外部 DDR,因此镜像头部必须自描述:包含魔数、版本、镜像长度、加载地址、入口地址、校验值。

Broadcom 交换芯片启动链路与镜像加载 复位释放 strap 引脚采样 BootROM 初始化 SPI/I2C 控制器 读取镜像头部 CRC/签名校验 启动介质 SPI Flash (0x0) I2C EEPROM (0x50) PCIe 主机下载 片上 SRAM 镜像搬运/解压 跳转入口地址 运行用户固件 镜像格式(头部 + 载荷) Magic 0x4252434D Version u32 Length 镜像字节数 Load Addr SRAM 目标 Entry Addr 跳转入口 CRC32 校验值 Payload 固件代码 启动日志关键节点判读 ✔ BootROM v2.3 → SPI mode, clk div=4 ✔ Header OK: magic=0x4252434D len=0x3A000 crc=0x8F2A1C ✘ CRC mismatch @0x0 → 尝试备份镜像 / 进入恢复模式

镜像格式:头部必须自描述

Broadcom 平台常见的镜像头部字段包括:魔数(用于快速识别有效镜像)、版本号、镜像长度、加载地址、入口地址、CRC32 或 SHA 签名。部分平台还包含“镜像类型”字段以区分 Bootloader、主固件、诊断固件。烧录工具在打包时会自动计算 CRC 并填入头部,因此手工拼接镜像极易因 CRC 不匹配导致 BootROM 拒绝加载。

一个典型的头部结构(示例,具体偏移以芯片手册为准):

Offset  Field        Size   Example
0x00    Magic        4B     0x4252434D ("BRCM")
0x04    Version      4B     0x00020003
0x08    ImageLength  4B     0x0003A000
0x0C    LoadAddr     4B     0x00100000
0x10    EntryAddr    4B     0x00100040
0x14    ImageType    4B     0x00000001 (主固件)
0x18    CRC32        4B     0x8F2A1C7E
0x1C    Reserved     4B     0x00000000
0x20    Payload...   N B    固件二进制

Flash 烧录:从裸片到可启动

Bring-up 阶段通常使用外部编程器(如 Dediprog SF100/SF600)或板载调试口烧录 SPI Flash。以 16MB SPI NOR 为例,典型流程为:擦除整片 → 写入镜像到偏移 0x0 → 回读校验。若使用 I2C EEPROM,则通过 i2c-tools 的 i2cset/i2cget 或专用烧录器写入,注意 EEPROM 页写周期(约 5ms)需在连续写之间插入延时,否则会丢数据。

烧录后务必做一次回读比对:flashrom -p dediprog -r readback.bin,再用 cmp 或 sha256sum 与原始镜像比对。很多“启动无日志”案例最终定位为烧录时地址偏移写错或未擦除干净。

启动日志解读:定位卡在哪一跳

串口控制台是 Bring-up 的核心观测点。正常启动日志会依次出现:BootROM 版本与启动模式 → 头部解析结果 → CRC 校验通过 → 跳转入口 → 用户固件打印。若日志停在某一步,即可反推故障域:

  • 完全无输出:检查 strap 电平、串口波特率(常见 115200 8N1)、TX/RX 是否接反、芯片是否真正复位。
  • 有 BootROM 版本但无头部信息:SPI 通信失败,检查 CS/CLK/MOSI/MISO 连线、Flash 供电、时钟分频是否过高。
  • 头部魔数错误:Flash 偏移 0x0 不是有效镜像,可能烧录地址偏移或镜像未打包头部。
  • CRC mismatch:镜像损坏或烧录不完整,回读比对确认;若平台支持备份镜像,观察是否自动切换。
  • 跳转后无输出:BootROM 已成功,问题在用户固件初始化(DDR、PLL、串口重映射),需用 JTAG 进一步定位。
Bring-up 建议:首次上电前先用编程器确认 Flash 内已有有效镜像;串口终端保持常开并开启日志记录,便于事后逐行比对。若芯片支持“恢复模式”strap,可预留一个跳线,在镜像损坏时强制进入 BootROM 恢复通道。

把启动链路拆成“strap → BootROM → 介质 → 头部校验 → SRAM 跳转 → 用户固件”六段后,每一段都有明确的观测点和判断依据。Bring-up 的效率,很大程度上取决于能否用日志把故障快速收敛到其中一段,而不是盲目更换 Flash 或反复烧录。