IMX6Q的uboot.imx文件解析


经过几天的研究,彻底弄清楚了IMX6的ROM BOOT 流程,以及如何启动uboot;2016-03 版本的uboot源码编译后生成的uboot.bin与uboot.imx是什么关系,怎么生成uboot.imx等等。
下面就把写的笔记搬到这里来,方便以后查阅。

uboot.imx与uboot.bin的关系

u-boot.imx与u-boot.bin文件的主要关系是:u-boot.imx是在u-boot.bin的前面附加上一个image header,主要包含IVT header、 Boot data、DCD header;整个header的大小限制为3Kbyte。
为啥限制大小为3K,是因为在存储器的0 地址预留一部分空间保存分区信息,以下表格为不同存储器类型预留的空间大小。
在这里插入图片描述

根据预留空间大小,将u-boot.imx文件烧写到eMMC时,需要偏移1K字节,下图为u-boot.imx在eMMC空间的分布。
在这里插入图片描述

uboot.imx文件解析

了解了u-boot.imx在eMMC空间的分布之后,下面就详细介绍IVT header、Boot Data、DCD header三个部分的细节。以下图所示为u-boot.imx的前一部分,下面详细解释其含义:
在这里插入图片描述

在这里插入图片描述

IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相关数据操作

当我们选择从eMMC启动时,BOOT ROM会拷贝eMMC中的前4K bytes数据到片内RAM(OCRAM)。这初始的4K数据中必须包含IVT(Image vector table)、DCD(Device configuration data)和Boot Data structures,但eMMC启动时,IVT的偏移为1K,所以剩余的3K数据中必须包含IVT、DCD和Boot Data structures。(其实不到1K)

另外DCD最大长度限制由宏 MAX_HW_CFG_SIZE_V2决定,宏在\u-boot-2016.03-r0\tools\imximage.h文件中定义,在手册文档8.6.2 Device Configuration Data (DCD)节说明DCD最大长度为1768byte

为何拷贝的是eMMC的欠欠4K数据:因为在\u-boot-2016.03-r0\tools\imximage.h文件中定义
#define FLASH_LOADSIZE_STANDARD 0x1000;此宏定义说明BOOT ROM将eMMC起始的4K内容拷贝到片内RAM

接着BOOT ROM检查OCRAM 4K数据中包含的IVT头标志0xD1,然后执行DCD检查。这些检查无误通过后,从boot data structure 中解析出下一步拷贝的目的地址和长度(记为length),然后从eMMC地址0,拷贝长度length的数据到上面解析出的目的地址处。

这里有一个如何在OCRAM中定位boot data structure地址的问题。编译生成的u-boot.imx,它的boot data内容即为boot data structure的地址,而该地址是一个绝对地址,实际为DDR地址,而OCRAM中此时的地址还是原始数据中的该地址。由于此时DDR还未准备好,还未执行u-boot.imx到DDR的拷贝,BOOT ROM不能使用boot data中的绝对(DDR地址)地址来定位boot data structure。而只能使用偏移地址在OCRAM中定位boot data structure。那么偏移地址怎么得到呢?

注意IVT中还有一个self表项,它指向它自身,即IVT的首地址。此例u-boot.imx中的self的值为0x177FF400,boot_data的值为0x177FF420,那么boot data structure的地址偏移为boot data structure offset = boot_data - self(IVT首地址) = 0x20,加载到OCRAM中后,boot data structure的有效地址为:OCRAM IVT 加载首地址 +boot data structure offset,同理也可以计算出DCD数据在OCRAM中的偏移为0x2C。

其实不用这么麻烦,根据u-boot.imx在eMMC存储器中的空间分布,IVT header占用固定的0x20 字节,紧接着就是boot data structure,占用0x0C字节;然后是DCD header;所以boot data的偏移为0x20 字节,DCD header 的便宜为0x2C字节;因此当ROM BOOT将eMMC的前4K空间拷贝到OCRAM中时 ,偏移并不会改变。

ROM BOOT在经过以上步骤以后,根据这些地址定位找到DCD的存储位置,使用DCD中的配置参数,来初始化DDR,配置时钟,以及其他启动时必要的硬件设置; BOOT ROM会在必要的检查和上述的初始化之后,将boot data structure数据指示的地址与长度将uboot.imx数据拷贝到SDRAM然后跳转到IVT指示的entry执行uboot
uboot.imx在eMMC中的分布与拷贝到SDRAM中的分布如下图所示:

在这里插入图片描述

uboot.imx文件生成

u-boot-2015.07及以后的版本中,更改了u-boot.imx的产生方式,不再使用flash_header.S,而是使用mkimage工具直接生成。
mkimage包含的目标文件类型-T参数中新增了imximage选项;mkimage会调用格式类型imximage的解释器来生成针对i.mx(5系6系)系列芯片的 IVT、boot Data、DCD的格式头。
具体的代码实现在tools/imximage.c中。我们以board/freescale/mx6qsabreauto为例,生成u-boot.imx时执行:
./tools/mkimage -n board/freescale/mx6qsabreauto/imximage.cfg.cfgtmp -T imximage -e 0x17800000 -d u-boot.bin u-boot.imx
其中-n指明输入文件为imximage.cfg.cfgtmp,-T指明解释器为imximage,-e为镜像程序入口点。
mkimage调用选项-T的imximage 解释器解析输入文件:imximage.cfg.cfgtmp,而文件imximage.cfg.cfgtmp为imximage.cfg编译时处理(使用gcc -E选项)后产生的临时文件。
更多细节需要参考imximage.c代码实现。

猜想

由于IMX6 的ROM BOOT会将uboot.imx拷贝到SDRAM的0x177FF000,加上4K的image header偏移,uboot.bin正好对应到链接地址:0x17800000,因为uboot在执行代码时已经在链接地址,所以应该不会进行代码重定位操作

猜你喜欢

转载自blog.csdn.net/zhaoyun_zzz/article/details/84990606