Edit online

配置系统分区

17 Dec 2024
Read time: 5 minute(s)

image_cfg.jsonSDK/target/chip/board目录下描述如何生成烧录镜像的文件。在 image_cfg.json 文件中,可以完成目标存储介质的分区设置,进行增删改查操作。

配置存储介质分区

根据不同的存储介质,执行不同的分区配置,详情如下:
  • 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": "-" },
            },
    },
    1. eMMC 分配配置参数描述
    参数名 描述
    size eMMC 存储设备的总大小 (User Data Area)
    partitions 设备分区表。根据需要,按顺序添加分区,并且设置分区的开始位置和大小。
    注:
    eMMC 的第一个分区,从 0x4400 开始,前面的 34 个 LBA 是保留给 GPT 分区表头用的。 SPL 分区,可以设置两个备份。从 0x4400 开始,每个分区大小 为 128KB。
    offset 分区开始地址,相对设备 0 地址的偏移。

    使用 16 进制字符串表示配置值。如果 offset 参数未出现,表示紧接上一个分区。

    size 分区的大小,可使用 K, M, G 单位。最后一个分区可以使用 “-” 代替,表示剩余所有的空间都分配给该分区。
  • 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": "-" },
            }
    },
    
    2. SPI NOR 分区配置参数描述
    参数名称 描述
    size SPI NOR 设备的总大小。
    partitions 设备分区表。根据需要,按顺序添加 MTD 分区,并且设置分区的开始位置和大小。
    注:
    SPI NOR 的 SPL 可以设置两个备份分区。从 0 开始,每个大小 128 KB。 第二个备份分区可以不设置。
    offset 分区开始地址,相对设备 0 地址的偏移。值应使用 16 进制字符串表示。如果 offset 没有出现,表示紧接上一个分区。
    size 分区的大小,可使用 K, M, G 单位。最后一个分区可以使用 “-” 代替,表示剩余所有的空间都分配给该分区。
  • 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": "-" },
                            },
                    },
            }
    },
    3. SPI NAND 分区配置参数描述
    参数名称 描述
    size SPI NAND 设备的总大小。
    注:

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

    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。

配置启动相关分区

启动相关的分区,修改之后要注意同步修改 U-Boot 和 env.txt 中的配置。
  1. 修改 U-Boot 所在分区
    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

    修改之后,对应 defconfig 中的位置也应该同步更新。

  2. 修改 ENV 所在的分区
    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 -

    修改之后,对应 defconfig 中的位置也应该同步更新。

  3. 如果 RootFS 所在的分区位置变化,需要修改 bootargs 相关的配置。

    相关的文件常用路径为 target/chip/common/env.txttarget/chip/board/env.txt

    • 仅当 RootFS 分区名为 rootfs 时,eMMC 的 root= 参数可自动生成。如果 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 的位置发生变化,则同步修改下列参数:
      nand_root=ubi0:rootfs
      ubi_rootfs_mtd=4

      SPI NAND 中的 RootFS 分区通常放在 UBI 中。