主要参照《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 引脚电平确定。

imx6ull emmc模式启动_字段


启动顺序见下图:

imx6ull emmc模式启动_imx6ull_02


总结

Boot From Fuses - 只能通过熔丝选择启动设备(只能修改一次),不常用。

Serial Downloader - 一种通过USBUART串行连接将程序映像下载到芯片的方法。常使用此方法向 eMMC 和 NAND 中烧录镜像。

Internal Boot - 通过 GPIO 引脚电平熔丝方式选择启动设备。

三、启动设备

1、设备启动GPIO引脚

imx6ull emmc模式启动_缓存_03


imx6ull emmc模式启动_缓存_04

2、启动设备选择

外部启动设备类型的选择由**BOOT_CFG1[7:4]**值决定。

imx6ull emmc模式启动_imx6ull emmc模式启动_05

3、启动设备配置

imx6ull emmc模式启动_字段_06


imx6ull emmc模式启动_imx6ull_07


imx6ull emmc模式启动_缓存_08


注:详细设置看参考手册第五章

四、设备初始化

1、内部的ROM/RAM内存映射

imx6ull emmc模式启动_数据_09


启动后可以自由使用整个OCRAM区域。

2、时钟

下表显示了ROM使用的各种时钟它们的来源

imx6ull emmc模式启动_字段_10


复位后,每个Arm 内核都可以访问所有外设。ROM代码禁用下表中列出的时钟,除了第二列中列出的启动设备

imx6ull emmc模式启动_imx6ull emmc模式启动_11


imx6ull emmc模式启动_数据_12

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异常向量表:

imx6ull emmc模式启动_数据_13

5、引导期间的中断处理

在引导过程中不需要特殊的中断处理例程。中断在启动ROM执行期间被禁用,并可能在以后的启动阶段被启用。

五、IVT 和 Boot data

Bin文件前需要添加头部。

1、IVT

映像向量表(Image Vector Table, IVT)是ROM从启动设备中读取的数据结构,该启动设备提供包含执行成功启动所需数据组件的程序映像。

IVT包括程序映像入口点指向设备配置数据(DCD)的指针引导过程中ROM使用的其他指针。ROM将IVT定位在由连接到芯片的启动设备决定的固定地址上。每个启动设备类型的IVT从基址初始加载区域大小偏移量定义在下表中。IVT的位置是ROM唯一固定的要求。剩余部分或映像内存映射灵活的,由IVT的内容决定。

imx6ull emmc模式启动_数据_14


imx6ull emmc模式启动_imx6ull emmc模式启动_15


IVT有如下格式,其中每个条目是一个32位的字:

imx6ull emmc模式启动_imx6ull_16


imx6ull emmc模式启动_imx6ull emmc模式启动_17


imx6ull emmc模式启动_数据_18


注:IVT 一共 8 个字段,因此占用空间 32 字节。

2、Boot data

引导数据必须遵循表中定义的格式,每个条目是一个32位的单词。

imx6ull emmc模式启动_数据_19


注:Boot data 一共 3 个字段,因此占用空间 12 字节。

六、DCD

复位后,芯片使用系统中所有外设的默认寄存器值。然而,这些设置通常不是实现最佳系统性能理想设置,甚至有些外围设备在使用之前必须进行配置。

DCD是包含在程序映像(ROM外部)中的配置信息,ROM将其解释为配置芯片上的各种外设。

ROM根据位于Image Vector table (IVT)中的信息确定DCD表的位置。DCD的最大尺寸被限制为1768b。

imx6ull emmc模式启动_imx6ull_20


DCD头为4b,格式如下:

imx6ull emmc模式启动_imx6ull emmc模式启动_21


imx6ull emmc模式启动_数据_22

1、写入数据命令

write data命令用于将给定的1、2或4字节值(或位掩码)的列表写入相应的目标地址列表。

写数据命令的格式(以大端字节数组的形式)显示在这个表中:

imx6ull emmc模式启动_字段_23


imx6ull emmc模式启动_imx6ull emmc模式启动_24


imx6ull emmc模式启动_imx6ull emmc模式启动_25


参数字段是一个划分为位域单个字节,如下所示:

imx6ull emmc模式启动_缓存_26


imx6ull emmc模式启动_缓存_27


可以指定一个多个 目标地址值位掩码对。相同的bytes’ and flags’参数适用于命令中的所有位置。成功时,该命令按照如下标志写入每个目标地址:

imx6ull emmc模式启动_字段_28


注:如果任何目标地址参数字段中指示的数据宽度没有相同的对齐方式,则不写入任何值。如果任何值大于或任何位掩码大于参数字段中指定的数据宽度所允许的范围,则不写入任何值。如果任何目标地址不在允许的区域内,则不写入任何值。下面提供了芯片的允许块和目标地址列表。

imx6ull emmc模式启动_字段_29

2、检查数据命令

check data命令用于从源地址测试给定的1-、2-或4字节的位掩码

check data命令是一个大端字节数组,格式如该表所示:

imx6ull emmc模式启动_imx6ull_30


imx6ull emmc模式启动_数据_31


参数字段是一个划分为位域单个字节,如下所示:

imx6ull emmc模式启动_imx6ull emmc模式启动_32


imx6ull emmc模式启动_字段_33


此命令轮询源地址,直到满足退出条件或达到轮询计数为止。退出条件由如下标志决定:

imx6ull emmc模式启动_缓存_34


注:如果源地址与参数字段中指定的数据宽度没有相同的对齐方式,则不读取该值。如果位掩码大于参数字段中指定的数据宽度所允许的范围,则不读取该值。

3、NOP指令

该命令无效

NOP命令的格式为大端四字节数组,如下表所示:

imx6ull emmc模式启动_数据_35


imx6ull emmc模式启动_imx6ull_36

4、解锁命令

unlock命令用于退出ROM时,防止特定引擎特性被锁定。

这个表显示了unlock命令的格式(以大端字节数组的形式):

imx6ull emmc模式启动_imx6ull_37


imx6ull emmc模式启动_字段_38


:如果配置SEC_CONFIG为closed,则不能在DCD结构中使用此命令。