Linux(七)I.MX6U启动方式详解

前言:

I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式其启动方式和启动要求也不一样,比如上一章中的从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头的。本章我们就来学习一下 I.MX6U 的启动方式,以及不同设备启动的要求

Linux(七)I.MX6U启动方式详解_第1张图片

当BOOT_MODE[0:1]为10,那么就是从 SD/EMMC、NAND Flash、QSPI Flash等启动,SD卡还能在电脑上拷贝 load.imx,但是EMMC、NAND等怎么更新程序呢?01,串行下载就是通过USB或者UART下载到板子上的外置存储设备上的。

当 BOOT_MODE1 为 1, BOOT_MODE0 为 0 的时候此模式使能,中断向量偏移会被设置到 boot ROM 的起始位置,会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),包括初始化时钟,然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。并修改中断向量偏移至用户代码开始的地方。

当 BOOT_MODE 设置为内部 BOOT 模式以后,可以从一下设备中启动:

、接到 EIM 接口的 CS0 上的 16 位 NOR Flash。

、接到 EIM 接口的 CS0 上的 OneNAND Flash。

、接到 GPMI 接口上的 MLC/SLC NAND Flash, NAND Flash 页大小支持 2KByte、 4KByte

和 8KByte, 8 位宽。

、 Quad SPI Flash。

、接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等设备。

、 SPI 接口的 EEPROM。

这些启动设备如何选择呢? I.MX6U 同样提供了 eFUSE 和 GPIO 配置两种, eFUSE 就不了解了。我们重点看如何通过 GPIO 来选择启动设备,因为所有的 I.MX6U 开发板都是通过 GPIO来配置启动设备的。正如启动模式由 BOOT_MODE[1:0]来选择一样,启动设备是通过BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和 BOOT_CFG4[7:0]这 24 个配置 IO,这 24 个配置 IO 刚好对应着 LCD 的 24 根数据线 LCD_DATA0~LCDDATA23,当启动完成以后这 24 个 IO 就可以作为 LCD 的数据线使用。这 24 根线和 BOOT_MODE1、 BOOT_MODE0 共同组成了 I.MX6U的启动选择引脚。

所以除了配置BOOT_MODE 为BOOT模式后,还要配置24个IO口来选择具体的从那个外部存储器来启动,但是真正有区别的IO口就7个

Linux(七)I.MX6U启动方式详解_第2张图片

学习 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。所以第八章中的 imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT+Boot data+DCD。 内部 BootROM 会将 load.imx 拷贝到 DDR 中,用户代码是要一定要从 0X87800000 这个地方开始的,因为链接地址为 0X87800000, load.imx 在用户代码前面又有 3KByte 的 IVT+Boot Data+DCD 数据,下面会讲为什么是 3KByte,因此 load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。

Linux(七)I.MX6U启动方式详解_第3张图片

意思就是,load.imx不会直接放入SD卡的起始位置0,而是根据IVT的偏移要求放在SD卡1KB的位置上去,而initial load region size就是load.imx除去bin的大小,那么也就是IVT偏移+IVT+Boot data+DCD的大小为4KB,那么也就是说bin会放在第五个字节开始处。那么也就是在load.imx的第四个字节开始。不过IVT的确在load.imx的起始位置!别混淆!

  1. IVT表明了自己的大小,以及放入DDR的偏移地址,DCD的地址等;
  2. Boot data表明了load.imx的起始地址,还有镜像大小等;
  3. DCD 其实就是 I.MX6U 寄存器地址和对应的配置信息集合, Boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化 DDR 等等。

总的来说,这些加在bin前面的“头部”很像FAT文件系统的起始扇区的作用,也很像是HEX的作用,指明了真正的bin存入DDR的位置,以及初始化DDR。

但是问题是,他如果是先将load.imx存入DDR再去运行到DCD中去配置DDR,从逻辑上看好像不对啊。

https://blog.csdn.net/zxy131072/article/details/104812361

这篇文章写的非常好,“学到了学到了,原来boot是从外部存储器中读取至自身RAM中去处理IVT、boot data、DCD。然后再把整个映像文件复制至DDR中(外扩DDR3L:NT5CC128M16JR-EK,256MB字节,工业级),再去指定的运行地址去运行。 我不知道这样理解的对不对,我之前一直误以为DCD是在DDR中执行的,所以一直想不明白。 十分感谢分享!”

启动步骤:

1.boot rom会根据BOOT相关的21个IO来判断是以何种方式以及何种存储器上启动,

2.比方说知道了是从SD卡上启动,那么根据规则,从SD卡上去读取头部至cache中(L1 cache数据区),即IVT、boot data、DCD。

3.根据IVT、boot data了解镜像文件大小、放入DDR中的那个位置、从哪启动等。

4.根据DCD,去执行初始化一些寄存器、时钟、DDR外设。

5.将镜像文件复制至DDR指定位置上。

6.在DDR上按照指定的运行地址运行.bin。

生成完的load.imx用Win-HEX打开,可以看到在0x00处还是有FAT32的起始扇区的

Linux(七)I.MX6U启动方式详解_第4张图片

然后根据NXP对imx的IVT偏移量的规定

Linux(七)I.MX6U启动方式详解_第5张图片

可见IVT是在第一个字节处,即0x400,红框就是IVT标记的运行地址0x87800000:

Linux(七)I.MX6U启动方式详解_第6张图片

那么IVT偏移+IVT+boot data+DCD是4KB,即.bin在第五个字节开始,即0x1000。

然后观察到的是,从0x610到0x1000之间就没有任何数据,也就是IVT、boot data、DCD是连续的。

那么.bin是在0x1000:

Linux(七)I.MX6U启动方式详解_第7张图片

你可能感兴趣的:(linux)