需要参考I.MX的开发手册来看(已上传到附件)。
BOOT_MODE0和BOOT_MODE1,这两个是两个IO来控制的,是用来选择从USB启动还是内部BOOT启动。如果要烧写系统到开发板中,可以选择从USB下载,下载到SD卡、EMMC、NAND等外置存储中。烧写完后再设置从内部BOOT启动,然后从相应的外置存储中启动。
BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式,I.MX6U 有一个 BOOT_MODE1 引脚和BOOT_MODE0 引脚,这两个引脚对应这 BOOT_MODE[1:0]。 I.MX6U-ALPHA 开发板的这两个引脚原理图如图所示:
前提是你设置BOOT_MODE1和BOOT_MODE0是从内部启动。如参考手册图示:
那支持哪些设备呢?----NOR Flash、one NAND、SD、EMMC、EEPROM,最常用的是SD/EMMC、甚至是QSPI Flash。
如何选择启动设备?
通过BOOT_CONFIG选择,有BOOT_CFG1,2,4,每个8位。BOOT_CFG是由LCD_DATA0~23(参考原理图)来设置的。在正点原子阿尔法开发板中,大多都默认是47K下拉电阻接地。BOOT_CFG4的8根线全部接地,BOOT_CFG2全部接地,除了BOOT_CFG2[3],此位用来选择SD卡启动接口,BOOT_CFG1的0,1,2都是定死的,3,4,5,6,7是可以设置的。
当 BOOT_MODE1 为 0, BOOT_MODE0 为 1 的时候此模式使能,串行下载的意思就是可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1 这个 USB口向开发板上的 SD/EMMC、 NAND 等存储设备下载代码。我们需要将 BOOT_MODE1 拨到“OFF”,将 BOOT_MODE0 拨到“ON”。这个下载是需要用到 NXP 提供的一个软件,一般来最终量产的时候将代码烧写到外置存储设备中的
当 BOOT_MODE 为 1, BOOT_MODE0 为 0 的时候此模式使能,在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。
前面我们设置好 BOOT 以后就能从指定的设备启动了,但是设备里面需要有代码,我们使用 imxdownload 这个软件将 led.bin 烧写到了 SD 卡中。imxdownload 会在 led.bin前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终实际烧写的是 load.imx。学习 STM32 的时候我们可以直接将编译生成的.bin 文件烧写到 STM32 内部 flash 里面,但是 I.MX6U 不能直接烧写编译生成的.bin 文件,我们需要在.bin 文件前面添加一些头信息构成满足 I.MX6U 需求的最终可烧写文件。
I.MX6U 的最终可烧写文件组成如下:
Image vector table, 简称 IVT, IVT 里面包含了一系列的地址信息,这些地址信息在 ROM中按照固定的地址存放着。
Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
用户代码可执行文件,比如 led.bin。
可以看出最终烧写到 I.MX6U 中的程序其组成为: IVT+Boot data+DCD+.bin。因此 load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。
BOOT ROM做的事情:
设置内核始终为396MHZ。使能MMU和Cache,使能L1 cache 、L2 cache MMU,目的就是为了加速启动。
从BOOT_CFG设置的外置存储中,读取image,然后做相应的处理。
Bin文件前面要添加头部。
可以得到,我们烧写到SD卡中的load.imx文件在SD卡中的起始地址是0x400(1024).
SD卡中:
前1KB是SD卡官方的,不能动。紧接着的3KB是头部信息。
头部大小为3KB,加上偏移的1KB,一共是4KB。因此在SD卡中bin文件起始地址为4096(即4K开始),利用Winhex软件打开时,由于winhex软件中是32位一排序或排布。其排布是按照逆序排的。例如0x402000D0,用winhex打开后就是 D0 00 20 40,如下图是利用正点原子imxdownload软件执行led.bin文件下载SD卡中的load.imx文件,用winhex软件打开后:
load.imx 最前面的就是 IVT 和 Boot Data, IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移。
IVT的结构如下: