主要参照《iMX6ULL参考手册》中第5章:Fusemap 和第8章:Chapter 8 System Boot(系统启动)。
一、概述
启动过程从开机复位开始,硬件复位逻辑单元芯片片上引导ROM开始执行。
片上引导ROM代码使用内部寄存器BOOT_MODE[1:0]的状态以及各种 eFUSEs 和或 GPIO 设置的状态来确定设备的引导流行为。
片上ROM的主要特点包括:
- 支持从各种启动设备启动
- 串行下载支持(USB OTG和UART)
- 设备配置数据(DCD)和插件
- 基于数字签名和加密的高保证引导(HAB)
- 从低功耗模式唤醒
片上ROM支持这些启动设备:
- NOR flash
- NAND flash
- OneNAND flash
- SD/MMC
- Serial (SPI) NOR flash and EEPROM
- QuadSPI (QSPI) flash
二、启动模式
iMX6ULL 支持四种启动模式(一种为NXP使用预留)。根据存储在内部 BOOT_MODE 寄存器中的二进制值选择启动模式。
BOOT_MODE 寄存器值在启动时根据 BOOT MODE0 和 BOOT MODE1 引脚电平确定。
启动顺序见下图:
总结:
Boot From Fuses - 只能通过熔丝选择启动设备(只能修改一次),不常用。
Serial Downloader - 一种通过USB和UART串行连接将程序映像下载到芯片的方法。常使用此方法向 eMMC 和 NAND 中烧录镜像。
Internal Boot - 通过 GPIO 引脚电平或熔丝方式选择启动设备。
三、启动设备
1、设备启动GPIO引脚
2、启动设备选择
外部启动设备类型的选择由**BOOT_CFG1[7:4]**值决定。
3、启动设备配置
注:详细设置看参考手册第五章。
四、设备初始化
1、内部的ROM/RAM内存映射
启动后可以自由使用整个OCRAM区域。
2、时钟
下表显示了ROM使用的各种时钟和它们的来源。
复位后,每个Arm 内核都可以访问所有外设。ROM代码禁用下表中列出的时钟,除了第二列中列出的启动设备。
3、启用MMU和缓存
内部ROM包括一个特性,使能内存管理单元(MMU)和缓存提高启动速度。
L1指令缓存在映像下载开始时启用。在进行映像认证时,L1数据缓存、L2缓存和MMU开关开启。HAB认证完成后,ROM关闭L1数据缓存、L2缓存和MMU。
L1指令缓存、L1数据缓存、L2缓存和MMU由eFuse控制。默认情况下,这些特性是启用的。
4、异常处理
位于ROM开始位置的异常向量用于将所有Arm异常(除重置异常)映射到内部RAM中的重复异常向量表。
在CPU0的引导阶段,RAM向量指向ROM中的串行下载程序。
引导后,程序映像可以根据需要覆盖向量。下面所示的代码用于将ROM异常向量表映射到RAM中的重复异常向量表。
映射ROM异常向量表:
5、引导期间的中断处理
在引导过程中不需要特殊的中断处理例程。中断在启动ROM执行期间被禁用,并可能在以后的启动阶段被启用。
五、IVT 和 Boot data
Bin文件前需要添加头部。
1、IVT
映像向量表(Image Vector Table, IVT)是ROM从启动设备中读取的数据结构,该启动设备提供包含执行成功启动所需数据组件的程序映像。
IVT包括程序映像入口点、指向设备配置数据(DCD)的指针和引导过程中ROM使用的其他指针。ROM将IVT定位在由连接到芯片的启动设备决定的固定地址上。每个启动设备类型的IVT从基址和初始加载区域大小的偏移量定义在下表中。IVT的位置是ROM唯一固定的要求。剩余部分或映像内存映射是灵活的,由IVT的内容决定。
IVT有如下格式,其中每个条目是一个32位的字:
注:IVT 一共 8 个字段,因此占用空间 32 字节。
2、Boot data
引导数据必须遵循表中定义的格式,每个条目是一个32位的单词。
注:Boot data 一共 3 个字段,因此占用空间 12 字节。
六、DCD
复位后,芯片使用系统中所有外设的默认寄存器值。然而,这些设置通常不是实现最佳系统性能的理想设置,甚至有些外围设备在使用之前必须进行配置。
DCD是包含在程序映像(ROM外部)中的配置信息,ROM将其解释为配置芯片上的各种外设。
ROM根据位于Image Vector table (IVT)中的信息确定DCD表的位置。DCD的最大尺寸被限制为1768b。
DCD头为4b,格式如下:
1、写入数据命令
write data命令用于将给定的1、2或4字节值(或位掩码)的列表写入相应的目标地址列表。
写数据命令的格式(以大端字节数组的形式)显示在这个表中:
参数字段是一个划分为位域的单个字节,如下所示:
可以指定一个或多个 目标地址和值位掩码对。相同的bytes’ and flags’参数适用于命令中的所有位置。
成功时,该命令按照如下标志写入每个目标地址:
注:如果任何目标地址与参数字段中指示的数据宽度没有相同的对齐方式,则不写入任何值。如果任何值大于或任何位掩码大于参数字段中指定的数据宽度所允许的范围,则不写入任何值。如果任何目标地址不在允许的区域内,则不写入任何值。下面提供了芯片的允许块和目标地址列表。
2、检查数据命令
check data命令用于从源地址测试给定的1-、2-或4字节的位掩码。
check data命令是一个大端字节数组,格式如该表所示:
参数字段是一个划分为位域的单个字节,如下所示:
此命令轮询源地址,直到满足退出条件或达到轮询计数为止。退出条件由如下标志决定:
注:如果源地址与参数字段中指定的数据宽度没有相同的对齐方式,则不读取该值。如果位掩码大于参数字段中指定的数据宽度所允许的范围,则不读取该值。
3、NOP指令
该命令无效。
NOP命令的格式为大端四字节数组,如下表所示:
4、解锁命令
unlock命令用于退出ROM时,防止特定引擎特性被锁定。
这个表显示了unlock命令的格式(以大端字节数组的形式):
注:如果配置SEC_CONFIG为closed,则不能在DCD结构中使用此命令。