正点原子I.MX6ULL平台Linux学习(一)
一.I.MX启动
需要参考I.MX的开发手册来看(已上传到附件)。
1.硬件启动方式选择
- 启动方式选择
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模式
当 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软件打开后:
2.IVT 和 Boot Data 数据
load.imx 最前面的就是 IVT 和 Boot Data, IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移。
IVT的结构如下: