参数配置
SPI NAND 驱动配置
Baremetal配置
在 Luban-Lite 根目录下执行 scons --menuconfig
,进入menuconfig的功能配置界面,按如下选择:
Board options --->
[*] Using Qspi0
[ ] Using Qspi1
[ ] Using Qspi2
[ ] Using Qspi3
Qspi0 Parameter --->
(1) Max frequency(Hz)
Set SPI0 bus width (Quad) ---> //配置QSPI data width
[*] 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 //使能对应spinand芯片厂家配置
AIC Bare Driver --->
[*] Enable AIC MTD Bare Driver
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
为了方便配置, 使能 AIC_QSPI0_DEVICE_SPINAND 后, 会自动选上 AIC_SPINAND_DRV, LPKG_USING_SPINAND, AIC_MTD_BARE_DRV
RTOS配置
在 Luban-Lite 根目录下执行 scons --menuconfig
,进入menuconfig的功能配置界面,按如下选择:
Board options --->
[*] Using Qspi0
[ ] Using Qspi1
[ ] Using Qspi2
[ ] Using Qspi3
Qspi0 Parameter --->
(100000000) Max frequency(Hz)
Set SPI0 bus width (Quad) ---> //配置QSPI data width
[*] 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 //使能对应spinand芯片厂家配置
Rt-Thread options --->
RT-Thread Components --->
Device Drivers --->
-*- Using MTD Nand Flash device drivers
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
为了方便配置, 使能 AIC_QSPI0_DEVICE_SPINAND 后, 会自动选上 AIC_SPINAND_DRV, LPKG_USING_SPINAND, RT_USING_MTD_NAND
SPI NAND 移植指南
SPI NAND 要工作既需要 SoC 端 SPI 模块的驱动能力,也需要对 SPI NAND 模块的正确配置,本章阐述如何进行 SPI NAND 器件的移植工作,以Foresee
的 F35SQA001G
为例
SPI NAND 在 Boot 和 RTOS 中的实现一致
文件准备
一般情况下,某一个公司的 SPI NAND 的操作接口是类似,因此会为某一个公司创建一个文件进行管理,如果该公司的文件已经存在,则直接添加新器件支持即可
在bsp/peripheral/spinand/ 下建相应公司的标识的文件,如 foresee.c
在bsp/peripheral/spinand/inc/spinand.h 中声明 extern const struct spinand_manufacturer foresee_spinand_manufacturer;
驱动索引
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,
};
2
3
4
5
6
再检查具体的设备厂商文件,具体的型号是否在列表之中( 以 F35SQA001G 为例):
const struct aic_spinand_info foresee_spinand_table[] = {
/*devid page_size oob_size block_per_lun pages_per_eraseblock is_die_select*/
/*F35SQA512M*/
{ DEVID(0x70), PAGESIZE(2048), OOBSIZE(64), BPL(512), PPB(64), PLANENUM(1),
DIE(0), "foresee 64MB: 2048+64@64@512", cmd_cfg_table },
/*F35SQA001G*/
{ DEVID(0x71), PAGESIZE(2048), OOBSIZE(64), BPL(1024), PPB(64), PLANENUM(1),
DIE(0), "foresee 128MB: 2048+64@64@1024", cmd_cfg_table },
/*F35SQA002G*/
{ DEVID(0x72), PAGESIZE(2048), OOBSIZE(64), BPL(2048), PPB(64), PLANENUM(1),
DIE(0), "foresee 256MB: 2048+64@64@2048", cmd_cfg_table },
/*FS35ND04G*/
{ DEVID(0xEC), PAGESIZE(2048), OOBSIZE(64), BPL(4096), PPB(64), PLANENUM(1),
DIE(0), "foresee 512MB: 2048+64@64@4096", cmd_cfg_table },
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
该数据结构为第一级索引,描述厂商的系列器件信息,是 SPI NAND 驱动的核心,因为 SPI NAND 的操作接口一般都比较标准,因此此处的接口都是固定的,差别的是参数,而参数主要由 SPINAND_INFO 描述
xxx_cmd_cfg_table介绍
SPI NAND 的接口和操作命令基本上很统一,少有需要特殊处理的命令,但驱动上为了更好的兼容性,还是预留了一些接口
F35SQA001G 相关信息
以 F35SQA001G
为例,配置的参数为
#define SPINAND_MFR_FORESEE 0xCD
/*F35SQA001G*/
{ DEVID(0x71), PAGESIZE(2048), OOBSIZE(64), BPL(1024), PPB(64), PLANENUM(1),
DIE(0), "foresee 128MB: 2048+64@64@1024", cmd_cfg_table },
2
3
4
5
以下是对相关参数的说明:
参数ID | 定义 | 注释说明 |
---|---|---|
1 | devid | 设备id |
2 | page_size | page 大小 |
3 | oob_size oob | oob 大小 |
4 | block_per_lun | 一个目标节点内包含 block 个数 |
5 | pages_per_eraseblock | 一个 block 里包含 page 个数d |
6 | is_die_select | 是否需要选择目标节点,一般单 die,设置为 0即可 |
7 | sz_description | spinand 芯片描述信息 |
8 | cmd | 特定芯片操作命令组合 |
因为 rtt spinand容量不需要太大,128MB 就可以满足要求了,一般只有一个目标节点,is_die_select设置为 0。
使能 Foresee 厂家的配置
Drivers options --->
Peripheral --->
-*- SPINAND Driver library
[*] Support Foresee SPI NAND
2
3
4
状态寄存器 ECC Status 处理函数替换
寄存器 ECC Status Bit 返回状态值一般通用,使用默认 spinand_check_ecc_status 处理函数。
如果 ECC Status 打印错误信息,返回如下信息,表示发现了新的坏块。
ECC status error[0x20].
返回如下信息,表示需要单独适配 ECC Status Bit 返回值:
ECC status error[0x30].
0x30 该 Bit 返回值,一般厂家不会使用,不会打印该值。另外部分厂家使用,表示检测了1 ~ 4位 ecc 位校验纠正情况,具体以芯片手册为准。
正常 ECC Status Bit 有2位 另外部分芯片 ECC Status Bit 有3位或者4位,需要单独适配。
以 ETRON EM73C044VCF 为例,在对应 SPINAND 厂家文件 bsp/peripheral/spinand/etron.c 里面,添加 ECC Status 处理函数:
static int em73c044vcf_ecc_get_status(struct aic_spinand *flash, u8 status)
{
switch (status & STATUS_ECC_MASK) {
case STATUS_ECC_NO_BITFLIPS:
return 0; //没有检测到 ecc 位校验纠正情况
case STATUS_ECC_HAS_1_4_BITFLIPS:
return 4; //检测了1 ~ 4位 ecc 位校验纠正情况
case STATUS_ECC_UNCOR_ERROR:
return -SPINAND_ERR_ECC; //ecc 位校验纠正失败,错误 bit 超过4位,需要标记坏块
case STATUS_ECC_MASK:
return 4; //检测了1 ~ 4位 ecc 位校验纠正情况
default:
break;
}
return -SPINAND_ERR;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
并将上面的功能函数地址添加到对应 SPINAND 配置上,以替换 ECC Status 通用处理函数。
{ DEVID(0x25), PAGESIZE(2048), OOBSIZE(64), BPL(1024), PPB(64), PLANENUM(1),
DIE(0), "etron 128MB: 2048+64@64@1024", cmd_cfg_table,
em73c044vcf_ecc_get_status},
2
3
文件系统配置
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意,上面的 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
2
3
4
5
6
7
8
9
10
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.) --->
2
3
4
注意,上面的 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
2
3
4
5
6
7
8
9
10
文件系统镜像制作和烧录
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
2
3
4
5
6
7