1. 启动方式
2. 头部信息
编译好的bin文件烧写到SD卡中,需要加一些头部文件,才可以执行。
- Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。
- Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
- Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
- 用户代码执行文件,即bin文件。
链接起始地址为0x87800000,IVT+Boot Data+DCD的大小大约是3KB,所以load.imx文件起始地址就是0x87800000-0x3072 = 0x877FF004
2.1 IVT和BootData
load.imx 最前面的就是 IVT 和 Boot Data,IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移。
烧写到SD卡时,要从第三个扇区开始烧写,前两个扇区是SD卡配置的, 加起来大概占用1kB。因此在bin文件其实是从第四个字节开始的,但是,当我们打开load.imx文件时发现bin文件是从0x0C(第三个字节)开始的,那是因为我们还没把load.imx放到SD卡或者ddr中,当然就是4-1 = 3KB了。
IVT
因为是大端模式,32字节
- 0x402000D1 : header, Tag为D1,在大端模式下为20表示占32字节,40是版本号
- 0x87800000 : 这个是链接地址
- 0x00000000 : 保留
- 0x877FF42C : DCD 地址,镜像地址为 0X87800000,IVT+BootData+DCD 整个大小为 3KByte。因此 load.imx 的起始地址就是 0X87800000-0XC00=0X877FF400。因此 DCD 起始地址相对于 load.imx 起始地址的偏移就是0X877FF42C-0X877FF400=0X2C
- 0x877FF420 : boot 地址,header 里面已经设置了 IVT 大小是 32个 字 节 , 所 以 boot data 的 地 址 就 是0X877FF400+32=0X877FF420
- 0x877FF400 : IVT 复制到 DDR 中以后的首地址。
- 0x00000000 : 保留
- 0x00000000 : 保留
bootData
- 0X877FF000:整个imx文件的起始地址,包括最开始保留的1kb,就是0x400
- 0x00200000:为2M表示最大文件不能超过2M
- 0x00000000:插件
2.2 DCD
复位以后,I.MX6U 片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此 I.MX6U 提出了一个 DCD(Device Config Data)的概念,和 IVT、Boot Data 一样,DCD 也是添加到 load.imx 里面的,紧跟在 IVT和 Boot Data 后面,IVT 里面也指定了 DCD 的位置。DCD 其实就是 I.MX6U 寄存器地址和对应的配置信息集合,Boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化 DDR 等等。DCD 区域不能超过 1768Byte。
DCD 里面的初始化配置主要包括三方面:
①、设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
②、配置 DDR3 所用的所有 IO。
③、配置 MMDC 控制器,初始化 DDR3。