IMX6ULL启动流程
IMX6ULL启动流程解析:从Boot ROM到系统启动 IMX6ULL处理器的启动流程分为多个阶段:上电后首先执行片内固化的Boot ROM代码,该代码根据BOOT_MODE寄存器和eFuse配置选择启动设备(如eMMC/SD卡等)。关键设置BT_FUSE_SEL决定从eFuse还是GPIO获取启动配置,支持开发调试与量产两种模式。Boot ROM支持HAB安全验证,若验证失败则转入串行下载模式
IMX6ULL启动流程
IMX6ULL的启动流程可以分为以下几个阶段:
- 上电
- BootROM: 芯片内部固化的只读代码, 负责初始化硬件并加载引导加载程序(如 U-boot).
- 引导设备选择: Boot ROM 根据 BT_FUSE_SEL 和 GPIO 配置选择启动设备(如 eMMC、SD 卡、NAND 等)。
- 加载引导程序: 从选择的引导设备中加载引导程序(如从 EMMC中加载 U-boot).
- HAB启动: 如果开启了HAB( High Assurance Boot), Boot ROM 会先验证引导程序的签名。
- 系统启动: 引导程序验证通过后(如开启了HAB),加载并启动系统。
这篇文章主要介绍从上电到Boot ROM阶段。本文主要参考IMX6ULL的参考手册 i.MX 6ULL Applications Processor Reference Manual。
Boot ROM
Boot ROM 的主要功能包括:
• 支持从多种启动设备启动
• 支持串行下载器(USB OTG 和 UART)
• 支持设备配置数据(DCD)和插件
• 支持基于数字签名和加密的高保证启动(HAB)
• 支持从低功耗模式唤醒
Boot 的启动流程:

从上电(Power-On Reset, POR)开始, ARM 内核开始执行片上的 Boot ROM. Boot ROM 对应的内存地址:
Boot ROM 首先读取 BOOT_MODE[1:0] 寄存器(由BOOT_MODE0 和 BOOT_MODE1这2个IO口设置), eFuse 和 相关GPIO(BOOT_CFG1~4)的设置来选择启动设备。
Boot ROM 支持的启动设备包括: NOR/NAND/OneNAND flash, SD/MMC, SPI/QSPI flash 等。
Boot Mode 的设置
Boot Mode 的设置主要由 BOOT_MODE0, BOOT_MODE1两个IO引脚的状态决定:

Note
上面三种模式都支持 HAB功能。
启动设备的选择
启动设备的选择由 BOOT_CFG1[6:4]来设置,对应关系见下图:
Boot ROM通过以下步骤选择启动设备和启动配置:
- 读取BT_FUSE_SEL:
BT_FUSE_SEL 是 eFuse 中的一个位(位于 SRC_SBMR1 寄存器中),用于决定启动配置的控制方式。
- BT_FUSE_SEL = 1:
- 所有启动选项由 eFUSE 控制。
- 启动配置固定,无法通过 GPIO 覆盖。
- 适用于量产设备。
- BT_FUSE_SEL = 0:
- 启动配置可以通过 GPIO 引脚设置。
- 部分 eFUSE 设置可以被 GPIO 覆盖(具体可覆盖的参数见表 8-2)。
- 适用于开发阶段。
BT_FUSE_SEL在eFuse里的位置及描述见下图:
- GPIO设置
-
如果 BT_FUSE_SEL = 0,Boot ROM 会读取 GPIO 的状态(BOOT_CFGx[y] 引脚)来决定启动设备。
-
GPIO 的状态对应不同的启动设备(如 eMMC、SD 卡、NAND 等)。

-
GPIO boot config 的引脚及和efuse的映射关系如下图:

-
可以通过 GPIO 覆盖的 eFUSE 参数, 参见下图的BOOT_CFG

-
GPIO 覆盖的适用场景
- 开发阶段:
- 通过 GPIO 覆盖 eFUSE 设置,快速测试不同的启动配置。
- 例如:
- 通过 GPIO 切换启动设备(如 eMMC 和 SD 卡)。
- 临时禁用 HAB,方便调试未签名的代码。
- 量产阶段:
- GPIO 覆盖不适用,因为 GPIO 引脚可能用于其他功能。
- 建议通过 eFUSE 固定启动配置,确保稳定性和安全性。
- 开发阶段:
- eFuse设置
-
如果 BT_FUSE_SEL = 1,Boot ROM 会直接读取 eFuse 中的启动配置。
-
eFuse 的配置具体信息可以参考
imx6ullRM的8.3.1 Boot eFUSE descriptions。
-
eFuse 中的配置可以通过以下方式设置:
- 使用 imx-mkimage 工具生成 eFuse 配置文件。
- 通过 U-Boot 命令 fuse prog 烧录 eFuse。
Boot From Fuses mode
这个模式和Internal Boot mode模式相似, 唯一的不同点是这个模式只会从eFuse里读取设置, 不会读取 BOOT_CFG 的状态。
- BT_FUSE_SEL = 0: 表示启动设备(SD/EMMC 等)里没有程序, 直接跳转到Serial Downloader
- BT_FUSE_SEL = 1:遵循上面的boot 启动流程,ROM尝试从选定的启动设备启动。
当板卡首次使用时,默认的 eFUSE 可能与平台上的硬件配置不匹配。在这种情况下,Boot ROM 代码可能会尝试从不存在的设备启动。这可能会导致某些引脚(pad)上出现电气/逻辑冲突。
使用“从 eFuse 启动模式”可以解决这个问题。
设置 BT_FUSE_SEL=0 会强制 ROM 代码直接跳转到Serial Downloader。
这允许下载一个bootloader,该程序可以用bootloader配置启动设备,并烧录BT_FUSE_SEL和其他启动配置 eFUSE。
复位后,Boot ROM 代码检测到BT_FUSE_SEL已被烧录(BT_FUSE_SEL = 1),并根据新的 eFUSE 设置执行内部启动。
这允许用户在生产设备上设置BOOT_MODE[1:0]=00b,并在同一设备上烧录 eFuse(通过强制进入Serial Downloader),
而无需更改 BOOT_MODE[1:0] 的值。
Serial Downloader
串行下载器是 i.MX 6ULL 芯片内置的一种功能,允许通过串行接口(如 USB OTG 或 UART)将程序映像(如 U-Boot、操作系统内核)下载到芯片中。
它是一种恢复或调试机制,用于在无法从常规启动设备(如 eMMC、SD 卡)加载代码时,通过外部主机(如 PC)直接下载代码。
-
工作原理:
- 芯片检测到无有效启动设备时,会自动进入串行下载模式。
- 主机通过 USB OTG 或 UART 与芯片通信,发送程序映像。
- 芯片接收并执行下载的程序映像。
-
串行下载流程
2.1 进入串行下载模式:
- 芯片上电后,检测到无有效启动设备(如 eMMC 或 SD 卡中无有效引导加载程序)。
- 芯片自动进入串行下载模式,等待主机连接。
2.2 主机连接:
- 主机通过 USB OTG 或 UART 连接到芯片。
- 主机运行下载工具(如 NXP 的 uuu 工具或 imx_usb_loader)。
2.3 下载程序映像:
- 主机发送程序映像(如 U-Boot)到芯片。
- 芯片接收并存储程序映像到内存(如 RAM)。
2.4 执行程序映像:
- 芯片跳转到程序映像的入口地址,开始执行。
- 如果程序映像是引导加载程序(如 U-Boot),则继续加载操作系统。

- 应用场景
- 开发阶段:
- 快速下载和调试程序映像。
- 例如:
- 通过 USB OTG 下载 U-Boot 到开发板。
- 通过 UART 下载小容量测试程序。
- 量产阶段:
- 批量烧录固件到芯片。
- 例如:
- 通过 USB OTG 将生产固件写入 eMMC。
- 恢复模式:
- 当设备因固件损坏无法启动时,通过串行下载器恢复系统。
- 例如:
- 通过 UART 下载恢复程序,修复损坏的引导加载程序。
- 例如:
- 当设备因固件损坏无法启动时,通过串行下载器恢复系统。
Internal Boot mode
Boot ROM 初始化硬件,从选定的启动设备加载image, 使用HAB(如果开启了HAB功能)验证image,然后跳转到image。如果在启动过程中出现错误,Boot ROM 会直接跳转到 Serial Downloader 。
总结
本文粗略介绍了 imx6ull Boot ROM 的基本启动流程, 包括 Boot ROM 的基本功能, boot mode的选择, BT_FUSE_SEL不同设置对应的启动控制方式,启动控制方式中 eFuse 的内容, GPIO和eFuse的映射关系等。
更多推荐



所有评论(0)