IMX头部详细解析之一 头部组成

欧大琛 2020-01-31 PM 3016℃ 0条

镜像组成

完整的imx镜像由以下四部分组成:

  • Image Vector Table(映像向量表)
  • Boot Data(启动数据)
  • Device Configuration Data(设备配置数据)
  • User Code & Data(用户代码与数据)

IVT

映像向量表(IVT)是SOC的内部BootRom从BootDevice中读取的一组数据信息,该数据中指定了运行时各部分组件的地址。
IVT中包含了用户应用的入口地址,DCD部分的运行时地址,Boot Data的运行时地址等。
内部BootRom根据Boot Device不同对IVT的起始地址有所规定,IVT相对及地址的偏移和初始化加载大小如下:

Boot Device TypeImage Vector Table OffsetInitial Load Region Size
NOR4KbyteEntire Image Size
NAND1Kbyte4Kbytes
OneNAND256bytes1Kbytes
SD/MMC/eSD/eMMC/SDXC1Kbytes4Kbytes
I2S/SPI EEPROM1Kbytes4Kbytes
SATA1Kbytes4Kbytes

BootRom只需要知道IVT的地址,其他的组成部分的地址则可以根据IVT中查询到。
以下为BootDevice中IVT在运行时,各成员的实际运行地址。
8f5431ab-e046-4ee9-8dec-f35d4264e8ec

IVT具体结构如下,每个成员均为32bit

897bb244-3c95-4493-a63e-5950b8e5bef1

header:

e2459cd9-40b6-4a02-a32e-5d23215705bc

Tag:固定字节0xD1,1字节
Length:IVT的长度,大端表示,2字节(固定为0x0020(32字节))
Version:版本固定为0x40,0x41

entry:

用户程序的运行地址,连接地址

reserved1:

保留,值为0

dcd:

运行时的DCD地址,该值 = entry - Initial Load Region Size + IVT Offset + boot data size

boot data:

运行时的boot data的绝对地址,该值 = dcd - boot data size

self:

运行时的IVT地址,该值 = entry - Initial Load Region Size + IVT Offset

csf:

运行时的HAB库所使用的命令序列文件的地址,不使用时为0

reserved2:

保留,值为0


Boot Data

b7a1a1ae-ac44-4169-91e7-86c765f358f9

start:

长度4字节,运行时imx头的地址(包含了IVT Offset),该值 = entry - Initial Load Region Size

length:

imx镜像的大小(包含IVT Offset),以u-boot.imx,该值为u-boot.imx大小 + IVT Offset

plugin:

插件标志,imx6原生支持的Boot Device是有限的,如果我们想使用其他的Boot源(如Ethernet、CDROM、USB等),则需要提供对应的驱动程序,来完成Boot过程。具体的驱动程序路径则在DCD配置文件设置。


Device Configuration Data

复位后,系统通常使用默认的寄存器值运行,但这却不一定是我们需要的最好运行状态,为此我们需要使用更合适的寄存器配置,让系统运行在更合适的状态。内部Boot Rom通过IVT中的信息确定DCD的地址。
下表为DCD的结构,每个成员均为32bit
e9d178b9-ae57-48a1-a2eb-744a16468319

Header:

a04545d5-a147-4223-bac4-5c04b73f483d

Tag:固定字节0xD2,1字节
Length:DCD的长度,大端表示,2字节
Version:版本固定为0x40,0x41(手册上为0x41,查看u-boot.imx头部,该字段为0x40)

[CMD]:

根据CMD的Header的Tag,CMD共由四种不同的命令组成。

1.Write Data Command:

用于向指定的寄存器地址写入值
2b57451d-8c4d-423e-8d93-183103698f30

54c1b7dc-308f-4173-b6b2-e384b3a22a62

Header:

Tag:固定字节0xCC,1字节
Length:WDC命令的长度, 大端表示,2字节
Parameter:命令控制域,1字节

15ec09a5-ba19-455d-be5f-97b33d823261

Parameter:

bytes:写入值的长度(1,2,4bytes)
flags:控制当前命令行为:设置值或设置掩码,bit3为mask标识位,bit4为set标识位,对应行为如下:

097caeeb-814e-42a4-9113-366eb333c485

Address:

有效寄存器地址如下
c7d4705a-33f5-4389-9312-b4489f064427

Value/Mask:

实际数据

2.Check Data Command:

用于校验寄存器值

9eb5d8ff-95ea-4f95-a190-83e8afb17998

Header:

Tag:固定字节0xCF,1字节
Length:CDC命令的长度, 大端表示,2字节
Parameter:命令控制域,1字节

f2080423-06dd-44f1-bde0-d4f831337f18

Parameter

bytes:写入值的长度(1,2,4bytes)
flags:控制当前命令行为:设置值或设置掩码,bit3为mask标识位,bit4为set标识位,对应行为如下:

d45f3ff4-5d68-4bfb-ad51-4e576e418a8e

address:

需要测试的寄存器地址

mask:

测试掩码值

count:

可选,轮询次数,如果未指定,则无限轮询,直到符合退出条件,如果为0,则等于空操作。

3.Nop Command:

空命令
a6874a82-57d5-4213-8310-999602abb7f3

header:

Tag:固定字节0xC0,1字节
Length:NC命令长度,固定4字节
Undefined:无效位,写0

4.Unlock Command:

解锁命令
136f01f1-0260-44b3-ad9a-7bb1def9b21c

header:

Tag:固定字节0xB2,1字节
Length:UC命令长度,大端表示,2字节
Eng:待解锁的引擎

Value:

解锁所需值

参考文章:i.MX 6ULL Applications Processor Reference Manual

标签: nxp, imx6, u-boot.imx

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

欧大琛

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成赞赏

非特殊说明,本博所有文章均为博主原创。

评论啦~