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通过以下步骤选择启动设备和启动配置:

  1. 读取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里的位置及描述见下图:
BT_FUSE_SEL在eFuse里的位置及描述

  1. GPIO设置
  • 如果 BT_FUSE_SEL = 0,Boot ROM 会读取 GPIO 的状态(BOOT_CFGx[y] 引脚)来决定启动设备。

  • GPIO 的状态对应不同的启动设备(如 eMMC、SD 卡、NAND 等)。
    在这里插入图片描述

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

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

  • GPIO 覆盖的适用场景

    • 开发阶段:
      • 通过 GPIO 覆盖 eFUSE 设置,快速测试不同的启动配置。
      • 例如:
        • 通过 GPIO 切换启动设备(如 eMMC 和 SD 卡)。
        • 临时禁用 HAB,方便调试未签名的代码。
    • 量产阶段:
    • GPIO 覆盖不适用,因为 GPIO 引脚可能用于其他功能。
    • 建议通过 eFUSE 固定启动配置,确保稳定性和安全性。
  1. eFuse设置
  • 如果 BT_FUSE_SEL = 1,Boot ROM 会直接读取 eFuse 中的启动配置。

  • eFuse 的配置具体信息可以参考imx6ullRM8.3.1 Boot eFUSE descriptions
    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)直接下载代码。

  1. 工作原理:

    • 芯片检测到无有效启动设备时,会自动进入串行下载模式。
    • 主机通过 USB OTG 或 UART 与芯片通信,发送程序映像。
    • 芯片接收并执行下载的程序映像。
  2. 串行下载流程

2.1 进入串行下载模式:

  • 芯片上电后,检测到无有效启动设备(如 eMMC 或 SD 卡中无有效引导加载程序)。
  • 芯片自动进入串行下载模式,等待主机连接。

2.2 主机连接:

  • 主机通过 USB OTG 或 UART 连接到芯片。
  • 主机运行下载工具(如 NXP 的 uuu 工具或 imx_usb_loader)。

2.3 下载程序映像:

  • 主机发送程序映像(如 U-Boot)到芯片。
  • 芯片接收并存储程序映像到内存(如 RAM)。

2.4 执行程序映像:

  • 芯片跳转到程序映像的入口地址,开始执行。
  • 如果程序映像是引导加载程序(如 U-Boot),则继续加载操作系统。
    在这里插入图片描述
  1. 应用场景
  • 开发阶段:
    • 快速下载和调试程序映像。
    • 例如:
      • 通过 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的映射关系等。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐