概述:I.MX6ULL支持多种启动方式,比如可以从 SD/EMMC、NAND Flash、QSPI Flash等启动从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头。
一,启动方式选择:
BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝)(只能改变一次),一种是修改相应的 GPIO 高低电平。
BOOT启动方式如下:
| BOOT_MODE[1:0] | BOOT类型 |
|---|---|
| 00 | 从FUSE启动 |
| 01 | 串行下载 |
| 10 | 内部boot模式 |
| 11 | 保留 |
注:内部boot模式下,芯片会执行boot ROM里面的代码,对一些外设进行初始化,然后从boot设备中(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。
BOOT ROM初始化内容
boot rom会首先初始化时钟,主频,系统时钟,USB,总线时钟,为了加快速度,还会启动cache(高速缓存)和MMU(内存管理单元)下载镜像的时候 L1 ICache 会打开,验证镜像的时候 L1 DCache、L2 Cache 和 MMU 都会打开。一旦镜像验证完成,boot ROM就会关闭 L1 DCache、L2 Cache 和 MMU,中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码以后就可一重新设置中断偏移量,一般设置为用户代码的开始地方。
二,启动设备选择:当选择使用内部boot模式后通过配置不同的gpio来选择启动设备。在正点原子开发板中使用拨码开关来控制启动设备。
三,镜像烧写:
在stm32中直接可以将bin文件烧写到单片机flash里面,但是在IMX6Ull中,需要加上头信息
主要包括:
1>Image vector table 简称:IVT,IVT里面包含了一系列的地址信息,这些地址信息在ROM中按照顺序存放着。
2>Boot data包含了,镜像拷贝的地址,拷贝的大小等。
3>Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置
4>用户的可执行代码,比如bin文件。
…IVT和boot data
概述:
IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移。
以sD举例说明,IVT需要偏移1个字节,所以IVT+boot data+DCD为三个字节,所以在DDR中的地址为(以0x87800000为代码起始地址)0x87800000-3072=0x877ff400。
1>IVT格式:
第一个存放的就是header,header的格式如下:
Tag为一个字节长度,固定为0xd1,lengh是两个字节,保存着IVT长度,为大端模式(也就是高字节存放在低内存中)。最后的Version固定是一个字节,为0x40或者0x41.
2>boot data数据格式如下:
从正点原子的镜像文件截取一部分:
我们将前 44 个字节的数据按照 4 个字节一组组合在一起就是:0X402000D1、 0X87800000、0X00000000、0X877FF42C、0X877FF420、0X877FF400、0X00000000、0X00000000、 0X877FF000、0X00200000、0X00000000。这 44 个字节的数据就是 IVT 和 Boot Data 数据,按
照上面图片 所示的 IVT 和 Boot Data 所示的格式对应起来
补充:DCD的主要配置的东西就是
1>设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
2>配置 DDR3 所用的所有 IO。
3>配置 MMDC 控制器,初始化 DDR3
注:此文多参考正点原子资料