正点原子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 开发板的这两个引脚原理图如图所示:
正点原子I.MX6ULL平台Linux学习(一)_第1张图片

正点原子I.MX6ULL平台Linux学习(一)_第2张图片

  • 选择启动设备.

       前提是你设置BOOT_MODE1和BOOT_MODE0是从内部启动。如参考手册图示:

正点原子I.MX6ULL平台Linux学习(一)_第3张图片

       那支持哪些设备呢?----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软件打开后:

正点原子I.MX6ULL平台Linux学习(一)_第4张图片

 

2.IVT 和 Boot Data 数据

       load.imx 最前面的就是 IVT 和 Boot Data, IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移。

       IVT的结构如下:

正点原子I.MX6ULL平台Linux学习(一)_第5张图片

正点原子I.MX6ULL平台Linux学习(一)_第6张图片

你可能感兴趣的:(嵌入式Liunx)