Introduction
Linux MTD subsystem has originally provided drivers for some SPI NOR/NAND flash models, and Realtek has made some changes to support SoC’s MCM flash. Limited by the implementation of SPI Flash controller driver, the SPI NOR/NAND flash drivers only work in user mode.
Architecture
The software architectures of SPI NOR/NAND Flash driver are illustrated in the following two figures respectively.
Implementation
The SPI NOR/NAND Flash drivers are originally implemented by Linux kernel as following files:
File |
Description |
---|---|
<linux>/drivers/mtd/spi-nor/Kconfig |
SPI NOR Flash driver Kconfig |
<linux>/drivers/mtd/spi-nor/Makefile |
SPI NOR Flash driver Makefile |
<linux>/drivers/mtd/spi-nor/spi-nor.c |
SPI NOR Flash driver implementation |
<linux>/drivers/mtd/nand/spi/Kconfig |
SPI NAND Flash driver Kconfig |
<linux>/drivers/mtd/nand/spi/Makefile |
SPI NAND Flash driver Makefile |
<linux>/drivers/mtd/nand/spi/core.c |
SPI NAND Flash core driver |
<linux>/drivers/mtd/nand/spi/*.c |
SPI NAND Flash manufacture drivers |
Configuration
DTS Configuration
For NOR Flash driver, the DTS node is defined in <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 */
};
};
For NAND Flash driver, the DTS node is defined in <dts>/rtl8730e-spi-nand-128m.dtsi
or <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 */
};
};
The configurations are listed in the table below:
Property |
Description |
Configurable? |
---|---|---|
compatible |
ID to match the flash driver with flash device |
No |
#address-cells |
Address cells for flash partition child node |
No |
#size-cells |
Size cells for flash partition child node |
No |
reg |
Reserved |
No |
mode |
Reserved |
No |
partitions |
The partitions for different area at flash, user can modify the partitions’ size, lable, etc. |
Yes |
Note
Above DTS files will be auto selected after chip is chosen, do not change the DTS configurations if not necessary.
Build Configuration
For SPI NAND/NOR Flash:
APIs
APIs for User Space
User can access data on Flash from user space via:
C API provided by GLIBC, such as open/close/read/write functions
Refer to The GNU C Library for details.
Shell utilities provided by Busybox, such as mount/unmount/mkdir/rm comands
Refer to BusyBox for details.
APIs for Kernel Space
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 NOR Flash driver provides the following callbacks:
API
Introduction
_erase
Erase the specific SPI NOR Flash region
_read
Read data from SPI NOR Flash to buffer
_write
Write data from buffer to SPI NOR Flash
_resume
Resume handler for power management
_lock
Lock specific SPI NOR Flash region
_unlock
Unlock specific SPI NOR Flash region
_is_locked
Check the specific SPI NOR Flash region is locked
Refer to SPI NOR framework for details of Linux SPI NOR framework.
SPI NAND Flash driver provides the following callbacks:
API
Introduction
_read_oob
Read data from SPI NAND Flash to buffer
_write_oob
Write data from buffer to SPI NAND Flash
_block_isbad
Check whether the SPI NAND Flash block is marked as bad block
_block_markbad
Mark the SPI NAND Flash block as bad block
_block_isreserved
Check whether the SPI NAND Flash block is reserved
_erase
Erase the specific SPI NAND Flash region
_max_bad_blocks
Get the maximum number of bad blocks on a specific SPI NAND Flash region
Refer to MTD NAND Driver Programming Interface for details of MTD NAND driver programming interfaces.