文章目录

  • uboot.imx与uboot.bin的关系
  • uboot.imx文件解析
  • IMX6 ROM BOOT 流程中IVT、Boot data、DCD等相关数据操作
  • 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在执行代码时已经在链接地址,所以应该不会进行代码重定位操作

IMX6Q的uboot.imx文件解析相关推荐

  1. I.MX6 u-boot.imx中IVT、DCD等头部数据的生成

    IVT.Boot Data structures.DCD是I.MX6启动时的重要数据和配置.IVT中包含Boot Data structures.DCD地址定位的信息. BOOT ROM 根据这些地址 ...

  2. 基于IMX6Q的uboot启动流程分析(3):_main函数之relocate_code与board_init_r

    基于IMX6Q的uboot启动流程分析(1):uboot入口函数 基于IMX6Q的uboot启动流程分析(2):_main函数之board_init_f 基于IMX6Q的uboot启动流程分析(3): ...

  3. u-boot.lds文件详解

    网上大部分u-boot.lds文件的分析大部分都是千遍一律,例如下面就是本人在网上找到的关于u-boot.lds的资料. OUTPUT_FORMAT("elf32-littlearm&quo ...

  4. u-boot.lds文件诠释

    u-boot.lds文件诠释 网上大部分u-boot.lds文件的分析大部分都是千遍一律,例如下面就是本人在网上找到的关于u-boot.lds的资料. OUTPUT_FORMAT("elf3 ...

  5. Json文件解析(下

    Json文件解析(下) 代码地址:https://github.com/nlohmann/json 从STL容器转换 任何序列容器(std::array,std::vector,std::deque, ...

  6. Json文件解析(上)

    Json文件解析(上) 代码地址:https://github.com/nlohmann/json 自述文件 alt=GitHub赞助商 data-canonical-src="https: ...

  7. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

  8. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...

  9. cocosstudio csd文件解析为.lua

    在学习python过程中,有幸能够看到一位大神在网页中公开的一个关于<CocosStudio 文件解析工具CsdAnalysis>的源码.本人使用稍作改变,由原有的.csd文件转换为C++ ...

最新文章

  1. 机房重构——报表问题总结
  2. 今晚8点开播 | 微信高级研究员解析深度学习在NLP中的发展和应用
  3. 基于LNMP的简单电商网站架构
  4. 本周ASP.NET英文技术文章推荐[03/11 - 03/17]
  5. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...
  6. acwing2019. 拖拉机(最短路径)
  7. html 用svg缩放拉伸,html – 拉伸SVG以适应其父级的100%高度和宽度
  8. 微服务架构下的身份认证
  9. 解决Coldfusion连接MySQL数据库的问题
  10. 网站如何和服务器匹配,匹配服务器
  11. leetcode48:矩阵旋转
  12. c++ 未定义标识符string_Redis之String的数据结构
  13. 发一个成熟好用的电池供电切换电路
  14. 微信小程序开发常见的错误
  15. Hadoop fs shell命令汇总
  16. 学习笔记-极客时间 玩转 git 三剑客 课程记录
  17. 前端笔记:飞机航线图
  18. Mono.Cecil说明文档翻译
  19. MySQL8.0 - 新特性 - Descending Index 1
  20. 《Java程序设计》公选课学习指南

热门文章

  1. 服务器安装kangle系统,云服务器安装kangle
  2. PROFIBUS DP 通讯距离
  3. android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础
  4. 类型初始值设定项引发异常的解决方案
  5. javascript忍者秘籍(第二版)翻译学习 第一章 JavaScript无处不在
  6. 通过 Facebook 成功营销的技巧
  7. 控制台游戏4-打地鼠
  8. 系统集成项目管理工程师2022年上半年下午案例分析题及答案
  9. 智能电网的发展和研究
  10. The authenticity of host ‘master (192.168.80.5)‘ can‘t be established.