Edit online

移植指南

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

  • 移植一款 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 设备和驱动的关联关系通过两级列表进行设置。

  1. 检查 source/linux-5.10/drivers/mtd/nand/spi/core.c 中的 spinand_manufacturers, 查看新设备的厂商是否在列表之中:
    static const struct spinand_manufacturer *spinand_manufacturers[] = {
        &gigadevice_spinand_manufacturer,
        &macronix_spinand_manufacturer,
        &micron_spinand_manufacturer,
        &paragon_spinand_manufacturer,
        &toshiba_spinand_manufacturer,
        &winbond_spinand_manufacturer,
        &fmsh_spinand_manufacturer,
        &foresee_spinand_manufacturer,
    };
  2. 检查具体的设备厂商文件,具体的型号是否在列表之中( 以 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)),
    };