3. 启动介质与镜像格式

i.MX 系列处理器的启动过程有一个非常关键的约束:芯片上电后,最先运行的并不是 U-Boot,而是固化在芯片内部 ROM 中的 Boot ROM。Boot ROM 只做一件事——按照预先约定的规则,从若干候选启动介质中寻找一个“看起来合法”的镜像,把它加载到片内 OCRAM 并跳转执行。因此,理解启动介质与镜像格式,本质上是在理解 Boot ROM 的“识别规则”:它在哪里找、按什么顺序找、看到什么才认为找到了、找到后如何搬运。

本节围绕 SD/eMMC、NAND、NOR、QSPI、FlexSPI 五类介质,梳理它们的启动特性、镜像存放位置以及 Boot ROM 的识别逻辑,并给出可操作的镜像生成与验证方法。

一、Boot ROM 的通用识别流程

无论哪种介质,Boot ROM 的启动判定都遵循一条主线:介质探测 → 引导头校验 → 镜像搬运 → 跳转执行。其中“引导头校验”是识别规则的核心。i.MX 的引导头通常包含 IVT(Image Vector Table)和 Boot Data 结构,IVT 中记录了镜像入口地址、DCD(Device Configuration Data)指针、Boot Data 指针等关键信息。Boot ROM 会检查 IVT 的魔数、长度、校验和等字段,只有全部通过才会继续搬运。

不同介质的差异主要体现在“介质探测”和“引导头存放位置”上。下面这张图展示了五类介质在 Boot ROM 视角下的识别路径与镜像布局差异:

i.MX Boot ROM 上电复位后首先运行 SD/eMMC NAND NOR QSPI FlexSPI SD / eMMC • 扇区寻址,512B/扇区 • 镜像从偏移 0x400 开始 • 支持分区启动(boot0/1) • 识别:读扇区2,查IVT • 速度:高速模式可达 50MHz+ 引导头位于 0x400(扇区2) NAND Flash • 页/块结构,有坏块 • 需 ECC 校验 • 镜像从第1页开始 • 识别:读页0,查FCB • 速度:受ECC与页编程限制 FCB + DBBT 结构 并行 NOR • 随机访问,可XIP • 镜像从偏移 0x1000 开始 • 无需ECC,可靠性高 • 识别:读0x1000,查IVT • 速度:读取快,写入慢 引导头位于 0x1000 QSPI NOR • 4线SPI,支持XIP • 镜像从偏移 0x400 开始 • 需配置LUT与时钟 • 识别:读0x400,查IVT • 速度:4线模式可达 100MHz 引导头位于 0x400 FlexSPI • 灵活SPI • 支持多设备 • 镜像从 0x400 开始 • 识别:查 FSPI头 FSPI配置 Boot ROM 搬运镜像至 OCRAM 校验 IVT → 解析 Boot Data → 加载 DCD → 跳转至入口地址 Boot ROM 识别规则要点 1. 按 eFUSE / GPIO 设定的启动顺序依次探测介质,首个合法镜像即被采用 2. 引导头必须包含合法 IVT(魔数 0xD1 0x00 0x20 0x40),否则跳过该介质 3. NAND 需额外校验 FCB 与 DBBT;QSPI/FlexSPI 需先初始化控制器与 LUT 4. 镜像搬运目标为片内 OCRAM,入口地址由 IVT 中的 self 字段指定

二、SD/eMMC 的启动特性

SD 卡和 eMMC 在 Boot ROM 眼中属于“块设备”,按扇区寻址,每个扇区 512 字节。i.MX 约定引导头位于偏移 0x400,即第 2 个扇区(扇区号从 0 开始)。Boot ROM 会读取该扇区,检查 IVT 魔数是否为 0xD1 0x00 0x20 0x40,并验证长度与校验和。通过后,根据 IVT 中的 Boot Data 字段确定镜像总长度,将整个镜像搬运到 OCRAM。

eMMC 还支持从 boot0/boot1 分区启动,这由 eFUSE 中的 BOOT_PARTITION_ENABLE 位控制。实际工程中,量产时通常把 U-Boot 写入 boot0 分区,而用户数据放在 user 分区,避免误擦除。SD 卡则没有分区启动概念,直接读扇区 2。

生成 SD/eMMC 镜像时,使用 NXP 提供的 mkimage 工具,并指定 -T imximage 类型。一个典型的 imximage.cfg 内容如下:

# imximage.cfg 示例
IMAGE_VERSION 2
BOOT_FROM sd
LOAD_ADDR 0x877FF000
ENTRY_POINT 0x87800000
DCD_WRITE 0x00900000 0x00000004
  ...

执行 mkimage -n imximage.cfg -T imximage -e 0x87800000 -d u-boot.bin u-boot.imx 后,生成的 u-boot.imx 需要写入 SD 卡的 0x400 偏移处。可以用 dd if=u-boot.imx of=/dev/sdX bs=512 seek=2 conv=fsync 完成烧写。验证时,将板子设为 SD 启动,观察串口是否输出 U-Boot 版本信息;若没有任何输出,优先检查 IVT 魔数是否正确、烧写偏移是否为 0x400。

三、NAND 的启动特性

NAND 与块设备的最大区别在于:NAND 存在坏块,且读写以页为单位,必须配合 ECC。i.MX Boot ROM 对 NAND 的识别依赖两个结构:FCB(Firmware Configuration Block) 和 DBBT(Discoverable Bad Block Table)。FCB 位于 NAND 的第 1 页(页 0),其中记录了页大小、块大小、ECC 类型、镜像副本数量等参数。Boot ROM 读取页 0 后,会尝试解析 FCB,若校验失败则尝试页 1 作为备份。

由于 NAND 容易产生坏块,Boot ROM 支持多副本启动:FCB 中可指定镜像在多个块中重复存放,Boot ROM 会依次尝试,直到找到可正确读取的副本。这一机制在量产中非常重要,通常至少保留 2~4 个副本。

生成 NAND 镜像时,使用 kobs-ng 工具或 mkimage 配合 NAND 配置。烧写时需通过 kobs-ng init -x -v u-boot.imx 写入,该工具会自动处理 FCB、DBBT 和坏块跳过。验证时,若串口无输出,应检查 FCB 中的页大小是否与实际 NAND 一致、ECC 强度是否匹配。

四、NOR 与 QSPI 的启动特性

并行 NOR 和 QSPI NOR 都属于“随机访问”介质,支持 XIP(就地执行),但 i.MX Boot ROM 通常仍会将镜像搬运到 OCRAM 后再执行,以保证速度。并行 NOR 的引导头位于偏移 0x1000,而 QSPI NOR 位于偏移 0x400。这个差异来自控制器初始化时序:QSPI 需要先通过 LUT 配置读命令,Boot ROM 在读取 0x400 之前已经完成了控制器初始化。

QSPI 启动的关键在于 LUT(Look-Up Table)配置。Boot ROM 会使用默认的 LUT 序列读取 0x400 处的 IVT,若外部 Flash 的读命令与默认序列不匹配,就会读取失败。因此,使用非标准 QSPI Flash 时,需要在 IVT 之前插入一段 FSPI 配置头,或者通过 eFUSE 指定自定义 LUT。FlexSPI 是 QSPI 的增强版,支持更多设备与更灵活的时序,其识别规则与 QSPI 类似,但配置结构更复杂。

生成 QSPI 镜像时,使用 mkimage -T imximage 并指定 BOOT_FROM qspi,生成的镜像写入 0x400。验证时,若 Boot ROM 在 QSPI 阶段卡住,应优先用示波器检查 SCK 是否有波形,确认控制器是否被正确初始化。

五、五类介质的对比与选型建议

介质 引导头偏移 识别关键 典型速度 适用场景
SD/eMMC 0x400 IVT 魔数 + 校验和 中高速 开发调试、量产
NAND 页 0 FCB + DBBT + ECC 中速 大容量低成本产品
并行 NOR 0x1000 IVT 魔数 读取快 高可靠性工业设备
QSPI NOR 0x400 IVT + LUT 匹配 高速 紧凑型嵌入式产品
FlexSPI 0x400 FSPI 配置头 高速 多设备、复杂时序
选型时,若产品需要现场升级且容量需求大,优先 eMMC;若成本敏感且容量需求中等,可选 NAND;若要求极高可靠性且代码量不大,可选并行 NOR;若 PCB 空间紧张且需要较快启动,QSPI NOR 是常见选择;FlexSPI 则适合需要挂载多个 SPI 设备或使用非标准时序的场合。
无论使用哪种介质,烧写后务必确认引导头偏移与 Boot ROM 约定一致。SD/eMMC 写 0x400、QSPI 写 0x400、并行 NOR 写 0x1000、NAND 写页 0,这些偏移一旦写错,Boot ROM 会直接跳过该介质,表现为串口无任何输出,容易误判为硬件故障。