Skip to content

LV015-启动流程

i.MX6UL 支持多种启动方式,而具体硬件平台支持的启动方式与选择的存储器有关,前面一节的笔记已经学习了如何选择启动设备以及设置启动设备的参数,这里我们来了解一下系统如何启动,更详细说明请参考《i.MX 6UltraLite Applications Processor Reference Manual》第 8 章 System Boot。

一、启动流程

1. 流程图

这一部分我们参考一下《i.MX 6ULL Applications Processor Reference Manual 》的 8.2.2 High-level boot sequence ,这里有一张流程图:

image-20260114123731379

这个流程图是一个大概的流程,总结一下就是:

(1)检查 CPU ID。

(2)检查 Reset Type,就是检查一下复位状态。复位或者上电、唤醒的启动过程是不一样的。

(3)检查启动模式寄存器 BOOT_MODE,检查 eFUSE 或 GPIO,获取启动方式。

(4)根据上述检查从 USB 口、 UART 口或是某个启动设备下载 boot image,也就是加载程序映像。

(5)认证 image,就是校验一下映像。

(6)跳转到映像执行。

对于具体的启动设备,《i.MX 6ULL Applications Processor Reference Manual 》的《Chapter 8: System Boot》中有对应章节描述更为细致的启动流程。基本上就是对这些启动设备根据 eFUSE 或 GPIO 的设置进行初始化,尝试更高的工作频率等。

2、流程分析

2.1 检查 CPU 的 ID

系统上电或硬件复位后,CPU 从 0x0000 0000 地址开始 执行 boot ROM 代码。boot ROM 代码首先会检查 CPU 的 ID。 这一步官方手册中也没有过多介绍,这里默认检测通过。

2.2 检查复位状态

一种情况是正常的硬件复位另外一种情况是从低功耗模式唤醒。这里先忽略低功耗模式唤醒的情况,继续向下执行。

2.3 检查启动方式

前面已经学习过启动方式了,在开发阶段我们可以通过设置 i.MX6UL 启动相关引脚的电平状态来改变芯片的启动方式。 BOOT_MODE [1:0] = 10B ,i.MX6UL 将会从“内部”启动,所谓“内部”是相对于“Serial Download”来说的, “内部”可以认为是 i.MX6UL 支持的启动存储设备,例如 emmc、nandflash、SD card、norFlash 等等。 具体从那种“内部”设备启动,由 BOOT_CFG1 [7:4] 决定,如下表所示:

BOOT_CFG1 [7:4]Boot device
0000NOR/OneNAND (EIM) (本教程配套开发板没有用到)
0001QSPI(norFlash 启动)
0011Serial ROM (SPI)(本教程配套开发板没有用到)
010xSD/eSD/SDXC(SD 卡启动)
011xMMC/eMMC(emmc 启动)
1xxxRaw NAND(nandflash 启动)

2.4 加载程序映像

知道启动方式后 boot ROM 代码并不能立即加载启动映像,因为我们的代码保存在芯片外部存储设备, 从这些存储设备读数据之前首先要进行初始化。在 Boot ROM 程序根据保存在芯片中的默认配置信息配置这些存储器接口。 使用默认的配置信息配置存储器接口大多数情况下并不能发挥外设的最大性能, 还需要使用 DCD(Device Configuration Data)进行二次配置。

DCD 是一个表,表中包含的配置信息,它用于配置各种外围设备,例如 NOR flash、DDR 等等。既然 DCD 保存在 程序映像中,Boot ROM 怎么找到 DCD 呢? DCD 地址信息保 存在 IVT(Image Vector Table)中,boot ROM 通过读取 IVT 得到 DCD 地址信息。

同样 IVT 是也是一个表或者说是一个数据结构,它保存有 DCD 数据的地址、程序的入口等等信息。 启动方式确定后 boot ROM 从固定地址读取 IVT。如下表所示(在《i.MX 6UltraLite Applications Processor Reference Manual》的 8.7.1 Image Vector Table and Boot Data ):

image-20260114123309578

从上表可知,IVT 在存储器中的偏移值是固定的。以 SD 卡为例,如果从 SD 卡启动,那么 IVG 位于 SD 卡的 0x400 偏移地址处,也就是 1KB 的位置。初始化完成后,boot ROM 便可以加载我们编写的程序。

上面的 DCD 和 IVT 后面还会详细再学习。

2.5 校验映像

在程序执行之前还要进行 HAB 校验。 HAB 可以防止攻击者修改可编程内存中的代码或数 据区域,HAB 校验更详细的内容请参 考《i.MX 6UltraLite Applications Processor Reference Manual》 8.3.1 High-Assurance Boot (HAB)。

2.6 跳转到映像去执行

以 SD 卡启动为例,在执行跳转之前 boot ROM 已经将代码从 SD 卡加载到了 DDR,所以直接跳转到程序的入口地址即可。

二、串行下载流程

这一部分我们参考一下《i.MX 6ULL Applications Processor Reference Manual 》的 8.2.4 Serial Downloader ,这里有一张流程图:

image-20260114123428675

这个大概就是这样子,其实跟前边学习 STM32 的时候那个流程是很类似的。

i.MX6UL 的启动流程——野火