3.11.1. AIC 启动镜像格式

ZX BROM 所使用的启动镜像格式。

表 3.13 AIC启动镜像格式

数据区域

数据分块

字段

字节

描述

Signed Area

Block1

(256B)

Magic

4

特征字符串,固定为 ”AIC ”

Checksum

4

32 bit 累加和校验的校验值。安全启动方案设为0.

Header version

4

本文件头结构的版本号,当前版本为v1.0: 0x00010001

Image length

4

从文件开头到结束的总数据长度

Firmware version

4

固件版本号,不同版本之间应单调递增

Loader length

4

第一级引导程序的有效数据的长度,不包括填充数据

Load address

4

镜像数据加载到内存的目标地址

Entry point

4

第一级引导程序的可执行代码入口地址

Signature algorithm

4

0:没有签名,仅计算Checksum;1:RSA-2048;

Encryption algorithm

4

0:固件不加密;1:AES-128-CBC 加密

Signature result offset

4

数字签名数据区域的偏移,从文件头开始计算

Signature result length

4

数字签名的长度

Signature key offset

4

RSA 公钥数据区域的偏移

Signature key length

4

RSA 公钥数据的长度

IV data offset

4

AES-CBC IV数据区域的偏移

IV data length

4

IV 的长度

Private data offset

4

第一级引导程序私有数据区域的偏移

Private data length

4

第一级引导程序私有数据区域的长度

PBP offset

4

PBP 数据区域的偏移

PBP length

4

PBP 数据的长度

Padding

176

填充,使得头部刚好 256 字节

Block2

Loader binary data

X

第一级引导程序的保存区域

Padding

X

增加填充,使得 256 字节对齐

Block3

Private data area

X

存放镜像代码中可能使用的私有数据。

Signature key area

X

存放 RSA 公钥,DER 格式的密钥文件。应4字节对齐。

IV data area

16

存放 AES IV 数据,16字节。应4字节对齐。

PBP area

X

存放 PBP 程序。应16字节对齐。

Padding

X

填充,使得 256 byte 对齐,方便计算数字签名

Block4

Signature result area

256

前面所有内容的数字签名

对于 NAND,在保存第一级引导程序的时候,还会在每个 NAND Block 的第一个 Page 生成 Page Table。Page Table 的作用是用于快速索引镜像数据所在的不同备份 Page 地址。

表 3.14 NAND Page Table 格式

Index

Content (20 Bytes)

0

Magic(4 Bytes)

Count(4 Bytes)

Padding (12 Bytes)

1

PA(4 Bytes)

(Backup 0)

PA(4 Bytes)

(Backup 1)

PA(4 Bytes)

(Backup 2)

PA(4 Bytes)

(Backup 3)

Checksum

(4 Bytes)

2

PA(4 Bytes)

(Backup 0)

PA(4 Bytes)

(Backup 1)

PA(4 Bytes)

(Backup 2)

PA(4 Bytes)

(Backup 3)

Checksum

(4 Bytes)

…

…

…

…

…

…

Magic 开头的 20 字节,是 Page Table 的头信息,其中 Magic 的值固定为 “AICP”, Count 表示 BootLoader 的数据被分为几个 Page 进行保存。

从 Index 1 表示 BootLoader 的第一个 Page 数据有4个备份,被分别存放在对应 PA(Page address) 所指的 NAND Page 中,Checksum 值是该 Page 数据的校验值。

3.11.2. 烧录镜像格式

ZX 的烧录镜像文件由组件(FirmWare Component) 以及对应的组件元信息组成。 数据分布如下图所示。

../../../_images/image_format.png

图 3.7 烧录镜像格式

其中一些需要打包的数据文件,都被当做组件(FWC)进行处理,包括 SPL,U-Boot,Kernel,DTB 等数据。

Image Header 的具体格式如下:

struct zx_fw_hdr{
    char magic[8];      // 固定为 "AIC.FW"
    char platform[64];  // 该镜像文件适用的芯片平台
    char product[64];   // 该镜像文件适用的产品型号
    char version[64];   // 该镜像的版本
    char media_type[64];// 该镜像文件可烧录的存储介质
    u32  media_dev_id;  // 该镜像文件可烧录的存储介质 ID
    u8   nand_id[64];   // 当存储介质为 NAND 时,适用的 NAND ID
    u32  meta_offset;   // FWC Meta Area start offset
    u32  meta_size;     // FWC Meta Area size
    u32  file_offset;   // FWC File data Area start offset
    u32  file_size;     // FWC File data Area size
    u8 padding[];       // Pad to 2048
};

FWC Meta 的格式如下:

struct zx_fwc_meta {
    char magic[8];      // 固定为 "META"
    char name[64];      // 对应组件的名字
    char partition[64]; // 该组件要烧录的分区名字
    u32  offset;        // 该组件数据在镜像文件中的偏移
    u32  size;          // 该组件数据的大小
    u32  crc32;         // 该组件数据的CRC32校验值
    u32  ram;           // 当组件要下载到平台 RAM 时,要下载的地址
    char attr[64]       // 该组件的属性,字符串表示
    u8 padding[296];    // Pad to 512
};