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
};