裸机开发(3) I.MX6U启动方式

目录

  • 1.启动方式
    • 1.1.启动方式选择
    • 1.2.串口下载方式
    • 1.3.内部boot模式
    • 1.4.内部boot模式的启动设备
  • 2.裸机程序镜像烧写
    • 2.1. IVT和BOOT Data
    • 2.2.DCD数据

1.启动方式

1.1.启动方式选择

BOOT的内容参考“IMX6ULL参考手册”第八章,I.MX6U芯片上电以后,会根据BOOT_MODE[1:0]的设置选择BOOT方式。,开发板上BOOT_MODE[1:0]引脚如图:
裸机开发(3) I.MX6U启动方式_第1张图片
BOOT_MODE1和BOOT_MODE0在芯片内部有100KΩ下拉电阻的,所以默认是0。通过拨码开关控制BOOT_MODE1/0和 BOOT_MODE0 的高低电平。开关拨到“ON”就相当于引脚通过10K电阻接到了3.3V电源,芯片内部的BOOT_MODE1/0又是100K下拉电阻接地,因此此时BOOT_MODE1/0的电压是100/(10+100)*3.3V=3V,高电平。I.MX6U有四个BOOT模式,由BOOT_MODE[1:0]控制,我们只用下表的2、3模式。
裸机开发(3) I.MX6U启动方式_第2张图片

1.2.串口下载方式

当BOOT_MODE1为0,BOOT_MODE0为1时此模式使能,通过USB或者UART将代码下载到板子上的外置存储设备中,比如开发板上的SD/EMMC、NAND等存储设备下载代码。这个下载需要用到NXP提供的一个软件。

1.3.内部boot模式

当BOOT_MODE1为1,BOOT_MODE0为0时使能,芯片会执行内部boot ROM代码,会进行硬件初始化(一部分外设),然后从boot设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的RAM中(一般DDR)。
boot ROM主要完成以下工作:

  1. 将I.MX6U的内核时钟设置为396MHz,System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz。
  2. 为了加快执行速度会打开MMU和Cache,下载镜像时L1 ICache会打开,验证镜像时L1 DCache、L2 Cache和MMU都会打开。一旦镜像验证完成,boot ROM会关闭 L1 DCache、L2 Cache和 MMU。
  3. 中断向量偏移会被设置到boot ROM的起始位置,boot ROM 启动了用户代码以后就可以重新设置中断向量偏移了,一般重新设置到用户代码的开始地方。

1.4.内部boot模式的启动设备

BOOT_MODE设置为内部BOOT模式后,可以从以下设备中启动(IMX6ULL参考手册,8.5):
①、接到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。

如果使用GPIO来配置选择内部BOOT模式的启动设备,需要通过BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和BOOT_CFG4[7:0]这24个配置IO,它们刚好对应着LCD的24根数据线LCD_DATA0~LCDDATA23,当启动完成以后这24个IO就可以作为LCD的数据线使用。这 24根线和BOOT_MODE1、BOOT_MODE0共同组成了I.MX6U的启动选择引脚(IMX6ULL参考手册,8.3.5)。

不过很多IO都是用不到的,在板子上会直接下拉接地,比如BOOT_CFG4[7:0]。只需要重点关注BOOT_CFG2[7:0]和BOOT_CFG1[7:0]这16个IO(IMX6ULL参考手册,8.5):
裸机开发(3) I.MX6U启动方式_第3张图片

在BOOT_CFG2[7:0]和BOOT_CFG1[7:0]中,我们只需要用到BOOT_CFG2[3]和BOOT_CFG1[3] ~ BOOT_CFG1[7],也就是LCD_DATA11,LCD_DATA3 ~ LCDDATA7:
裸机开发(3) I.MX6U启动方式_第4张图片
裸机开发(3) I.MX6U启动方式_第5张图片
裸机开发(3) I.MX6U启动方式_第6张图片

2.裸机程序镜像烧写

在前面内容中设置好了指定的启动设备,接下来需要烧写代码,在我们使用Makefile工具编译链接生成的xx.bin文件的前面,还要加上一些头部信息。我们可以从NXP提供的u_boo.imx中找头部信息,博客中使用正点原子提供的包含头部信息的imxdownload烧写工具,使用“./imxdownload xx.bin /dev/sd卡盘符”命令,生成load.imx文件,并将其烧写到SD卡中。

可烧写文件load.imx中包含如下部分:
①、Image vector table(IVT),IVT包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放。
②、Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
③、Device configuration data(DCD),设备配置信息,重点是DDR3 的初始化配置。
④、用户代码可执行文件,比如led.bin。

总结:
程序其组成为:IVT+Boot data+DCD+.bin,上电后内部Boot ROM会将load.imx拷贝到DDR中,用户程序链接地址设定为DDR的0X87800000(DDR的起始地址为0X80000000,512MB的DDR终止地址为0X9FFFFFFF),load.imx在用户代码前面有 3KByte的IVT+Boot Data+DCD数据,因此load.imx在DDR中的起始地址是0X87800000-3072=0X877FF400。

2.1. IVT和BOOT Data

IVT包含了镜像程序的入口点、指向DCD的指针和一些用作其它用途的指针。内部Boot ROM要求IVT应该放到指定的位置,不同的启动设备位置不同,若是SD卡启动则偏移地址为1KB,头部信息一共3KB,加上IVT前偏移的1KB,一共是4KB,因此在SD卡中bin文件的起始地址为4096。
BOOT Data主要定义了整个load.imx的起始地址,为0X877FF000,包括了3KB的头部信息和1KB的偏移;还定义了2MB的镜像大小。

2.2.DCD数据

DCD数据主要起到配置IMX6ULL内部寄存器值得作用,复位以后I.MX6U片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,需要DCD数据对它们进行初始化,IVT里指定了DCD的位置。Boot ROM会使用DCD初始化的这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化DDR等等,DCD区域不能超过1768Byte。

DCD的初始化配置主要包括以下几个方面:
①、设置CCGR0~CCGR6这7个外设时钟使能寄存器,默认打开所有的外设时钟。
②、配置DDR3所用的所有IO。
③、配置MMDC控制器,初始化DDR3。

参考正点原子嵌入式Linux开发指南

你可能感兴趣的:(I.MX6U学习笔记)