Edit online

存储配置

Read time: 8 minute(s)

存储配置是编译的固件是否可刷机的关键步骤,但存储的更换要修改的地方较多,建议按照现有工程仿写需要 Bringup 的开发板。

SPI NAND 存储配置

SPI NAND 存储配置步骤如下:
  1. 配置 U-Boot 以支持特定的 SPI NAND 型号,确认开发板的型号被选中支持。
    注:

    kernel 分区比较大,默认打开了 SDK 支持的所有型号,不用选择。

    1. 查看 drivers/mtd/nand/spi/ 源码目录,确认 SPI NAND 器件的厂商是否在支持列表中。

      例如,查看源码目录中是否存在 winbond.c 。如果不存在,则需要添加新厂商支持,详情可查看 SPI NAND 移植

      SDK 默认支持了几种 SPI NAND,编译之前需要确认开发板的 SPI NAND 型号被选中支持,详情可查看 SPI NAND

    2. 执行下列命令进入 U-Boot 配置界面:
      make um
    3. 选择 Device Drivers > MTD Support,配置下列信息:
      (0x240000) Offset of bbt in nand
      (0x40000) Range of bbt in nand
      [*] Define U-boot binaries locations in SPI NAND
      (0x100000) Location in SPI NAND to read U-Boot from
      [ ] Support Micron SPI NAND
      [ ] Support Macronix SPI NAND
      [*] Support Winbond SPI NAND
      [ ] Support Winbond SPI NAND CONTINUOUS READ MODE
      [*] Support GigaDevice SPI NAND
      [ ] Support Toshiba SPI NAND
      [*] Support FudanMicro SPI NAND
      [*] Support Foresee SPI NAND
      [*] Support Zbit SPI NAND
      [ ] Support Elite SPI NAND
      [ ] Support ESMT SPI NAND
      [ ] Support UMTEK SPI NAND
      SPI Flash Support  --->
      UBI support  --->

      U-Boot 和 SPL 分区一般都比较小,如果开启的 SPI NAND 型号过多,存储容易越界,建议仅打开需要使用的型号。

  2. 配置文件系统。

    SPI NAND 采用 UBIFS 文件系统。 如果开发板使用的存储介质为 SPI NAND,以 demo128_nand 工程为例,则编译后会生成固件的名称 d211_demo128_nand_page_2k_block_128k_v1.0.0

    如果 SPI NAND 的 page 尺寸为 4K 大小,可在 target/d211/xxx/image_cfg.json 文件中配置 page 尺寸,编译后的文件为 d211_xxx_page_4k_block_256k_v1.0.0.img
    "info": { // Header information about image
        "platform": "d211",
        "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" },
            ],
        }
    },
  3. 配置分区

    target/d211/demo128_nand/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" },
                "uboot":    { "size": "1m" },
                "userid":   { "size": "256k" },
                "bbt":      { "size": "256k" },
                "env":      { "size": "256k" },
                "env_r":    { "size": "256k" },
                "falcon":   { "size": "256k" },
                "logo":     { "size": "768K" },
                "kernel":   { "size": "12m" },
                "recovery": { "size": "10m" },
                "ubiroot":  {
                    "size": "32m",                          //分区大小为 32m
                    "ubi": { // Volume in UBI device
                        "rootfs": { "size": "-" },
                    },
                },
                "ubisystem": {
                    "size": "-",
                    "ubi": { // Volume in UBI device
                        "ota":   { "size": "48m" },
                        "user":   { "size": "-" },
                    },
                },
            }
        },
  4. 调整固件大小。
    固件的大小要和分区大小相匹配,可以自动适配也可以手工调整:
    • 自动适配。
      1. 在 SDK 根目录下执行下列命令,进入 menuconfig 的功能配置界面:
        make menuconfig
      2. Filesystem images 配置界面,按如下选择:
        RootFS images  --->
        [ ] UserFS 1  ----
        [ ] UserFS 2  ----
        [ ] UserFS 3  ----
        [ ] Generate burner format image
        [*] Auto calculate partition size to generate image                 //通过分区大小自动生成固件
    • 手工调整。
      1. 在 SDK 根目录下执行下列命令,进入 menuconfig 的功能配置界面:
        make menuconfig
      2. Filesystem images > RootFS images 界面,配置下列信息:
        [ ] ext2/3/4 root filesystem
        [ ] cpio the root filesystem (for use as an initial RAM filesystem)
        [ ] initial RAM filesystem linked into linux kernel
        [ ] jffs2 root filesystem
        [ ] squashfs root filesystem
        [ ] tar the root filesystem
            ubi parameter select (spi-nand all type support)  --->
        [*] ubi image containing an ubifs root filesystem
        [ ]   Use custom config file
        ()    Additional ubinize options
        -*- ubifs root filesystem
        (0x2000000) ubifs size(Should be aligned to MB)                      //固件大小,32M
        ubifs runtime compression (lzo)  --->
        Compression method (no compression)  --->
        (-F)  Additional mkfs.ubifs options

SPI NOR 存储配置

SPI NOR 采用 squashfs 文件系统。如果开发板使用的存储介质为 SPI NOR,以 demo88_nor 工程为例,则编译后会生成固件的名称为 d211_demo88_nor_v1.0.0.img

系统输出示例如下:
Image file is generated: /xxx/d211/develop/output/d211_demo88_nor/images/d211_demo88_nor_v1.0.0.img
SPINOR 的分区信息在 target/d211/per2_spinor/image_cfg.json 中:
"spi-nor": { // Media type
    "size": "16m", // Size of NOR
    "partitions": {
        "spl":    { "size": "256k" },
        "uboot":  { "size": "640k" },
        "userid": { "size": "64k" },
        "env":    { "size": "64k" },
        "env_r":  { "size": "64k" },
        "falcon": { "size": "64k" },
        "logo":   { "size": "512k" },
        "kernel": { "size": "5m" },
        "rootfs": { "size": "9m" },
        // "user":   { "size": "-" },
    }
}

SPI NOR 存储一般比较小,在 Linux 系统上进行分区调整比较麻烦,本节不详细描述。

EMMC 存储配置

EMMC 采用 squashfs 文件系统。如果开发板使用的存储介质为 eMMC (eNand),以 demo 工程为例,则编译后的固件名称为 d211_demo_v1.0.0.img

系统输出示例如下:
Image file is generated: /xxx/d211/luban/output/d211_demo/images/d211_demo_v1.0.0.img
EMMC 的接口协议固定,因此不需要进行新器件型号的移植。
注: 调整分区大小时,也需要同时调整固件的大小来和分区匹配。
EMMC 存储配置步骤如下:
  1. 分区
    分区信息在 target/d211/demo/image_cfg.json
    "mmc": { // Media type
        "size": "4G", // Size of SD/eMMC
        "partitions": { // Partition table apply to device
            "spl":    { "offset": "0x4400", "size": "495k" },
            "uboot":  { "size": "1m" },
            "env":    { "size": "256k" },
            "falcon": { "size": "256k" },
            "logo":   { "size": "512k" },
            "kernel": { "size": "16m" },
            "rootfs": { "size": "72m" },        //分区大小为 72M
            "user":   { "size": "-" },
        },
    },
  2. 固件

    执行 make menuconfig 命令,进入 menuconfig 界面,并选择 Filesystem images > RootFS images 调整。

    [*] ext2/3/4 root filesystem
    ext2/3/4 variant (ext4)  --->
    (rootfs) filesystem label
    (72M) exact size                                                 //固件大小为 72M
    (0)   exact number of inodes (leave at 0 for auto calculation)
    (5)   reserved blocks percentage
    (-O ^64bit) additional mke2fs options
    Compression method (no compression)  --->
    [ ] cpio the root filesystem (for use as an initial RAM filesystem)
    [ ] initial RAM filesystem linked into linux kernel

正确的存储配置应该能够成功支持固件烧录。