4. 分区表基本概念

芯片上电后,BootROM 要做的第一件事就是——搞清楚自己该从哪儿把代码搬进来。是 SPI Flash?是 eMMC?还是 USB 下载?这个选择不是拍脑袋决定的,而是有一套硬件级的决策机制。

我早年做一款车规级芯片时,就遇到过启动选择逻辑被误触发的问题。排查了整整两天,最后发现是板子上一个上拉电阻虚焊了。嗯,从那以后我对 BootROM 的启动选择机制就格外上心。

4.1 启动选择的硬件基础

BootROM 本身是一段只读代码,固化在芯片内部。它没有智能到能自动识别外接了什么存储设备。所以,芯片厂商会提供两种方式来告诉 BootROM:「嘿,从这儿启动!」

  • 引脚电平采样:芯片复位时,采样一组专用 GPIO 的电平状态
  • eFuse 配置:一次性编程的熔丝,出厂时或第一次启动时烧录
  • 优先级规则:通常 eFuse 优先级高于引脚,引脚高于默认值

核心原则:BootROM 在复位释放后的几十个时钟周期内,必须完成启动源的锁定。这个窗口期非常短,一旦错过,芯片就会走默认路径。

4.2 引脚电平采样机制

说白了,就是芯片上电时读一组 GPIO 的电平。高电平代表 1,低电平代表 0。把这几个 bit 拼起来,就是一个启动模式编号。

举个例子,我参与过的一个 SoC 项目是这样设计的:

BOOT[2:0] 引脚电平 启动设备 典型应用场景
000 SPI NOR Flash 低成本物联网设备
001 SPI NAND Flash 需要大容量存储
010 eMMC 高性能嵌入式系统
011 SD 卡 开发调试阶段
100 USB 下载模式 工厂烧录、固件升级
101 UART 下载模式 紧急恢复
110 NAND Flash 老旧系统兼容
111 JTAG 调试模式 芯片级调试

个人经验:我建议在设计 PCB 时,给这些启动选择引脚加上 10kΩ 的下拉或上拉电阻。不要依赖芯片内部弱上拉,那玩意儿在噪声环境下不太靠谱。我曾经见过一批板子,就是因为内部弱上拉被耦合噪声覆盖,导致启动模式随机跳变。

4.3 eFuse 一次性编程

eFuse 是什么?你可以把它理解成芯片内部的一排微型保险丝。出厂时都是通的(0),用高电压脉冲可以烧断(1)。一旦烧断,就再也恢复不了了。

为什么需要 eFuse?你想想看,有些产品出厂后就不希望用户随意更改启动模式。比如消费级路由器,你总不希望用户把启动模式改成从 SD 卡启动吧?

eFuse 的典型应用场景:

  • 安全启动锁定:强制从只读存储器启动,防止代码注入
  • 量产配置固化:同一颗芯片可以针对不同客户烧录不同的启动配置
  • 功能安全要求:某些车规级芯片要求启动路径不可更改

避坑指南:我曾经在量产阶段遇到过一个大坑——eFuse 烧录时序没给够,导致部分芯片的 eFuse 值读出来是 0 和 1 的混合态。BootROM 读到这种非法组合,直接卡死在初始化循环里。所以,eFuse 烧录一定要做校验回读,别省这一步。

4.4 决策优先级与流程

BootROM 内部有一套固定的决策逻辑。我把它画成了流程图,方便你理解:

BootROM 启动模式决策流程图 BootROM 启动模式决策流程 芯片上电复位 检查 eFuse 启动配置位 是否已烧录有效值? 是 否 使用 eFuse 配置值 忽略引脚电平 采样 BOOT 引脚电平 读取 GPIO 状态 映射启动设备编号 查表获取设备类型和参数 初始化对应外设控制器 SPI / MMC / USB 等 读取启动头 / 签名 验证合法性 加载 SPL / 引导程序并跳转 注意: 若启动头校验失败 回退到下一个启动源

这个流程看起来简单,但实际实现时有很多细节。我挑几个关键点说说:

4.5 启动源回退机制

BootROM 不是一根筋的。如果首选启动设备上没有找到有效的启动头,它会尝试下一个。这个机制叫「启动源回退」。

典型的回退顺序:

  1. 首选:eFuse 指定的设备(如果已烧录)
  2. 次选:引脚电平指定的设备
  3. 兜底:芯片内部默认设备(通常是 SPI Flash 或 USB)
  4. 最后:进入下载模式,等待外部工具干预

关键点:回退机制是 BootROM 的保命符。我见过一个产品,量产时 SPI Flash 虚焊了,但 BootROM 自动回退到 USB 下载模式,工厂的烧录工具直接通过 USB 把固件灌进去,产线没停。如果没有这个机制,那批板子全得返修。

4.6 时序约束与采样窗口

这里有个容易被忽视的问题——采样时序。BootROM 在复位释放后的几十微秒内就要完成引脚采样。如果外部 RC 电路还没稳定,采样结果可能就是错的。

我建议你注意以下几点:

  • 复位信号要干净:复位引脚上不要有毛刺,否则 BootROM 会多次复位,反复采样
  • BOOT 引脚电平要提前稳定:在复位释放前,BOOT 引脚的电平必须已经稳定
  • 避免浮空:所有 BOOT 引脚都要有确定的上拉或下拉,不要依赖芯片内部弱上拉

我曾经踩过的坑:有一款芯片的 BootROM 在复位释放后 50μs 内采样引脚。我们的板子上用了大电容做电源滤波,导致 VDD 上升斜率太缓,芯片内部逻辑复位释放时,BOOT 引脚的电平还没建立起来。结果就是——10 块板子有 3 块启动模式不对。解决方案是把 BOOT 引脚的上拉电阻从 10kΩ 改到 4.7kΩ,加速电平建立。

4.7 多芯片协同启动

在一些复杂系统中,不止一颗芯片需要启动。比如手机里的 AP(应用处理器)和 BP(基带处理器),或者汽车上的域控制器和 MCU。

这时候的启动模式选择就更复杂了:

场景 主芯片启动源 从芯片启动源 同步方式
AP + BP 手机方案 eMMC SPI NOR AP 通过 IPC 通知 BP
域控 + MCU 汽车方案 eMMC SPI Flash MCU 通过硬件信号同步
主控 + 协处理器 SD 卡 内部 ROM 主控加载协处理器固件

我个人习惯在设计多芯片系统时,给每颗芯片的 BOOT 引脚都加上独立的跳线或 DIP 开关。调试阶段可以随时切换启动源,非常方便。量产时再通过 eFuse 固化。

4.8 安全考量

最后聊一个敏感话题——安全。启动模式选择如果被攻击者利用,后果很严重。

常见的攻击手段:

  • 引脚注入:攻击者通过探针强行拉高或拉低 BOOT 引脚,让芯片进入调试模式
  • eFuse 旁路:通过电压毛刺干扰 eFuse 读取电路,让芯片认为 eFuse 未烧录
  • 复位干扰:反复复位芯片,在采样窗口内注入恶意电平

我的建议:如果你的产品有安全要求,一定要启用 BootROM 的「锁定模式」。锁定后,即使外部引脚电平变化,BootROM 也不会改变启动源。这个功能通常通过 eFuse 的一个独立位来控制。嗯,虽然会牺牲一些调试便利性,但安全第一。

好了,关于 BootROM 如何选择启动设备,核心机制就是这些。说白了就是:eFuse 优先,引脚次之,回退兜底。理解了这个决策树,你就能在设计阶段提前规避很多启动相关的问题。