linux_4.0/drivers/mtd
include/mtd/mtd-abi.h
#define MTD_ABSENT 0
#define MTD_RAM 1
#define MTD_ROM 2
#define MTD_NORFLASH 3
#define MTD_NANDFLASH 4
#define MTD_DATAFLASH 6
#define MTD_UBIVOLUME 7
#define MTD_MLCNANDFLASH 8
devices
nor flash 驱动
ram flash 驱动
nandflash 驱动
dataflash 驱动
不基于mapping的驱动
spi-nor
nor flash 驱动
spi-nor.c
不基于 mapping的驱动
chips
JEDEC mapping , 对应一个 struct mtd_chip_driver
CFI mapping , 对应一个 struct mtd_chip_driver
ram mapping , 对应一个 struct mtd_chip_driver
rom mapping , 对应一个 struct mtd_chip_driver
提供mapping
register_mtd_chip_driver 注册 struct mtd_chip_driver
lpddr
对 lpddr 的支持, lpddr 是 一种ram ,mtd 架构也包括ram
其中包括 一个驱动 Support for LPDDR2-NVM flash chips
提供 lpddr mapping
maps
基于 mapping 的驱动
通过do_map_probe接口,返回 mtd_info 结构体,然后在通过 mtd_device_register 或者 mtd_device_parse_register 注册 mtd 设备
do_map_probe 查询注册 的 各种 struct mtd_chip_driver ,然后调用 struct mtd_chip_driver 中 probe 成员,返回 mtd_info 结构体
nand
nand_scan_tail 封装了 组成 mtd_info 的过程
nand$ grep type * -nr |grep "=" |grep MTD_
nand_base.c:4143: mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH;
这个文件夹内 提供 了 MTD_NANDFLASH 类 和 MTD_MLCNANDFLASH 类的 驱动 及 基础文件
接口 有gpio接口(CONFIG_MTD_NAND_GPIO)
onenand
drivers/mtd/onenand$ grep type * -nr |grep "=" |grep MTD_
onenand_base.c:4069: mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
ubi
gluebi.c:318: mtd->type = MTD_UBIVOLUME;
tests
mtd 测试 模块,以模块形式 提供 ,insmod 即可运行.
mtd_device_register
mtd_device_parse_register
register_mtd_chip_driver
get_mtd_chip_driver
do_map_probe
spi_nor_scan
MTD设备层 (字符设备)mtdchar.c (块设备)mtdblock.c
MTD原始设备层 mtdcore.c mtdpart.c
mtd驱动(驱动人员) linux_4.0/drivers/mtd/devices/m25p80.c(典型的spi flash设备)
设备节点:通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)。通过访问此设备节点即可访问MTD字符设备和块设备
MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。其中mtdchar.c : MTD字符设备接口相关实现,mtdblock.c : MTD块设备接口相关实现。
MTD原始设备层:用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。其中mtdcore.c: MTD原始设备接口相关实现,mtdpart.c : MTD分区接口相关实现。
Flash硬件驱动层:Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的Nand Flash芯片的驱动则drivers/mtd/nand/子目录下,Nor Flash芯片驱动位于drivers/mtd/chips/子目录下。
如果这样子分类的话,那么 在 drivers/mtd 下的 子文件夹 都属于 flash硬件驱动层.这些 硬件驱动层的任务就是封装 mtd_info ,然后通过 MTD原始设备层 的函数 (mtd_device_register 或者 mtd_device_parse_register) 注册 mtd 设备
内核 在 drivers/mtd 下的 子文件夹 提供了 mapping 机制(do_map_probe) 和 nand_base.c(nand_scan_tail )中 提供了 spi-nor.c(spi_nor_scan) 来提供 mtd_info. 这些内核实现的部分也属于 Flash硬件驱动层 的 一部分,可以说内核实现了 Flash硬件驱动层 的一部分,更多的减轻了驱动开发者的劳动强度.
mtd 目录下的普通文件呢?
一部分 是 mtd 的 核心部分,必须编译 mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o mtdchar.o
一部分 是 解析 mtd 的分区的 方法,选择性编译 ofpart.o redboot.o cmdlinepart.o afs.o ar7part.o bcm63xxpart.o bcm47xxpart.o
另一部分 是 给用户空间提供接口的模块, 选择性编译 mtd_blkdevs.o mtdblock.o mtdblock_ro.o ftl.o nftlcore.o nftlmount.o inftlcore.o inftlmount.o rfd_ftl.o ssfdc.o sm_ftl.o mtdoops.o mtdswap.o