i.MX6处理器u-boot.imx文件解析

一、u-boot.imx与u-boot.bin的关系

    u-boot.imxu-boot.bin文件的主要关系是:u-boot.imx是在u-boot.bin的前面附加上一个image header,主要包含IVT header、 Boot data、DCD header;整个header的大小限制为3Kbyte。
    由于在eMMC上,还需要预留前1KB用来存储分区信息,所以uboot.imx在eMMC上的存储分布如下图:
eMMC中u-boot.imx分布

二、u-boot.imx文件解析

    了解了u-boot.imx在eMMC空间的分布之后,下面就详细介绍IVT header、Boot Data、DCD header三个部分的细节。以下图所示为u-boot.imx文件内容的文件头,后面详细解释其含义:
uboot.imx头部信息IVTBoot data
DCD

三、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\tools\imximage.h文件中定义,在手册文档8.6.2 Device Configuration Data (DCD)节说明DCD最大长度为1768byte
    为何拷贝的是eMMC的前4K数据:因为在u-boot\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的值为0x877FF400,boot_data的值为0x877FF420,那么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。

四、u-boot.imx文件生成

    在新版本的uboot中,使用mkimage工具生成u-boot.imx。
    mkimage包含的目标文件类型-T参数中新增了imximage选项;mkimage会调用格式类型imximage的解释器来生成针对i.mx系列芯片的 IVT、boot Data、DCD的格式头。
具体的代码实现在tools/imximage.c中。我们以board/freescale/mx6ul_topeet为例,生成u-boot.imx时执行:./tools/mkimage -n board/freescale/mx6ul_topeet/imximage.cfg.cfgtmp -T imximage -e 0x87800000 -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代码实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章