03_I.MX6ULL启动方式

目录

硬件启动方式选择

串口下载

内部BOOT模式

内部BOOT代码具体执行内容

IVT和Boot Data数据

DCD数据

总结


硬件启动方式选择

BOOT的处理过程是发生在I.MX6U芯片上电以后,芯片会根据BOOT_MODE[1:0]的设置来选择BOOT方式。BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写eFUSE(熔丝),一种是修改相应的GPIO高低电平。第一种修改eFUSE的方式只能修改一次,后面就不能再修改了,所以我们不使用。我们使用的是通过修改BOOT_MODE[1:0]对应的GPIO高低电平来选择启动方式,I.MX6U有一个BOOT_MODE1引脚和BOOT_MODE0引脚,这两个引脚对应这BOOT_MODE[1:0],其中BOOT_MODE1和BOOT_MODE0在芯片内部是有100KΩ下拉电阻的,所以默认是0,而I.MX6U有四个BOOT模式,这四个BOOT模式由BOOT_MODE[1:0]来控制,也就是BOOT_MODE1和BOOT_ MODEO这两IO, BOOT模式配置如下:

97187082dfac4b22b6d885c62eef1de2.png

串口下载

当BOOT_MODE1为 0,BOOT_MODE0为1的时候此模式使能,串行下载的意思就是可以通过 USB或者UART将代码下载到板子上的外置存储设备中,我们可以使用OTG1这个USB口向开发板上的SD/EMMC、 NAND等存储设备下载代码。

内部BOOT模式

当BOOT_MODE1为1, BOOT_MODE0为0的时候此模式使能,在此模式下,芯片会执行内部的boot ROM代码,这段boot ROM代码会进行硬件初始化(一部分外设),然后从boot设备(就是存放代码的设备、比如SD/EMMC、NAND)中将代码拷贝出来复制到指定的RAM中,一般是DDR,而执行内部boot程序的时候又通过BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和BOOT CFG4[7:0]这24个IO配置(具体看数据手册)

内部BOOT代码具体执行内容

c157db2302634a929bca1ff0fcecd521.png

可以看到, boot ROM会将I.MX6U的内核时钟设置为396MHz,也就是主频为396Mhz。 System PLL=528Mhz, USB PLL=480MHz, AHB=132MHz,IPG-66MHz。

内部boot ROM为了加快执行速度会打开MMU和Cache,下载镜像的时候L1 ICache会打开,验证镜像的时候L1 DCache、L2 Cache和MMU都会打开。一旦镜像验证完成, boot ROM就会关闭L1 DCache、L2 Cache和MMU。中断向量偏移会被设置到boot ROM的起始位置,当boot ROM启动了用户代码以后就可以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方。

IVT和Boot Data数据

I.MX系列CPU在执行真正用户自己编写的程序前是需要一些头部信息,也就是说bin前面还需要追加一些头部信息接着在是用户编写代码生成的bin文件,顺序如下:

1.Image vector table,简称IVT, IVT里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。

2.Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。

3..Device configuration data,简称DCD,设备配置信息,重点是DDR的初始化配置。

4.用户代码可执行文件,比如led.bin。

可以看出最终烧写到I.MX6U中的程序其组成为: IVT+Boot data+DCD+.bin。

52a210aa8b044018adb2180c06913f69.png

47f8a5978ed5457d990cf4f6f70c8426.png

37261a5e796e48adb139841097af4037.png

e0500e0a59644e55b5ab924dceb9a47d.png

DCD数据

复位以后,I.MX6片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此I.MX6U提出了一个DCD(DeviceConfig Data)的概念,和IVT、 Boot Data一样, DCD也是添加到用户编写的bin文件前,紧跟在IVT和Boot Data后面, IVT里面也指定了DCD的位置。DCD其实就是I.MX6U寄存器地址和对应的配置信息集合, Boot ROM会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化DDR等等。DCD区域不能超过1768Byte。

1e585b6b68a14a51818526ab174ec8c3.png

9d8652e38f204cd89807b441f6a2f8f1.png

1.设置CCGRO-CCGR6这7个外设时钟使能寄存器,默认打开所有的外设时钟。

2.配置DDR所用的所有IO。

3.配置MMDC控制器,初始化DDR3。

总结

BOOT_MODE[1:0]这2根引脚来确定CPU上电后是运行什么模式,假设是BOOT模式,CPU上电执行内部ROM里面存的一段代码,代码里面有初始化一些外设DDR、系统时钟等等,还有就是读取BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和BOOT CFG4[7:0]这几个引脚看代码是存放什么类型的设备里面,读取完后去执行代码存储设备里面的代码,此时最开始的就是IVT和Boot Data数据,读取完里面记录了一些地址信息和DCD存放的位置,在纪录完成后寄存器都是默认值,是我们不想要,所以在去执行DCD达到我们自己想要初始化的代码,然后再去执行我们用户编写程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值