5.3.2. 参数配置¶
5.3.2.1. SPI NAND 驱动配置¶
5.3.2.1.1. Baremetal配置¶
在 Luban-Lite 根目录下执行 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配置¶
在 Luban-Lite 根目录下执行 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 器件的移植工作,以 Foresee 的 F35SQA001G 为例
注解
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