I.MX6U可以从 SD/EMMC、NAND Flash、QSPI Flash等启动,且需要在bin文件前面添加数据头。
启动方式选择
在拨码开关中,使用 BOOT_MODE[1:0]这两个引脚控制BOOT模式, BOOT_MODE1 和 BOOT_MODE0 在芯片内部是有 100KΩ下拉电阻的,所以默认是0。
BOOT 类型模式选择如下图。
串行下载
可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1 这个 USB口向开发板上的 SD/EMMC、 NAND 等存储设备下载代码。
内部 BOOT 模式
在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中指定的链接地址(一般是 DDR)。
这里的内部 boot ROM 代码就是管理imxdownload烧录软件写在bin文件以及前面的数据头进行相应操作。
启动设备选择
当 BOOT_MODE 设置为内部 BOOT 模式以后,可以从不同设备中启动(如 SD/EMMC、NAND Flash、QSPI Flash等)。使用BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和 BOOT_CFG4[7:0]这 24 个配置 IO进行启动设备的选择。
虽然有 24 个 IO,但是实际需要调整的只有那几个 IO,其它的 IO 全部下拉接地即可,也就是设置为 0。
如下图,也就这么亿点点设置。
经过简化,原子哥的开发板只设置了基本的设置需求,引出了BOOT_CFG2[3]和BOOT_CFG1[3]~BOOT_CFG1[7]这 6 个IO 的配置,如下图。
MODE[1:0] | CFG2[3] | CFG1[3:7] | 设备 |
---|
镜像烧写
STM32 可以直接将编译生成的.bin 文件烧写到 STM32 内部 flash 里面,但是 I.MX6U 不能直接烧写编译生成的.bin 文件,我们需要在.bin 文件前面添加一些头信息构成满足 I.MX6U 需求的最终可烧写文件。imxdownload 是如何将 led.bin 打包成 load.imx 的呢?
I.MX6U 的最终可烧写文件组成如下:
①、 Image vector table,简称 IVT, IVT 里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。
②、 Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
③、 Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
④、用户代码可执行文件,比如 led.bin。
所生成的 load.imx组成为: IVT+Boot data+DCD+.bin。
其中 IVT+Boot data+DCD=3KByte。
DDR中用户代码(.bin)是要一定要从0X87800000 这个地方开始,因为链接地址为 0X87800000,load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。
这里学习一下32位内存结构,依然是一字节(8位)为一个地址。
以上基地址位0X87000000,地址和数据的关系如下
地址 | 数据 | 数据 | 数据 | 数据 |
---|---|---|---|---|
… | … | … | … | … |
0X87000000 | 0X40 | 0X20 | 0X00 | 0XD1 |
0X87000004 | 0X87 | 0X80 | 0X00 | 0X00 |
IVT、 Boot Data 和 DCD 这三个数据块是有指定格式的,我们必须按照格式填写,然后将其放到.bin 文件前面,最终合成的才是可以直接烧写到 SD 卡中的文件。
对于SD卡启动:
IVT从0X877FF400开始,结构如图,每行表示4字节(32位)。
Boot Data从0X877FF420开始,结构如图,每行表示4字节(32位)。
DCD从0X877FF42C开始,结构如图,每行表示4字节(32位),后边儿还有。。。