5.3.2. 参数配置

5.3.2.1. SPI NAND 驱动配置

5.3.2.1.1. Baremetal配置

在 ZX-RTT 根目录下执行 scons --menuconfig,进入menuconfig的功能配置界面,按如下选择:

Board options  --->
    [*] Using Qspi0
    [ ] Using Qspi1
    [ ] Using Qspi2
    [ ] Using Qspi3
        Qspi0 Parameter  --->
             (100000000) Max frequency(Hz)
    [*] QSPI0 Devices: SPINAND  --->
         --- QSPI0 Devices: SPINAND
        (100000000) SPINAND bus frequency(Hz)
        [*]   Continuous Read Mode Enable //部分SPI NAND支持该模式

Drivers options  --->
    Peripheral  --->
         -*- SPINAND Driver library
         [*]   Support Winbond SPI NAND
    AIC Bare Driver  --->
        [*] Enable AIC MTD Bare Driver

备注

为了方便配置, 使能 AIC_QSPI0_DEVICE_SPINAND 后, 会自动选上 AIC_SPINAND_DRV, LPKG_USING_SPINAND, AIC_MTD_BARE_DRV

5.3.2.1.2. RTOS配置

在 ZX-RTT 根目录下执行 scons --menuconfig,进入menuconfig的功能配置界面,按如下选择:

Board options  --->
    [*] Using Qspi0
    [ ] Using Qspi1
    [ ] Using Qspi2
    [ ] Using Qspi3
        Qspi0 Parameter  --->
             (100000000) Max frequency(Hz)
    [*] QSPI0 Devices: SPINAND  --->
         --- QSPI0 Devices: SPINAND
        (100000000) SPINAND bus frequency(Hz)
        [*]   Continuous Read Mode Enable //部分SPI NAND支持该模式

Drivers options  --->
    Peripheral  --->
         -*- SPINAND Driver library
         [*]   Support Winbond SPI NAND

Rt-Thread options  --->
    RT-Thread Components  --->
        Device Drivers  --->
            -*- Using MTD Nand Flash device drivers

备注

为了方便配置, 使能 AIC_QSPI0_DEVICE_SPINAND 后, 会自动选上 AIC_SPINAND_DRV, LPKG_USING_SPINAND, RT_USING_MTD_NAND

5.3.2.2. SPI NAND 移植指南

SPI NAND 要工作既需要 SOC 端 SPI 模块的驱动能力,也需要对 SPI NAND 模块的正确配置,本章阐述如何进行 SPI NAND 器件的移植工作,以 ForeseeF35SQA001G 为例

备注

SPI NAND 在 Boot 和 RTOS 中的实现一致

5.3.2.2.1. 文件准备

一般情况下,某一个公司的 SPI NAND 的操作接口是类似,因此会为某一个公司创建一个文件进行管理,如果该公司的文件已经存在,则直接添加新器件支持即可

  • 在bsp/peripheral/spinand/ 下建相应公司的标识的文件,如 foresee.c

  • 在bsp/peripheral/spinand/inc/spinand.h 中声明 extern const struct spinand_manufacturer foresee_spinand_manufacturer;

5.3.2.2.2. 驱动索引

RTOS 中所支持的 SPI NAND 设备和驱动的关联关系通过两级列表进行设置。

  • 首先检查 bsp/peripheral/spinand/spinand.c 中的 spinand_manufacturers, 查看新设备的厂商是否在列表之中:

static const struct spinand_manufacturer *spinand_manufacturers[] = {
    &winbond_spinand_manufacturer,
    &xtx_spinand_manufacturer,
    &gigadevice_spinand_manufacturer,
    &foresee_spinand_manufacturer,
};
  • 再检查具体的设备厂商文件,具体的型号是否在列表之中( 以 F35SQA001G 为例):

const struct aic_spinand_info foresee_spinand_table[] = {
    /*devid page_size oob_size block_per_lun pages_per_eraseblock is_die_select*/
    /*F35SQA512M*/
    { 0x70, 2048, 64, 512, 64, 0, "foresee 64MB: 2048+64@64@512",
    foresee_cmd_cfg_table },
    /*F35SQA001G*/
    { 0x71, 2048, 64, 1024, 64, 0, "foresee 128MB: 2048+64@64@1024",
    foresee_cmd_cfg_table },
    /*F35SQA002G*/
    { 0x72, 2048, 64, 2048, 64, 0, "foresee 256MB: 2048+64@64@2048",
    foresee_cmd_cfg_table },
    /*FS35ND04G*/
    { 0xEC, 2048, 64, 4096, 64, 0, "foresee 512MB: 2048+64@64@4096",
    foresee_cmd_cfg_table },
};

该数据结构为第一级索引,描述厂商的系列器件信息,是 SPI NAND 驱动的核心,因为 SPI NAND 的操作接口一般都比较标准,因此此处的接口都是固定的,差别的是参数,而参数主要由 SPINAND_INFO 描述

5.3.2.2.3. xxx_cmd_cfg_table介绍

SPI NAND 的接口和操作命令基本上很统一,少有需要特殊处理的命令,但驱动上为了更好的兼容性,还是预留了一些接口

5.3.2.2.4. F35SQA001G 相关信息

F35SQA001G 为例,配置的参数为

#define SPINAND_MFR_FORESEE 0xCD

/*F35SQA001G*/
{ 0x71, 2048, 64, 1024, 64, 0, "foresee 128MB: 2048+64@64@1024",
  foresee_cmd_cfg_table },

以下是对相关参数的说明:

参数ID

参数名字

说明

1

devid

设备id

2

page_size

page 大小

3

oob_size

oob 大小

4

block_per_lun

一个目标节点内包含 block 个数

5

pages_per_eraseblock

一个 block 里包含 page 个数

6

is_die_select

是否需要选择目标节点,一般单 die,设置为 0即可

7

sz_description

spinand 芯片描述信息

8

cmd

特定芯片操作命令组合

备注

因为 rtt spinand容量不需要太大,128MB 就可以满足要求了,一般只有一个目标节点,is_die_select设置为 0。

5.3.2.2.5. 使能 Foresee 厂家的配置

Drivers options  --->
    Peripheral  --->
         -*- SPINAND Driver library
          [*]   Support Foresee SPI NAND

备注

Boot 和 RTOS 需要同时配置

5.3.2.3. 文件系统配置

5.3.2.3.1. RT-Thread FatFS 配置

Rt-Thread options  --->
    RT-Thread Components  --->
        [*] DFS: device virtual file system  --->
            [*]   Using posix-like functions, open/read/write/close
            [*]   Using working directory
            (4)   The maximal number of mounted file system
            (4)   The maximal number of file system type
            (16)  The maximal number of opened files
            [*]   Using mount table for file system
            [*]   Enable elm-chan fatfs
                    elm-chan's FatFs, Generic FAT Filesystem Module  --->
                        (512) Maximum sector size to be handled.
            [ ]   Using devfs for device objects
            [*]   Enable ReadOnly file system on flash
            [ ]   Enable RAM file system

注意,上面的 Using mount table for file system 选项打开后,意味着可以系统启动后会根据一个Table配置来自动挂载文件系统。该Table定义在 board.c 中:

#ifdef RT_USING_DFS_MNTTABLE
#include <dfs_fs.h>

const struct dfs_mount_tbl mount_table[] = {
#if (defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_0) || defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_1))
    {"blk_rodata", "/rodata", "elm", 0, 0, 0},
#endif
    {0}
};
#endif

5.3.2.3.2. RT-Thread UFFS 配置

Local packages options  --->
    Third-party packages options  --->
        [*] UFFS: Ultra-low-cost Flash File System.  --->
            UFFS ECC mode (3: Hardware calculate the ECC and automatically write to spare.)  --->

注意,上面的 Using mount table for file system 选项打开后,意味着可以系统启动后会根据一个Table配置来自动挂载文件系统。该Table定义在 board.c 中:

#ifdef RT_USING_DFS_MNTTABLE
#include <dfs_fs.h>

const struct dfs_mount_tbl mount_table[] = {
#ifdef LPKG_USING_DFS_UFFS
    {"data", "/data", "uffs", 0, 0, 1},
#endif
    {0}
};
#endif

5.3.2.4. 文件系统镜像制作和烧录

5.3.2.4.1. FatFS 镜像制作和烧录

Application options  --->
     [*] Using File System Image 0  --->
        Select File System Type (FATFS)  --->
        (application/os/helloworld/lvgl/base_demo/lvgl_src/) Data Directory
        (rodata.fatfs) Image Name
         [*]   auto calcuate image size
    (1) size of cluster in fatfs image