本文共 3595 字,大约阅读时间需要 11 分钟。
linux_4.0/drivers/mtd
//用来填充 mtd_info 结构体中的 type 成员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 /* SLC NAND */ #define MTD_DATAFLASH 6 #define MTD_UBIVOLUME 7 #define MTD_MLCNANDFLASH 8 /* MLC NAND (including TLC) */
devices nor flash 驱动// 很多 ram flash 驱动// 很多 nandflash 驱动 // 一个 dataflash 驱动 // 3个 不基于mapping的驱动spi-nor nor flash 驱动 // 1个 //spi 接口 spi-nor.c // spi nor 的封装层 // 提供 spi_nor_scan // spi_nor_scan 提供了 组装 mtd_info 的过程 不基于 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_driverlpddr 对 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 设备mtd_device_registermtd_device_parse_register// 注册 mtd chip driverregister_mtd_chip_driver// 获取 mtd chip driverget_mtd_chip_driver// 填充 mtd_infodo_map_probe
// 填充 mtd spi flash 相关的 mtd_info 结构体spi_nor_scan
MTD设备层 (字符设备)mtdchar.c (块设备)mtdblock.cMTD原始设备层 mtdcore.c mtdpart.cmtd驱动(驱动人员) 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
转载地址:http://mligi.baihongyu.com/