I.MX6ULL裸机开发之烧写文件的头部信息

在上一节中,我们是通过imxdownload工具来生成一个.imx的文件,再将这个文件写到SD卡中的。那么imxdownload工具具体是做什么事情?
imxdownload其实是imxdownload.c编译生成的一个可执行文件,imxdownload.c的组成主要有:

  1. Image vector table,镜像向量表,简称IVT。里面包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放着。
  2. Boot data,启动数据,包含了镜像要拷贝到哪个地址中,拷贝的大小等。
  3. Device configuration data,设备配置数据,简称DCD。主要是DDR的初始化。
  4. 用户的可执行文件数据,比如上一节的led.bin。

Image vector table

.imx最前面就是Image vector table了,IVT包含了镜像程序的入口点,初始化指针。内部的Boot ROM要求IVT必须放到指定的地址。而不同的启动设备,启动的地址也不同,如图:
以SD/eMMC为例,IVT偏移1Kbyte,而总大小为4Kbyte,那么 IVT + Boot data + DCD=4-1=3Kbyte。假设SD/eMMC每个扇区是512个字节,那么.imx文件就必须从第三个扇区(512*2=1024=1Kbyte)开始写入。.imx从第3Kbyte开始才是.bin文件。IVT里面存放的内容,主要有:
在这里插入图片描述
header的数据格式
在这里插入图片描述
Tag:占1个字节,设置为0xD1
Length:占2个字节,表示IVT长度(大小)
Version:占1个字节,设置为0x40或者0x41
总共4个字节。
可使用Notepad++工具将.imx以二进制格式打开,如图:
在这里插入图片描述
将前面的4个字节提取出来,遵循大端模式(低地址保存高字节),即0xd1002040 ====》0x402000d1,也就是说这个header的Tag是0xd1,Length是0x20=32个字节,Verison是0x40。

IVT结构数据描述
header0x402000d1将前面的4个字节提取出来,遵循大端模式(低地址保存高字节),即0xd1002040 ====》0x402000d1,也就是说这个header的Tag是0xd1,Length是0x20=32个字节,Verison是0x40。
entry0x87800000接下来是一个entry,它是一个绝对地址,也就是入口地址,镜像第一行指令所在的位置。由于,这个地址在makefile中指定了0x87800000,所以这里的第4~第7即0x00008087转成大端模式 ====》0x87800000。
reserved10x00000000保留,未使用
dcd0x877ff42cDCD地址。镜像地址是0x87800000,IVT+Boot data + DCD整个的大小为3Kbyte。所以.imx的起始地址就是 0x87800000-0xc00 = 0x877ff400,那么DCD的起始地址就是0x877ff42c - 0x877ff400 = 0x2c,也就是说,0x2c这个地址开始就是DCD的数据了。
boot data0x877ff420boot地址,header里面已经设置了IVT大小是32个字节,所以boot data的地址就是0x877ff4200 + 32 = 0x877ff420
self0x877ff400IVT复制到DDR中以后的首地址
csf0x00000000csf地址
reserved20x00000000保留,未使用

Boot Data

Boot Data结构数据描述
start0x877ff000整个.imx文件的起始地址。包括前面1Kbyte的地址偏移
length0x00200000镜像文件的大小。设置为2M。
plugin0x00000000插件

DCD数据

板子复位以后,芯片内的所有寄存器都会复位为默认值,但是这些默认值往往不是理想的值,而且有些外设必须在使用之前初始化它。所以I.MX6U提出了一个DCD(Device Config Data)的概念,和IVT、Boot Data一样,DCD也是添加到.imx文件中,紧跟在IVT和Boot Data后面,IVT也指定了DCD的位置。DCD其实就是I.MX6U寄存器地址和对应的配置信息的集合,Boot ROM会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化DDR等。DCD区域不能超过1768Byte。DCD的数据结构如图:
在这里插入图片描述
DCD的header和IVT的header类似
在这里插入图片描述
Tag:占1个字节,设置为0xD2
Length:占2个字节,表示header长度(大小),大端模式
Version:占1个字节,设置为0x40或者0x41
DCD的CMD就是要初始化的寄存器地址和相应的寄存器的值,结构如图:
在这里插入图片描述
在这里插入图片描述
Tag:占1个字节,设置为0xCC
Length:占2个字节,表示写入的命令数据的长度,包含header,大端模式
Parameter:占1个字节,每个字节的每个位的含义如图
在这里插入图片描述
bytes:表示目标位置宽度,单位是byte,可以选择1、2、4字节。flags是命令控制标志位。
其中的Address和vlalue/Mask就是要初始化的寄存器地址和相应的值,注意使用的是大端模式

分析.imx的DCD数据

DCD结构数据描述
header0x40e801d2根据DCD的header数据格式,第一个字节Tag为0xd2,第2和第3的字节是DCD的大小,大端模式,所以DCD大小是0x01e8=488字节。第4个字节是0x40
Write Data Command0x04e401cc根据DCD的cmd数据格式,第1个是Tag,固定0xcc,第2和第3是命令的总长度0x01e4=484个字节。第4个字节是Parameter,是0x04,表示目标位置宽度4个字节
Address0x020c4068寄存器CCGR0的地址
Value0xffffffff写入寄存器CCGR0的值,表示打开CCGR0控制的所有外设时钟
寄存器CCGR0-寄存器CCGR5寄存器的地址和值
Address0x020e04b4寄存器IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE 寄存器的地
Value0x000c0000设置DDR所有的IO为DDR3模式
Address0x020e04ac寄存器 IOMUXC_SW_PAD_CTL_GRP_DDRPKE 地址
Value0x00000000设置DDR引脚关闭Pull/Keeper功能
Address0x020e0x7c寄存器 IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK0_P
Value0x00000030设置DRAM_SDCLK0_P引脚为R0/6
Value0x00000000设置DDR引脚关闭Pull/Keeper功能
全是DDR引脚的设置
Address0x021b001cMMDC_MDSCR 寄存器
Value0x00008000MMDC_MDSCR 寄存器值
全是MMDC寄存器的设置
Address0x021b0404MMDC_MAPSR 寄存器
Value0x00011006MMDC_MAPSR 寄存器值
Address0x021b001cMMDC_MDSCR 寄存器
Value0x00000000MMDC_MDSCR 寄存器清零

从.imx的DCD数据表中可以看出,DCD里面的初始化配置主要包括:

  1. 设置外设时钟
  2. 设置DDR所用的IO
  3. 配置MMDC控制器。初始化DDR3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__不高兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值