NandFlash 与 MTD 设备管理

更新时间:
2024-03-14
下载文档

NandFlash 与 MTD 设备管理

NAND FLASH 基础原理

Flash 全称为 Flash Memory,属于非易失性存储设备(Non-volatile Memory Device)。Flash 主要分两种,NAND Flash 和 NOR Flash。

NOR 的成本相对高,容量相对小,优点是读写数据时候,不容易出错。NAND Flash 成本相对低,缺点是使用中数据读写容易出错,所以一般都需要有对应的软件或者硬件的数据校验算法,统称为 ECC。但优点是,相对来说容量比较大。

NAND Flash 内部由几个芯片(chip)组成,每个 chip 包含了几片(Plane),每一片中包含很多块(Block),每一块又包含很多页(Page),如下图所示。常见的 NAND Flash,内部只有一个 chip,每个 chip 只有一个 plane。

每一个页,对应还有一块区域,叫做空闲区域(spare area)/冗余区域(redundant area),一般叫做 OOB(Out Of Band)。这个区域,是基于 NAND Flash 的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做 EDC(Error Detection Code)/ ECC(Error Code Correction,或者 Error Checking and Correcting)。多余的区域,便是被设计用于放置数据的校验值。

老的 NAND Flash,页大小是 256B,512B,这类的 NAND Flash 被称作 small block,地址周期只有 4 个。对于现在常见的 NAND Flash 多数是 2KB,被称作 big block,对应的读写命令地址,一共 5 个周期(cycle),更新的 NAND Flash 是 4KB。

NAND Flash 擦除操作的基本/最小单位为块,写入操作的基本/最小的单位为页。

对于 NAND Flash 读取和编程操作来说,一般最小单位是页,所以,NAND Flash 在硬件设计时候,就考虑到这一特性,对于每一片(Plane),都有一个对应的 PAGE Buffer,专门用于存放将要写入到物理存储单元中去的或者刚从存储单元中读取出来的一页数据。只有写到了这个页缓存中,并发送对应的编程第二阶段的确认命令 0x10 之后,实际的编程动作才开始,页缓存中的数据被一点点写到物理存储单元中去。通过 PAGE Buffer 还可以实现对 NAND Flash 的多片同时编程。

MTD 管理

NAND Flash 与传统块设备相似,都是存储设备,但又有所不同。比如块设备不区分写和擦除操作,也没有 OOB 区。这些区别决定了系统需要一种特殊的设备来抽象 NAND Flash 设备,简化驱动开发,这就是 MTD 设备,MTD 既不属于块设备也不属于字符设备。

MTD 是 Memory Technology Device 的缩写。MTD 支持类似于内存的存储器,它是底层硬件和上层软件之间的桥梁。对底层来说,MTD 无论对 NOR Flash 或是 NAND Flash 都有很好的驱动支持。对上层来说,它抽象出文件系统所需要的接口函数。有了 MTD,编写 NAND Flash 的驱动变得十分轻松,因为上层的架构都已经做好,驱动编写者只需参考 NAND Flash 的 DATASHEET 编写最底层的硬件驱动即可。

SylixOS 下 NAND 的整体框架如下图所示。

向系统注册一个 MTD 的接口如下:

#include <linux/mtd/mtd.h>
int add_mtd_device(struct mtd_info *mtd);

函数 add_mtd_device 原型分析:

  • 此函数成功返回 0,失败返回 1。
  • 参数 mtd 是 MTD 设备信息结构体。

SylixOS 以一个指针数组 mtd_table 管理 MTD 设备,数组中保存着已注册的 MTD 设备线信息结构体的首地址,该结构体包含了 NAND 设备的相关硬件参数和相关配置,以及操作函数集。

对应的删除接口如下:

#include <linux/mtd/mtd.h>
int del_mtd_device (struct mtd_info *mtd);

函数 del_mtd_device 原型分析:

  • 此函数成功返回 0,失败返回 ERROR_CODE。
  • 参数 mtd 是 MTD 设备信息结构体。

该函数与注册函数对应,根据保存在 MTD 结构中的索引将 mtd_table 中的指针置空。

文档内容是否对您有所帮助?
有帮助
没帮助