启动模式与介质选择:BootROM 如何找到你的镜像
芯片上电后,第一件事就是跑 BootROM。但 BootROM 怎么知道该从哪儿加载镜像?是 NAND Flash,还是 SPI NOR,还是 USB?
这个问题,说白了就是启动模式的选择。我早年做第一款 SoC 时,觉得这不过是读几个 GPIO 电平的事。直到有一次,板子死活起不来,查了三天才发现是启动引脚的上拉电阻焊错了。嗯,从那以后,我对启动模式这部分再也不敢掉以轻心。
BootROM 支持的启动介质
不同的芯片,支持的介质种类会有差异。但主流嵌入式 SoC 基本都覆盖了下面这几类:
| 介质类型 | 典型接口 | 速度等级 | 常见场景 |
|---|---|---|---|
| SPI NOR Flash | SPI / QSPI / OSPI | 中低速(~100MB/s) | 小容量固件、安全启动、FPGA 配置 |
| NAND Flash | Raw NAND 接口 | 中速(~50MB/s) | 大容量存储、低成本方案 |
| eMMC | MMC / SD 接口 | 高速(~400MB/s) | 主流嵌入式 Linux 系统 |
| UART | UART(串口) | 极低速(115200bps) | 调试、工厂烧录、救砖 |
| USB | USB 2.0 / 3.0 | 中高速(~480MB/s) | 开发阶段下载、量产烧录 |
启动模式引脚配置
芯片怎么知道用哪种介质?靠的是启动模式引脚(Boot Mode Pins)。
这些引脚通常在芯片复位时被采样,采样值决定了 BootROM 的行为。采样方式有两种:
- 硬件引脚采样:芯片上电时,通过 GPIO 电平组合确定启动介质。比如 3 个引脚,可以编码 8 种模式。
- OTP / eFuse 配置:一次性可编程存储,出厂后不可更改。适合安全要求高的场景。
我见过一个项目,工程师把启动引脚直接悬空了。结果芯片每次上电都随机选一种介质启动,十次里有八次起不来。你想想看,这种问题查起来多崩溃。
启动优先级与回退机制
BootROM 不是只试一次就放弃的。它有一套优先级逻辑,按顺序尝试各个介质。如果第一个介质没找到有效镜像,就自动跳到下一个。
典型的优先级顺序是这样的:
- USB / UART(开发模式,优先级最高)
- eMMC(主存储介质)
- NAND Flash(备选存储)
- SPI NOR(最后兜底)
为什么 USB/UART 优先级最高?因为开发阶段你经常需要强制从 PC 下载镜像。如果芯片先尝试了 Flash 里的旧镜像,可能就跳过了你的新固件。
回退机制的核心逻辑是:BootROM 在每个介质上都会尝试加载一个合法的镜像头(Boot Header)。如果头校验失败,就认为该介质无效,继续尝试下一个。
关键点:回退机制不是无限循环的。BootROM 通常只完整扫描一轮,如果所有介质都失败,芯片会进入一个死循环或等待状态。这时候只能靠硬件复位或外部干预。
启动流程的完整逻辑
我把整个启动模式选择的逻辑画成了一张图,方便你理解:
这张图展示的是典型的四阶段回退流程。实际芯片可能会更多或更少,但逻辑是一样的:按优先级尝试,失败就跳下一个,直到成功或彻底失败。
实际项目中的选择建议
说了这么多理论,我结合自己的经验给你几条实在的建议:
- 量产产品:优先用 eMMC 或 SPI NOR。eMMC 自带坏块管理和 ECC,BootROM 处理起来最省心。SPI NOR 虽然慢,但可靠性极高,适合安全启动。
- 开发阶段:保留 USB 或 UART 启动模式。我习惯在 PCB 上留一组跳线,可以强制进入 USB 下载模式。这样即使 Flash 里的镜像坏了,也能通过 USB 重新烧录。
- 多介质冗余:如果产品对可靠性要求极高(比如车规、工业控制),可以考虑 SPI NOR + eMMC 双备份。SPI NOR 放最小启动镜像,eMMC 放完整系统。BootROM 先试 eMMC,失败后回退到 SPI NOR 启动恢复程序。