一,Zynq-7000 SoC 启动头文件
0x00-0x1F |
Arm® 矢量表 |
由 Bootgen 使用虚拟矢量表填充(Arm 操作代码 0xEAFFFFFE,即用于捕获未初始化矢量的 branch-to-self 无限循环)。 |
0x20 |
宽度检测字 |
此项是识别单堆栈模式、双堆栈模式或双并行模式下的 QSPI 闪存所必需的。0xAA995566(小字节序格式)。 |
0x24 |
头文件签名 |
包含 4 个字节的“X”、“N”、“L”、“X”(按字节顺序),按小字节序格式为 0x584c4e58。 |
0x28 |
密钥源 |
器件中加密密钥的位置:
|
0x2C |
头文件版本 |
0x01010000 |
0x30 |
源偏移 |
此镜像文件中 FSBL(启动加载程序)的位置。 |
0x34 |
FSBL 镜像长度 |
解密后 FSBL 的长度。 |
0x38 |
FSBL 加载地址 (RAM) |
FSBL 要复制到的目标 RAM 地址。 |
0x3C |
FSBL 执行地址 (RAM) |
FSBL 执行的入口矢量。 |
0x40 |
FSBL 总长 |
加密后 FSBL 的总大小,包括身份验证证书(如有)和填充。 |
0x44 |
QSPI 配置字 |
硬编码为 0x00000001。 |
0x48 |
启动头文件校验和 |
从偏移 0x20 到 0x44(含)的字数总和。这些字假定按小字节序。 |
0x4c-0x97 |
用户定义的字段 |
76 个字节 |
0x98 |
镜像头文件表偏移 |
指向镜像头文件表的指针 |
0x9C |
分区头文件表偏移 |
指向分区头文件表的指针 |
Bootgen 中的“寄存器初始化表”采用 256 个地址/值对格式,用于为 MIO 多路复用器和闪存时钟初始化 PS 寄存器。
地址偏移 |
参数 |
描述 |
0xA0 到 0x89C |
寄存器初始化对:: |
Address = 0xFFFFFFFF 表示跳过该寄存器并忽略该值。 所有未使用的寄存器字段都必须设置为 Address=0xFFFFFFFF 和 value = 0x0。 |
三,Zynq-7000 SoC 镜像头文件表
Bootgen 通过从 ELF 文件、比特流、数据文件等中提取数据来创建启动镜像。从中提取数据的这些文件被称为镜像。每个镜像都包含一个或多个分区。“镜像头文件 (Image Header)”表采用包含所有镜像公用的信息以及如下信息的结构:镜像数量、启动镜像中存在的分区数量以及指向其它头文件表的指针。下表提供了 Zynq®-7000 SoC 器件的地址偏移、参数和描述。
Zynq-7000 SoC 镜像头文件表 |
||
地址偏移 |
参数 |
描述 |
0x00 |
Version |
0x01010000:仅包含以下可用字段:0x0、0x4、0x8、0xC 和填充 0x01020000:0x10 字段为添加的字段。 |
0x04 |
镜像头文件计数 |
表示镜像头文件的数量。 |
0x08 |
首个分区头文件偏移 |
指向首个分区头文件的指针。(字偏移) |
0x0C |
首个镜像头文件偏移 |
指向首个镜像头文件的指针。(字偏移) |
0x10 |
头文件身份验证证书偏移 |
指向身份验证证书头文件的指针。(字偏移) |
0x14 |
保留 |
默认为 0xFFFFFFFF。 |
“镜像头文件 (Image Header)”为阵列结构,其中包含每个镜像的相关信息,例如,ELF 文件、比特流、数据文件等。每个镜像都可具有多个分区,例如,每个 ELF 均可包含多个可加载节,每个节均构成启动镜像中的一个分区。该表还包含镜像相关分区数量的信息。下表提供了 Zynq-7000 SoC 器件的地址偏移、参数和描述。
Zynq-7000 SoC 镜像头文件 |
||
地址偏移 |
参数 |
描述 |
0x00 |
下一个镜像头文件。 |
链接到下一个镜像头文件。如果当前镜像头文件为 最后一个镜像头文件,则为 0(字偏移)。 |
0x04 |
对应的分区头文件。 |
链接到首个关联的分区头文件(字偏移)。 |
0x08 |
保留 |
始终为 0。 |
0x0C |
分区计数长度 |
与此镜像关联的分区数量。 |
0x10 到 N |
镜像名称 |
以大字节序打包。为对该字符串进行重构,请每次解包 4 个字节、 反转顺序然后串联。例如,字符串“FSBL10.ELF”打包为 0x10: ‘L’,’B’,’S’,’F’, 0x14: ’E’,’.’,’0’,’1’, 0x18: ’\0’,’\0’,’F’,’L’。 打包的镜像名称为 4 个字节的倍数。 |
否 |
字符串终止符 |
0x00000000 |
N+4 |
保留 |
默认为 0xFFFFFFFF,边界为 64 个字节。 |
“分区头文件 (Partition Header)”为阵列结构,其中包含每个分区的相关信息。每个分区头文件表均由启动加载程序进行解析。该表中将包含分区大小、闪存中的地址、RAM 中的加载地址、已加密/已签名等信息。针对每个分区(包含 FSBL)均存在一个此类结构。表中最后一个结构将全部标记 NULL 值(校验和除外)。下表显示了有关 Zynq-7000 SoC 分区头文件的偏移、名称和注释。
Zynq-7000 SoC 分区头文件 |
||
偏移 |
名称 |
注释 |
0x00 |
已加密的分区长度 |
已加密的分区数据长度。 |
0x04 |
未加密的分区长度 |
未加密的数据长度。 |
0x08 |
分区总字长(包括身份验证证书) |
分区总字长由已加密的信息长度(含填充)、扩展长度和身份验证长度组成。 |
0x0C |
目标加载地址。 |
此分区要加载到的 RAM 地址。 |
0x10 |
目标执行地址。 |
此分区执行时的入口点。 |
0x14 |
镜像中的数据字偏移 |
与启动镜像开始位置相关的分区数据的位置 |
0x18 |
属性位数 |
请参阅 Zynq-7000 SoC 分区属性位 |
0x1C |
节数 |
单一分区内的节数。 |
0x20 |
校验和字偏移 |
启动镜像中对应校验和字的位置。 |
0x24 |
镜像头文件字偏移 |
启动镜像中对应镜像头文件的位置。 |
0x28 |
身份验证证书字偏移 |
启动镜像中对应身份验证证书的位置。 |
0x2C-0x38 |
保留 |
保留 |
0x3C |
头文件校验和 |
“分区头文件”中的先前字数总和。 |
五,Bootgen GUI 选项
Vitis GUI 中的Create Boot Image Wizard 可提供有限数量的 Bootgen 选项以生成启动镜像。
要使用 GUI 创建启动镜像,请执行以下操作:
1,在Project Navigator或C/C++ Projects视图中选择应用工程,然后右键单击Create Boot Image。或者,单击Xilinx Create Boot Image。
这样会打开Create Boot Image对话框,其中包含从所选 C 语言工程上下文中预选的默认值。注意:
(1)针对应用首次运行Create Boot Image时,在此对话框中将预填充 FSBL ELF 文件路径、所选硬件的比特流(如果在硬件工程中存在此比特流)以及所选应用 ELF 文件。
(2)如果先前为此应用运行了启动镜像,并且存在 BIF 文件,那么在此页面中将预填充来自 /bif 文件夹的值。
2,在Create Boot Image对话框中填充以下信息:
(1)从Architecture下拉菜单中选择所需的架构。
(2)选择Create a BIF file或Import an existing BIF file。
(3)从Basic选项卡中,指定Output BIF file path。
(4)如果适用,请指定 UDF data:请参阅 udf_data 以获取有关该选项的更多信息。
(5)指定 Output path:
3,在Boot image partitions中,单击Add按钮以添加其它分区镜像。
4,为启动镜像中的分区创建偏移值、对齐值和分配值(如适用)。
默认情况下,输出文件路径设置为所选应用工程下的 /bif 文件夹。
5,从Security选项卡中,可指定用于创建安全镜像的属性。此安全选项可根据需要应用于各分区。
6,要为分区启用身份验证,请选中Use Authentication选项,然后指定 PPK、SPK、PSK 和 SSK 值。如需了解更多信息,请参阅 使用身份验证 主题。
(1)要为分区启用加密,请选择Encryption视图,然后选中Use Encryption选项。如需了解更多信息,请参阅 使用加密。
(2)逐一为每个分区创建或导入 BIF 文件启动镜像,从启动加载程序开始。分区列表可显示 BIF 文件中的分区摘要信息。其中可显示文件路径、加密设置和身份验证设置。此区域可用于对分区进行添加、删除、修改和重新排序。您还可为启用加密、身份验证和校验和设置值,并指定其它分区相关的值,如,Load、Alignment和Offset。