IMX6ULL启动方式
文章目录
IMX6ULL支持多种启动方式,我们可以通过Boot位选择,在调试阶段我们通常选择采用SD卡,这将有助于我们的调试,在汇编实验中,我们通过正点的下载工具,起始实际下载的并不是led.bin文件,而是.imx文件
启动方式选择
引导过程从通电重置(PER)开始,其中硬件重置逻辑迫使Arm核心从片上引导ROM开始执行。
引导ROM代码使用内部寄存器BOOT_Mode[1:0]的状态以及各种eFUSE和/或MPI设置的状态来确定设备的引导流行为。
The boot ROM supports these boot devices:
- NOR flash
- NAND flash
- OneNAND flash
- SD/MMC
- Serial (SPI) NOR flash and EEPROM
- QuadSPI (QSPI) flash
Boot位配置
串行下载
当 BOOT_MODE1 为 0,BOOT_MODE0 为 1 的时候此模式使能,用户可通过USB或者USART将代码下载到外置设备存储上,这个下载需要使用到NXP提供到的软件
内部Boot模式
这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。
BOOTROM初始化内容
可以看到,当为其选定为内部BOOT模式后d,首先就会初始化时钟,初始化结果如下所示。
同时为了加快执行速度。将会执行以下操作
下载镜像的时候 L1 ICache 会打开,验证镜像的时候 L1 DCache、L2 Cache 和 MMU 都会打开。一旦镜像验证完成,boot ROM就会关闭 L1 DCache、L2 Cache 和 MMU。
中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码以后就可
以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方。
启动设备
启动设备是通过BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和BOOT_CFG4[7:0]这 24 个配置 IO。当启动完成后,BOOT_CFG4[7:0]这24个IO就可以作为LCD的数据线使用。
通过下图可以分析出,虽然有着这么多IO口需要陪配制,但是实际上相关的IO口就那么几个。
镜像烧录
汇编实验中,我们实际下载的是一个叫做load.imx的镜像文件,为什么不是直接烧写Bin文件呢?
因为I.MX6U的启动过程需要一些额外的信息来正确初始化硬件并加载用户代码。
IMX6ULL最终可烧写文件组件
IVT + Boot Data + DCD + .bin
Image Vector Table (IVT)
IVT包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放着。IVT的主要作用是告诉Boot ROM如何加载和执行用户代码。
Boot Data
Boot Data包含了镜像要拷贝到哪个地址,拷贝的大小是多少等信息。它告诉Boot ROM如何将用户代码加载到内存中。
Device Configuration Data (DCD)
DCD包含了设备配置信息,特别是DDR3的初始化配置。这些配置信息是确保DDR3内存能够正确初始化和工作的关键。
用户代码可执行文件
这是实际的用户代码,通常是一个编译生成的.bin
文件。
为什么是3KByte
IVT、Boot Data和DCD的总大小通常是3KByte(3072字节)。这是因为:
- IVT:通常占用1KByte(1024字节)。
- Boot Data:通常占用1KByte(1024字节)。
- DCD:通常占用1KByte(1024字节)。
用户代码的起始地址
用户代码必须从特定的地址开始,例如0X87800000
。由于IVT、Boot Data和DCD在用户代码前面有3KByte的数据,因此最终可烧写文件load.imx
在DDR中的起始地址是:
0X87800000 - 3072 = 0X877FF400
0。由于IVT、Boot Data和DCD在用户代码前面有3KByte的数据,因此最终可烧写文件
load.imx`在DDR中的起始地址是:
0X87800000 - 3072 = 0X877FF400
标签:ROM,方式,启动,代码,Boot,IVT,IMX6ULL,Data,DCD
From: https://blog.csdn.net/weixin_54930908/article/details/143988263