I.MX6ULL Linux开发板镜像烧写

系列文章目录

I.MX6ULL Linux开发板镜像烧写



1、镜像烧写

我们设置好 BOOT 以后就能从指定的设备启动了,但是你的设备里面要有代码,使用 imxdownload 这个软件将 led.bin 烧写到了 SD 卡中。imxdownload 会在 led.bin
前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终实际烧写的laod.imx。

本文详细的讲解一下 imxdownload 是如何将 led.bin 打包成 load.imx
学习 STM32 的时候我们可以直接将编译生成的.bin 文件烧写到 STM32 内部 flash 里面,但是 I.MX6U 不能直接烧写编译生成的.bin 文件,我们需要在.bin 文件前面添加一些头信息构成满足 I.MX6U 需求的最终可烧写文件,I.MX6U 的最终可烧写文件组成如下:
①、Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在
ROM 中按照固定的地址存放着。
②、Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
③、Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
④、用户代码可执行文件,比如 led.bin。
最终烧写到 I.MX6U 中的程序其组成为:IVT+Boot data+DCD+.bin。所以,imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT+Boot data+DCD。内部 BootROM 会将 load.imx 拷贝到 DDR 中,用户代码是要一定要从 0X87800000 这个地方开始的,因为链接地址为 0X87800000,load.imx 在用户代码前面又有 3KByte 的 IVT+Boot Data+DCD 数据,下面会讲为什么是 3KByte,因此 load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。


2、IVT 和 Boot Data 数据

load.imx 最前面的就是 IVT 和 Boot Data,IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。 内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其实就相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移,IVT偏移如图所示:
在这里插入图片描述
以 SD/EMMC 为例,IVT 偏移为 1Kbyte,IVT+Boot data+DCD 的总大小为 4KByte-
1KByte=3KByte。假如 SD/EMMC 每个扇区为 512 字节,那么 load.imx 应该从第三个扇区开始
烧写,前两个扇区要留出来。load.imx 从第 3KByte 开始才是真正的.bin 文件。IVT 格式如图所示:
在这里插入图片描述

从图 可以看到,第一个存放的就是 header(头),header 格式如图所示:
在这里插入图片描述
Tag 为一个字节长度,固定为 0XD1,Length 是两个字节,保存着 IVT 长度,为大端格式,也就是高字节保存在低内存中。最后的 Version 是一个字节,为 0X40 或者0X41。Boot Data 的数据格式如图 所示:

在这里插入图片描述


3、验证load.imx数据

用 winhex 软件打开 load.imx ,winhex 可以直接查看一个文件的二进制格式数据,用 winhex 打开以后的 load.imxd 部分如图所示:
在这里插入图片描述
图是我们截取的 load.imx 的一部分内容,从地址 0X00000000~0X000025F,共 608个字节的数据。我们将前 44 个字节的数据按照 4 个字节一组组合在一起就是:0X402000D1、
0X87800000、0X00000000、0X877FF42C、0X877FF420、0X877FF400、0X00000000、0X00000000、
0X877FF000、0X00200000、0X00000000。这 44 个字节的数据就是 IVT 和 Boot Data 数据,按照图所示的 IVT格式图 和 Boot Data 数据格式图,所示的格式对应起来如表 所示:
在这里插入图片描述
在这里插入图片描述

在表中,详细的列出了 load.imx 的 IVT+Boot Data 每 32 位数据所代表的意义。这些数据都是由 imxdownload 这个软件添加进去的。


4、DCD数据

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

其中 Tag 是单字节,固定为 0XD2,Length 为两个字节,表示 DCD 区域的大小,包含 header,同样是大端模式,Version 是单字节,固定为 0X40 或者 0X41。
DCD 区域结构图中的 CMD 就是要初始化的寄存器地址和相应的寄存器值,结构如 DCD CMD命令格式图:
在这里插入图片描述

图中 Tag 为一个字节,固定为 0XCC。Length 是两个字节,包含写入的命令数据长度,包含 header,同样是大端模式。Parameter 为一个字节,这个字节的每个位含义如
Parameter 结构所示图:
在这里插入图片描述

图中的 bytes 表示是目标位置宽度,单位为 byte,可以选择 1、2、和 4 字节。flags是命令控制标志位。DCD CMD 命令格式图 中的 Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相应的寄存器值,注意采用的是大端模式!DCD数据是从load.imx 部分内容图的 0X2C 地址开始的。根据分析的 DCD 结构可以得到 load.imx 的 DCD数据如DCD 数据结构表所示:
在这里插入图片描述在这里插入图片描述

从DCD 数据结构表中可以看出,DCD 里面的初始化配置主要包括三方面:
①、设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
②、配置 DDR3 所用的所有 IO。
③、配置 MMDC 控制器,初始化 DDR3。


5、总结

我们编译出来的.bin 文件不能直接烧写到 SD 卡中,需要在.bin 文件前面加上 IVT、Boot Data 和 DCD 这三个数据块。这三个数据块是有指定格式的,我们必须按照格式填写,然后将其放到.bin 文件前面,最终合成的才是可以直接烧写到 SD 卡中的文件。


END
在这里插入图片描述

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值