移植指南
SPI NAND 要工作既需要 SoC 端 SPI 模块的驱动能力,也需要对 SPI NAND 模块的正确配置,本章阐述如何进行 SPI NAND 器件的移植工作,以
FudanMicro
的 FM25S01A
和 Foresee
的
F35SQA002G
为例。
-
移植一款 SPI NAND,最重要的是 MID, DID, NAND_MEMORG 三块参数,均可以按照一定的规则从数据手册中获得
-
READ_FROM_CACHE 中的 dummy 长度是另外一个需要简单关注的参数,大部分都是 1,非常小部分为 2
-
其他的参数不配置或者配置不正确均不影响使用,但有可能会性能或者某些特殊操作有影响
注:
SPI NAND 在 U-Boot 和 Kernel 中的实现逻辑类似,文件路径和内容基本一致,本文以 Kernel 中的移植为例。
文件准备
一般情况下,某一个公司的 SPI NAND 的操作接口是类似,因此会为某一个公司创建一个文件进行管理,如果该公司的文件已经存在,则直接添加新器件支持即可
- 在 source/linux-5.10/drivers/mtd/nand/spi 下建相应公司的标识的文件,如 fmsh.c foresee.c
- 在 Makefile 中添加该文件的编译 spinand-objs := core.o fmsh.o foresee.o …
- 在 include/linux/mtd/spinand.h 中声明 extern const struct spinand_manufacturer fmsh_spinand_manufacturer;
驱动索引
不同于传统驱动通过 board.dts 进行设备和驱动的关联,内核中所支持的 SPI NAND 设备和驱动的关联关系通过两级列表进行设置。
-
检查 source/linux-5.10/drivers/mtd/nand/spi/core.c 中的 spinand_manufacturers, 查看新设备的厂商是否在列表之中:
static const struct spinand_manufacturer *spinand_manufacturers[] = { &gigadevice_spinand_manufacturer, ¯onix_spinand_manufacturer, µn_spinand_manufacturer, ¶gon_spinand_manufacturer, &toshiba_spinand_manufacturer, &winbond_spinand_manufacturer, &fmsh_spinand_manufacturer, &foresee_spinand_manufacturer, };
-
检查具体的设备厂商文件,具体的型号是否在列表之中( 以 FudanMicro 为例):
static const struct spinand_info fmsh_spinand_table[] = { SPINAND_INFO("FM25S01A", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE4), NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), NAND_ECCREQ(1, 512), SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&fm25s01_ooblayout, fm25s01_ecc_get_status)), };