赞
踩
在上一节中,我们是通过imxdownload工具来生成一个.imx的文件,再将这个文件写到SD卡中的。那么imxdownload工具具体是做什么事情?
imxdownload其实是imxdownload.c编译生成的一个可执行文件,imxdownload.c的组成主要有:
固定的地址
存放着。.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结构 | 数据 | 描述 |
---|---|---|
header | 0x402000d1 | 将前面的4个字节提取出来,遵循大端模式(低地址保存高字节),即0xd1002040 ====》0x402000d1,也就是说这个header的Tag是0xd1,Length是0x20=32个字节,Verison是0x40。 |
entry | 0x87800000 | 接下来是一个entry,它是一个绝对地址,也就是入口地址,镜像第一行指令所在的位置。由于,这个地址在makefile中指定了0x87800000,所以这里的第4~第7即0x00008087转成大端模式 ====》0x87800000。 |
reserved1 | 0x00000000 | 保留,未使用 |
dcd | 0x877ff42c | DCD地址。镜像地址是0x87800000,IVT+Boot data + DCD整个的大小为3Kbyte。所以.imx的起始地址就是 0x87800000-0xc00 = 0x877ff400,那么DCD的起始地址就是0x877ff42c - 0x877ff400 = 0x2c,也就是说,0x2c这个地址开始就是DCD的数据了。 |
boot data | 0x877ff420 | boot地址,header里面已经设置了IVT大小是32个字节,所以boot data的地址就是0x877ff4200 + 32 = 0x877ff420 |
self | 0x877ff400 | IVT复制到DDR中以后的首地址 |
csf | 0x00000000 | csf地址 |
reserved2 | 0x00000000 | 保留,未使用 |
Boot Data结构 | 数据 | 描述 |
---|---|---|
start | 0x877ff000 | 整个.imx文件的起始地址。包括前面1Kbyte的地址偏移 |
length | 0x00200000 | 镜像文件的大小。设置为2M。 |
plugin | 0x00000000 | 插件 |
板子复位以后,芯片内的所有寄存器都会复位为默认值,但是这些默认值往往不是理想的值,而且有些外设必须在使用之前初始化它。所以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就是要初始化的寄存器地址和相应的值,注意使用的是大端模式
。
DCD结构 | 数据 | 描述 |
---|---|---|
header | 0x40e801d2 | 根据DCD的header数据格式,第一个字节Tag为0xd2,第2和第3的字节是DCD的大小,大端模式,所以DCD大小是0x01e8=488字节。第4个字节是0x40 |
Write Data Command | 0x04e401cc | 根据DCD的cmd数据格式,第1个是Tag,固定0xcc,第2和第3是命令的总长度0x01e4=484个字节。第4个字节是Parameter,是0x04,表示目标位置宽度4个字节 |
Address | 0x020c4068 | 寄存器CCGR0的地址 |
Value | 0xffffffff | 写入寄存器CCGR0的值,表示打开CCGR0控制的所有外设时钟 |
… | … | 寄存器CCGR0-寄存器CCGR5寄存器的地址和值 |
Address | 0x020e04b4 | 寄存器IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE 寄存器的地 |
址 | ||
Value | 0x000c0000 | 设置DDR所有的IO为DDR3模式 |
Address | 0x020e04ac | 寄存器 IOMUXC_SW_PAD_CTL_GRP_DDRPKE 地址 |
Value | 0x00000000 | 设置DDR引脚关闭Pull/Keeper功能 |
Address | 0x020e0x7c | 寄存器 IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK0_P |
Value | 0x00000030 | 设置DRAM_SDCLK0_P引脚为R0/6 |
Value | 0x00000000 | 设置DDR引脚关闭Pull/Keeper功能 |
… | … | 全是DDR引脚的设置 |
Address | 0x021b001c | MMDC_MDSCR 寄存器 |
Value | 0x00008000 | MMDC_MDSCR 寄存器值 |
… | … | 全是MMDC寄存器的设置 |
Address | 0x021b0404 | MMDC_MAPSR 寄存器 |
Value | 0x00011006 | MMDC_MAPSR 寄存器值 |
Address | 0x021b001c | MMDC_MDSCR 寄存器 |
Value | 0x00000000 | MMDC_MDSCR 寄存器清零 |
从.imx的DCD数据表中可以看出,DCD里面的初始化配置主要包括:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。