介绍

Linux MTD 子系统最初为一些 SPI NOR/NAND 闪存型号提供了驱动程序,而 Realtek 进行了一些更改以支持 SoC 的 MCM 闪存。由于 SPI 闪存控制器驱动程序的实现限制,SPI NOR/NAND 闪存驱动程序只能在用户模式下工作。

架构

SPI NOR/NAND 闪存驱动程序的软件架构分别在下图两个图中进行了说明。

../../rst_linux/1_flash/figures/nor_flash_driver_software_arch.svg
../../rst_linux/1_flash/figures/nand_flash_driver_software_arch.svg

实现

SPI NOR/NAND 闪存驱动程序最初由 Linux 内核实现,具体文件如下:

文件

描述

<linux>/drivers/mtd/spi-nor/Kconfig

SPI NOR 闪存驱动程序 Kconfig

<linux>/drivers/mtd/spi-nor/Makefile

SPI NOR 闪存驱动程序 Makefile

<linux>/drivers/mtd/spi-nor/spi-nor.c

SPI NOR 闪存驱动程序实现

<linux>/drivers/mtd/nand/spi/Kconfig

SPI NAND 闪存驱动程序 Kconfig

<linux>/drivers/mtd/nand/spi/Makefile

SPI NAND 闪存驱动程序 Makefile

<linux>/drivers/mtd/nand/spi/core.c

SPI NAND 闪存核心驱动程序

<linux>/drivers/mtd/nand/spi/*.c

SPI NAND 闪存制造商驱动程序

配置

设备树配置

对于 NOR 闪存驱动程序,设备树系欸按在 <dts>/rtl8730e-spi-nor.dtsi 中定义。

flash0: flash@0 {
   #address-cells = <1>;
   #size-cells = <1>;
   compatible = "jedec,spi-nor";
   spi-max-frequency = <100000000>;
   reg = <0>;
   partitions {
      compatible = "fixed-partitions";
      #address-cells = <1>;
      #size-cells = <1>;
      /* Partitions */
   };
};

配置在下表中列出:

属性

描述

可配置?

compatible

将 ID 与闪存设备的闪存驱动程序匹配

#address-cells

用于闪存分区子节点的地址单元

#size-cells

用于闪存分区子节点的大小单元

reg

预留

mode

预留

partitions

闪存中不同区域的分区,用户可以修改分区的大小、标签等。

备注

选择芯片后,上述设备树文件将自动选中,如果没有必要,请勿更改设备树配置。

编译配置

对于 SPI NAND/NOR 闪存:

  1. 选择 Device Drivers -> Memory Technology Divece (MTD) support

  2. 选择 SPI-NOR device support 或者 SPI-NAND device support

    ../../rst_linux/1_flash/figures/mtd_support_configuration.PNG
    ../../rst_linux/1_flash/figures/spi_nor_device_support_configuration.PNG
    ../../rst_linux/1_flash/figures/spi_nand_device_support_configuration.PNG

程序接口(APIs)

用户空间 APIs

用户可以通过以下方式从用户空间访问闪存上的数据:

  • GLIBC 提供的 C 语言 API,例如:openclosereadwrite 函数。

    参考 The GNU C Library 以获得更多细节。

  • Busybox 提供的 Shell 工具 ,例如: mountunmountmkdirrm 命令:

    参考 BusyBox 以获得更多细节。

内核空间 APIs

The SPI NAND/NOR Flash drivers provide callbacks for MTD framework, the prototypes of these callbacks are defined in <linux>/include/linux/mtd/mtd.h. SPI NAND/NOR 闪存驱动为 MTD 框架提供了回调,这些回调的原型定义在 <linux>/include/linux/mtd/mtd.h 中。

  • SPI NOR 闪存驱动提供了以下回调:

    API

    介绍

    _erase

    擦除特定的 SPI NOR 闪存区域

    _read

    从 SPI NOR 闪存读取数据到缓冲区

    _write

    从缓存区把数据写入到 SPI NOR 闪存

    _resume

    电源管理的恢复处理器

    _lock

    锁定特定的 SPI NOR 闪存区域

    _unlock

    解锁特定的 SPI NOR 闪存区域

    _is_locked

    检查特定的 SPI NOR 闪存区域是否被锁定

    有关 Linux SPI NOR 框架的详细信息,请参阅 SPI NOR 框架 SPI NOR framework v5.4 或者 SPI NOR framework v6.6

  • SPI NAND 闪存驱动程序提供以下回调:

    API

    介绍

    _read_oob

    从 SPI NAND 闪存读取数据到缓冲区

    _write_oob

    将数据从缓冲区写入 SPI NAND 闪存

    _block_isbad

    检查 SPI NAND 闪存块是否被标记为坏块

    _block_markbad

    将 SPI NAND 闪存块标记为坏块

    _block_isreserved

    检查 SPI NAND 闪存块是否为预留的

    _erase

    擦除指定的 SPI NAND Flash 区域

    _max_bad_blocks

    获取特定 SPI NAND 闪存区域的最大坏块数量

    有关 MTD NAND 驱动程序编程接口的详细信息,请参考 MTD NAND Driver Programming Interface v5.4 或者 MTD NAND Driver Programming Interface v6.6