介绍
Linux MTD 子系统最初为一些 SPI NOR/NAND 闪存型号提供了驱动程序,而 Realtek 进行了一些更改以支持 SoC 的 MCM 闪存。由于 SPI 闪存控制器驱动程序的实现限制,SPI NOR/NAND 闪存驱动程序只能在用户模式下工作。
架构
SPI NOR/NAND 闪存驱动程序的软件架构分别在下图两个图中进行了说明。
实现
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 */
};
};
对于 NAND 闪存驱动程序,设备树节点在 <dts>/rtl8730e-spi-nand-128m.dtsi
或 <dts>/rtl8730e-spi-nand-256m.dtsi
中定义。
flash0: flash@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spi-nand";
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 闪存:
选择
选择
或者
程序接口(APIs)
用户空间 APIs
用户可以通过以下方式从用户空间访问闪存上的数据:
GLIBC 提供的 C 语言 API,例如:open,close,read,write 函数。
参考 The GNU C Library 以获得更多细节。
Busybox 提供的 Shell 工具 ,例如: mount,unmount,mkdir,rm 命令:
参考 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 。