MTD nor flash (二) linux mtd 架构

linux_4.0/drivers/mtd
  • 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) */ 

  • mtd 目录

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_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 主要函数
// 注册 mtd 设备
mtd_device_register
mtd_device_parse_register

// 注册 mtd chip driver
register_mtd_chip_driver
// 获取 mtd chip driver
get_mtd_chip_driver

// 填充 mtd_info
do_map_probe
  • mtd spi flash 相关函数
// 填充 mtd spi flash 相关的 mtd_info 结构体
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 


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值