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 器件的移植工作,以 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