2.6. 烧录镜像
Luban SDK 编译的最终输出结果是一个用于烧录到目标平台的镜像文件。
2.6.1. 镜像格式
ArtInChip 的烧录镜像文件由组件(FirmWare Component) 以及对应的组件元信息组成。 数据分布如下图所示。
图 2.47 烧录镜像格式
其中一些需要打包的数据文件,都被当做组件(FWC)进行处理,包括 SPL,U-Boot,Kernel,DTB 等数据。
Image Header 的具体格式如下:
struct artinchip_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_array_org[64]; // NAND Cell Array 的组织
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 artinchip_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
};
2.6.2. 制作工具
工具 | 说明 |
---|---|
mkimage | 用于:- 制作 uImage 格式的 U-Boot 镜像- 制作 FIT 镜像- 对 FIT 镜像进行签名 |
mkenvimage | 用于:编译生成 env.bin |
mk_image.py | 用于:- 制作 AIC 格式的启动镜像,包括签名和加密- 打包固件组件,生成用于升级的固件镜像文件。tools/scripts/mk_image.py |
2.6.3. 配置文件
使用 mk_image.py
制作烧录镜像时,需要提供 image_cfg.json
镜像配置文件。
该配置文件通过嵌套对象的方式,描述一个待生成的镜像文件所包含的信息和数据。如下面的示例,该描述文件分为几部分:
- 镜像烧录的目标设备描述:分区表的配置
- 最终镜像的内容描述:信息和内容排布
- 中间文件的描述
{
"mmc": { // Media type
"size": "8G", // Size of SD/eMMC
"partitions": { // Partition table apply to device
"spl_1": { "offset": "0x4400", "size": "128k" },
"spl_2": { "size": "367k" },
"uboot": { "size": "1m" },
"env": { "size": "512k" },
"kernel": { "size": "16m" },
"rootfs": { "size": "64m" },
"user": { "size": "-" },
},
},
"image": {
"info": { // Header information about image
"platform": "d211",
"product": "per1_mmc",
"version": "1.0.0",
"media": {
"type": "mmc",
"device_id": 0,
}
},
"updater": { // Image writer which is downloaded to RAM by USB
"spl": {
"file": "u-boot-spl-dtb.aic",
"attr": ["required", "run"],
"ram": "0x00103000"
},
"env": {
"file": "env.bin",
"attr": ["required"],
"ram": "0x83100000"
},
"uboot": {
"file": "u-boot-dtb.aic",
"attr": ["required", "run"],
"ram": "0x80007F00"
}
},
"target": { // Image components which will be burn to device's partitions
"spl": {
"file": "u-boot-spl-dtb.aic",
"attr": ["required"],
"part": ["spl_1"]
},
"uboot": {
"file": "u-boot-dtb.img",
"attr": ["block", "required"],
"part": ["uboot"]
},
"env": {
"file": "env.bin",
"attr": ["block", "required"],
"part": ["env"]
},
"kernel": {
"file": "kernel.itb",
"attr": ["block", "required"],
"part": ["kernel"]
},
"rootfs": {
"file": "rootfs.ext4",
"attr": ["block", "required"],
"part": ["rootfs"]
},
"app": {
"file": "user.ext4",
"attr": ["block", "optional"],
"part": ["user"]
},
},
},
"temporary": { // Pre-proccess to generate image components from raw data
"aicboot": {
"u-boot-spl-dtb.aic": {
"head_ver": "0x00010000",
"loader": {
"file": "u-boot-spl-dtb.bin",
"load address": "0x103100",
"entry point": "0x103100",
},
},
"u-boot-dtb.aic": {
"head_ver": "0x00010000",
"loader": {
"file": "u-boot-dtb.bin",
"load address": "0x80008000",
"entry point": "0x80008000",
},
},
},
"uboot_env": {
"env.bin": {
"file": "env.txt",
"size": "0x4000",
},
},
"itb": {
"kernel.itb": {
"its": "kernel.its"
},
},
},
}
2.6.3.1. 分区表描述
image_cfg.json
文件的开头首先描述的是当前要烧录的目标存储设备,以及在设备上的分区配置。
"<media type>": {
"size": "xx",
"partitions": {
"<part n>": {
"offset": "yy",
"size": "zz",
"ubi": {
"offset": "ii",
"size": "jj",
}
}
}
}
存储设备 | 说明 |
---|---|
“mmc” | eMMC 和 SD Card 设备 |
“spi-nand” | SPI NAND 设备 |
“spi-nor” | SPI NOR 设备 |
存储设备
的名字仅可使用上述列表所指定的名字。
存储设备
的可设置属性有:
存储设备对象的属性名 说明 | |
---|---|
“size” | 值为字符串。设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “8G” |
“partitions” | 是 分区表 对象。包含该存储设备的详细分区列表,每一个子对象为一个 分区 。 |
分区
对象的属性有:
分区对象的属性名 说明 | |
---|---|
“offset” | 值 为16进制字符串。表示该 分区 的开始位置离 存储设备 的开始位置的偏移(字节)。如果 “offset” 不出现,表示当前分区紧接上一个分区。 |
“size” | 值为字符串。设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “8G”。最后一个分区可以使用 “-” 表示使用剩下所有的空间。 |
“ubi” | 是 UBI Volume 表 对象。当存储设备为 “spi-nand” 时出现,表示当前 MTD 分区是一个 UBI 设备。该对象描述 UBI 设备中的 Volume 表。每一个子对象为一个 UBI Volume 。 |
UBI Volume
对象的属性有:
UBI Volume对象的属性名 | 说明 |
---|---|
“offset” | 值为16进制字符串。表示该 Volume 的开始位置离 MTD 分区的开始位置的偏移(字节)如果 “offset” 不出现,表示当前 Volume 紧接上一个 Volume。 |
“size” | 值为字符串。设备的存储大小(Byte),可使用 “K,M,G” 单位,e.g. “8G”最后一个分区可以使用 “-” 表示使用剩下所有的空间。 |
2.6.3.2. Image 文件描述
“image” 对象描述要生成的镜像文件的基本信息,以及要打包的数据。包含几个部分:
- “info”
- “updater”
- “target”
"image": {
"info": {
...
}
"updater": {
...
}
"target": {
...
}
}