mtd 内存技术设备,引入mtd为nor flash和nand flash设备提供统一接口。mtd将文件系统和底层flash存储器进行隔离。
mtd:设备节点、设备层、原始设备层、硬件驱动层
flash硬件驱动层:对flash硬件读写擦除操作,mtd设备的Nand Flash芯片的驱动则在drivers/mtd/nand/子目录下,Nor Flash芯片驱动位于drivers/mtd/chips/子目录下。
mtd nand flash驱动介绍
flash硬件驱动层:负责在init时驱动flash硬件并建立从具体设备到MTD原始设备映射关系
tip:映射关系包括分区信息,I/O映射以及特定函数的映射
drivers/mtd/chips:CFI/jedec接口通用驱动
drivers/mtd/maps : nor flash映射关系相关函数
drivers/mtd/devices: nor flash底层驱动
drivers/mtd/nand : nand通用驱动和部分底层驱动程序
mtd原始设备:用于描述mtd原始设备的数据结构是mtd_info,它定义了mtd数据和操作函数。mtdcore.c: mtd原始设备,mtdpart.c:mtd分区、
mtd设备层:linux系统定义mtd块设备(主设备号31)和字符设备(主设备号90)。mtdchar.c:mtd字符设备,mtdblock.c:mtd块设备
通过mknod在/dev子目录下建立mtd块设备节点和mtd字符设备节点
启动文件,通过mount命令将flash其余分区作为分拣系统挂载到mountpoint
mtd_info 表示mtd原始设备, 所有mtd_info结构体被存放在mtd_info数组
mtd_info数据结构:
flags:标志位 MTD_WRITEABLE,MTD_NO_ERASE
oobsize:oob数量
ecclayout:nand_ecclayout结构体指针
read_oob/write_oob:带oob读写flash函数
priv:cfi接口flash指向map_info结构,或指向自定义flash相关结构体
mtd_part的数据结构:
master:分区的主分区
index:分区号
map_info的数据结构:
phys:物理地址
virt:虚拟地址,通过ioremap将物理地址进行映射得到
bankwidth:总线宽度
nand_chip的数据结构:
cmdfunc:命令处理函数
cmd_ctrl:硬件相关控制函数
scan_bbt: 扫描坏块
erase_cmd:擦除命令
nand_ecclayout的数据结构
eccpos:ecc数据在oob中的位置
eccbytes:ecc字节数
oobfree:显示定义空闲的oob 字节
oobavail:oob中可用的字节数
mtd设备层:
mtd字符设备接口:
mtdchar.c 实现了字符设备接口,通过它,用户可以直接操作Flash 设备。通过read()、write()系统调用可以读写Flash。通过一系列ioctl命令可以获取Flash 设备信息、擦除Flash、读写NAND 的OOB、获取OOB layout 及检查NAND 坏块等
mtd块设备接口:
将Flash的erase block 中的数据在内存中建立映射,然后对其进行修改,最后擦除Flash 上的block,将内存中的映射块写入Flash 块。整个过程被称为read/modify/erase/rewrite 周期。
nand芯片级初始化:
分配nand_chip内存,根据目标板以及nand控制器初始化nand_chip成员函数,设置ecc模式及处理函数。
以mtd_info为参数调用nand_scan()探测nand flash
nand_scan()会读取nand的id,根据mtd->priv即nand_chip中成员初始化mtd_info
mtd_info和mtd_partition为参数调用add_mtd_partitions()添加分区信息
mtd对nand芯片的读写:
struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口;
struct nand_chip中的读写函数,如read_buf,cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件交互
struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作
mtd是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。MTD设备分为四层,从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
1结构体填充驱动
struct nand_ecclayout {
};
2往系统注册一个nand flash设备,定义nandflash分区信息结构,注册nandflash设备,其中还包括了定义一些IO资源,用于主控器驱动获得IO资源配置相应的寄存器以及数据读取。
int nand_scan(struct mtd_info *mtd, int maxchips); //扫描nandflash,扫描成功返回0
原文链接:https://blog.csdn.net/zhouzhuan2008/article/details/11053877