5.4.1. 系统分区

分区表的配置在 image_cfg.json 文件中完成,可以很容易的进行增删改查操作

5.4.1.1. 配置说明

image_cfg.json 是描述如何生成烧录镜像的文件,其中的第一部分就是描述烧录的目标存储介质的分区设置。

5.4.1.1.1. eMMC

"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": "64m" },
                "data":   { "size": "-" },
        },
},

其中 mmc 有两个属性:

  • size

    eMMC 存储设备的总大小(User Data Area)。

  • partitions

    在该对象下,可以根据需要,按顺序添加分区,并且设置分区的开始位置和大小。

    • offset: 分区的开始地址,相对 eMMC 0 地址的偏移。值应使用16进制字符串表示。如果 offset 没有出现,表示紧接上一个分区。

    • size: 分区的大小,可使用 K, M, G 单位。最后一个分区可以使用 “-” 代替,表示剩余所有的空间都分配给该分区。

备注

eMMC 的第一个分区,从 0x4400 开始,前面的 34 个 LBA 是保留给 GPT 分区表头用的。 SPL 分区,可以设置两个备份。从 0x4400 开始,每个分区大小 为 128KB。

5.4.1.1.2. SPI NOR

"spi-nor": { // Media type
        "size": "16m", // Size of NOR
        "partitions": {
                "spl":  { "size": "128k" },
                "uboot":  { "size": "768k" },
                "env":    { "size": "128k" },
                "kernel": { "size": "6m" },
                "rootfs": { "size": "5m" },
                "user":   { "size": "4m" },
                "data":   { "size": "-" },
        }
},

其中 spi-nor 有两个属性:

  • size

    SPI NOR 设备的总大小。

  • partitions

    在该对象下,可以根据需要,按顺序添加 MTD 分区,并且设置分区的开始位置和大小。

    • offset: 分区的开始地址,相对设备 0 地址的偏移。值应使用16进制字符串表示。如果 offset 没有出现,表示紧接上一个分区。

    • size: 分区的大小,可使用 K, M, G 单位。最后一个分区可以使用 “-” 代替,表示剩余所有的空间都分配给该分区。

备注

SPI NOR 的 SPL 可以设置两个备份分区。从 0 开始,每个大小128KB。 第二个备份分区可以不设置。

5.4.1.1.3. 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" },
                "uboot":  { "size": "1m" },
                "env":    { "size": "256k" },
                "kernel": { "size": "12m" },
                "ubiroot": {
                        "size": "32m",
                        "ubi": { // Volume in UBI device
                                "rootfs": { "size": "-" },
                        },
                },
                "ubisystem": {
                        "size": "-",
                        "ubi": { // Volume in UBI device
                                "user":   { "size": "64m" },
                        },
                        "ubi": { // Volume in UBI device
                                "data":   { "size": "-" },
                        },
                },
        }
},

其中 spi-nand 有两个属性:

  • size

    SPI NAND 设备的总大小。

  • partitions

    在该对象下,可以根据需要,按顺序添加 MTD 分区,设置分区的开始位置和大小,以及设置该 MTD 分区是否为 UBI 设备:

    • offset: 分区的开始地址,相对设备 0 地址的偏移。值应使用16进制字符串表示。如果 offset 没有出现,表示紧接上一个分区。

    • size: 分区的大小,可使用 K, M, G 单位。最后一个分区可以使用 “-” 代替,表示剩余所有的空间都分配给该分区。

    • ubi

      如果设置了该对象,则说明该 MTD 分区是一个 UBI 设备,可以进一步描述 UBI Volume 的划分。

      在该对象下,可以根据需要,按顺序添加该 UBI 设备中的 Volume 描述,每一个 Volume 拥有下列属性:

      • offset: Volume 的开始地址,相对 UBI 设备 0 地址的偏移。值应使用16进制字符串表示。如果 offset 没有出现,表示紧接上一个 Volume。

      • size: Volume 的大小,可使用 K, M, G 单位。最后一个 Volume 可以使用 “-” 代替,表示 UBI 设备剩余所有的空间都分配给该 Volume。

注意

SPI NAND 的 spl 分区大小,固定为1MB。里面包含 4 个 SPL 备份。

5.4.1.2. 启动相关分区

启动相关的分区,修改之后要注意同步修改 U-Boot 和 env.txt 中的配置。

5.4.1.2.1. U-Boot 所在的分区修改

U-Boot 所在的分区修改之后,对应 defconfig 中的位置也应该同步更新。

eMMC

SPI NOR

SPI NAND

CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR

CONFIG_SYS_SPI_U_BOOT_OFFS

CONFIG_SYS_SPI_NAND_U_BOOT_OFFS

5.4.1.2.2. ENV 所在的分区修改

ENV 所在的分区修改之后,对应 defconfig 中的位置也应该同步更新。

eMMC

SPI NOR

SPI NAND

CONFIG_ENV_OFFSET

CONFIG_ENV_OFFSET

CONFIG_ENV_OFFSET

CONFIG_ENV_OFFSET_REDUND

CONFIG_ENV_OFFSET_REDUND

CONFIG_ENV_RANGE

CONFIG_ENV_SIZE

CONFIG_ENV_SIZE

CONFIG_ENV_SECT_SIZE

5.4.1.2.3. RootFS 所在的分区位置变化

RootFS 所在的分区位置发生变化之后,需要修改 bootargs 相关的配置。相关的文件通常在

target/linux/m4/nand/ZXM47D00/image/env.txt

eMMC 的 root= 参数是自动生成的,但前提条件是 RootFS 分区名字要为 rootfs 。如果 RootFS 分区名字发生了改变, 应同步修改:

set_mmc_root=part number mmc ${boot_devnum} rootfs rootfs_part; \
         setexpr rootfs_part ${rootfs_part} + 0; \
         setenv mmc_root "/dev/mmcblk${boot_devnum}p${rootfs_part}";

SPI NOR 中的 RootFS 分区位置发生变化时,应同步修改:

nor_root=/dev/mtdblock4

SPI NAND 中的 RootFS 通常放在 UBI 中,如果相应的位置发生变化,需要同步修改:

nand_root=ubi0:rootfs
ubi_rootfs_mtd=4