配置文件
使用 mk_image.py
制作烧录镜像时,需要提供 image_cfg.json
镜像配置文件。
-
镜像烧录的目标设备描述:分区表的配置
-
最终镜像的内容描述:信息和内容排布
-
中间文件的描述
{
"spi-nand": { // Device, The name should be the same with string in image:info:media:type
"size": "128m", // Size of SPI NAND
"partitions": {
"spl": { "size": "1m" },
"os": { "size": "2m" },
"rodata": { "size": "4m" },
"data": { "size": "28m" },
},
},
"image": {
"info": { // Header information about image
"platform": "d21x",
"product": "demo128_nand",
"version": "1.0.0",
"media": {
"type": "spi-nand",
"device_id": 0,
"array_organization": [
{ "page": "2k", "block": "128k", "oob": "64" },
// { "page": "4k", "block": "256k", "oob": "128" },
],
}
},
"updater": { // Image writer which is downloaded to RAM by USB
"ddr": {
"file": "usbupg-ddr-init.aic",
"attr": ["required", "run"],
"ram": "0x00103000"
},
"bootloader": {
"file": "bootloader.aic",
"attr": ["required", "run"],
"ram": "0x41000000"
},
},
"target": { // Image components which will be burn to device's partitions
"bootloader": {
"file": "bootloader.aic",
"attr": ["mtd", "required"],
"part": ["spl"]
},
"os": {
"file": "os.aic",
"attr": ["mtd", "required"],
"part": ["os"]
},
"res": {
"file": "app.fatfs",
"attr": ["mtd", "optional"],
"part": ["rodata"]
},
"app": {
"file": "page_2k_block_128k_oob_64_data.uffs",
"attr": ["uffs", "optional"],
"part": ["data"]
},
},
},
"temporary": { // Pre-proccess to generate image components from raw data
"aicboot": {
"usbupg-ddr-init.aic": { // No loader, only PreBootProgram to initialize DDR
"head_ver": "0x00010001",
"resource": {
"private": "ddr_init.bin",
"pbp": "d21x.pbp",
},
},
"bootloader.aic": {
"head_ver": "0x00010001",
"loader": {
"file": "bootloader.bin",
"load address": "0x42000000",
"entry point": "0x42000100",
},
"resource": {
"private": "ddr_init.bin",
"pbp": "d21x.pbp",
},
},
"os.aic": {
"head_ver": "0x00010001",
"loader": {
"file": "d21x.bin",
"load address": "0x40000000",
"entry point": "0x40000100",
"run in dram": "false",
}
},
},
},
}
分区表描述
spi-nand
为例:"spi-nand": { // Device, The name should be the same with string in image:info:media:type
"size": "128m", // Size of SPI NAND
"partitions": {
"spl": { "size": "1m" },
"os": { "size": "2m" },
"rodata": { "size": "4m" },
"data": { "size": "28m" },
},
},
存储设备 | 说明 |
---|---|
"spi-nand"
|
SPI NAND 设备 |
"spi-nor"
|
SPI NOR 设备 |
存储设备
的名字仅可使用上述列表所指定的名字。
存储设备对象的属性名 | 说明 |
---|---|
"size" |
值为字符串。
设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “2m”
|
"partitions"
|
是
分区表 对象。包含该存储设备的详细分区列表,每一个子对象为一个
分区 。 |
分区对象的属性名 |
说明
|
---|---|
"offset"
|
值为 16 进制字符串。
表示该
分区 的开始位置离 存储设备
的开始位置的偏移(字节)。如果 “offset” 不出现,表示当前分区紧接上一个分区。
|
"size"
|
值为字符串。
设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “2m”。
最后一个分区可以使用 “-” 表示使用剩下所有的空间。
|
"ubi"
|
是
UBIVolume 表 对象。当存储设备为 “spi-nand” 时出现,表示当前 MTD 分区是一个 UBI 设备。
该对象描述 UBI 设备中的 Volume 表。每一个子对象为一个
UBIVolume 。 |
UBI Volume 对象的属性名 | 说明 |
---|---|
"offset"
|
值为 16 进制字符串。
表示该
Volume 的开始位置离 MTD
分区的开始位置的偏移(字节)如果 “offset” 不出现,表示当前 Volume 紧接上一个 Volume。
|
"size"
|
值为字符串。
设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “2m”
最后一个分区可以使用 “-” 表示使用剩下所有的空间。
|
Image 文件描述
"image": {
"info": {
...
}
"updater": {
...
}
"target": {
...
}
}
-
“info”
Info 数据描述“info” 对象用于描述该烧录镜像的基本信息,这些信息用于生成 Image Header。以demo128_nand
为例"info": { // Header information about image "platform": "d21x", "product": "demo128_nand", "version": "1.0.0", "media": { "type": "spi-nand", "device_id": 0, "array_organization": [ { "page": "2k", "block": "128k", "oob": "64" }, // { "page": "4k", "block": "256k", "oob": "128" }, ], } },
表 5. Info 属性数据描述 info 属性 说明 "platform"
字符串,当前项目所使用的 SoC 的名字 "product"
字符串,产品名字、产品型号 "version"
字符串,按照 “x.y.z” 格式提供的版本号,其中 x,y,z 都是数字 "media"
对象,描述存储设备 表 6. media 属性 media 属性 说明 "type"
字符串 "device_id"
整数,要烧录的存储设备在 U-Boot 中的索引。 "array_organization"
对象,当存储设备为 “spi-nand” 时使用,描述存储单元的排列结构 表 7. array_organization 属性 array_organization 属性 说明 "page"
当前 SPI NAND 的 Page 大小,取值 “2K”, “4K”, "block"
当前 SPI NAND 的 Block 大小, 取值 “128K”, “256K” -
“updater”
Updater 数据描述Updater 是指进行 USB 刷机或者进行 SD 卡刷机时需要运行的刷机程序,该程序通常由 SPL/Bootloader 实现, 可能与正常启动时所运行的 SPL/Bootloader 相同,也可能不同,因此需要单独列出。
“updater” 对象描述在刷机过程中需要使用到的组件数据,其包含多个子对象,每个子对象即为一个
组件
。 其中下列的组件
是已知且必要的。表 8. 组件名称 说明 "spl"
第一级引导程序 "bootloader"
第二级引导程序,同时也是刷机程序 上述的组件名字并非固定,可根据项目的需要修改、增加或者删除。
表 9. Updater 组件属性 Updater 组件属性 说明 "file"
指定该组件的数据来源文件"ram"
USB 刷机时,指定该文件下载的内存地址"attr"
该数据对象的属性,可选的内容有:- “required” : 该数据是必需的,如果指定文件不存在,则生成镜像文件出错。- “run” : 该数据是可执行文件,USB 升级时,该数据下载完成之后会被执行。重要: “updater” 中组件
对象的顺序很重要。在 USB 升级的过程中,组件数据传输和执行的顺序即为 “updater” 中组件数据出现的顺序, 因此如果组件数据之间有顺序依赖关系,需要按照正确的顺序排布。 -
“target”
Target 数据描述“target” 描述要烧录到设备存储介质上的
组件
。与 “updater” 中的组件一样,”target” 中出现的组件根据实际需要进行添加,组件的名字也可自行定义。表 10. Target 组件属性 Target 组件属性 说明 "file"
指定该组件的数据来源文件"part"
指定该组件被烧录的分区分区名字通过字符串数组的形式提供"attr"
该数据对象的属性,可选的内容有:- “required” : 该组件数据是必需的,如果指定文件不存在,则生成镜像文件出错。- “optional” : 该组件数据不是必需的,如果指定文件不存在,则在生成镜像文件时忽略该数据对象。- “burn” : 该组件数据是需要烧录到指定分区当中。- “mtd” : 表示该组件要烧录的设备是 MTD 设备。- “ubi” : 表示该组件要烧录的设备是 UBI 设备。- “block” : 表示该组件要烧录的设备是块设备。重要:在 USB 升级的过程中,组件数据传输和烧录的顺序即为 “target” 中组件数据出现的顺序。
中间文件描述
“temporary” 描述的是镜像文件生成过程中需要生成的中间文件。通过描述数据对象的方式, 描述不同类型的中间文件的生成过程,可用于对组件的签名、加密、再次打包等处理。
当前支持 aicboot
数据处理,aicboot
描述了 AIC 启动镜像的生成。
aicboot
对象中添加一个子对象, 其对象名字即为生成的文件名字,可配置的内容如下面的示例所示。所列的属性中,只有
“loader” 是必需的,
其他的可根据项目需要进行删减。"aicboot": {
"usbupg-ddr-init.aic": { // No loader, only PreBootProgram to initialize DDR
"head_ver": "0x00010001",
"resource": {
"private": "ddr_init.bin",
"pbp": "d21x.pbp",
},
},
"bootloader.aic": {
"head_ver": "0x00010001",
"loader": {
"file": "bootloader.bin",
"load address": "0x42000000",
"entry point": "0x42000100",
},
"resource": {
"private": "ddr_init.bin",
"pbp": "d21x.pbp",
},
},
"os.aic": {
"head_ver": "0x00010001",
"loader": {
"file": "d21x.bin",
"load address": "0x40000000",
"entry point": "0x40000100",
"run in dram": "false",
}
},
}