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 视角下的识别路径与镜像布局差异:
二、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 配置头 | 高速 | 多设备、复杂时序 |