转载请注明:http://blog.csdn.net/wang_zheng_kai/article/details/18988521
有了前面的基础,我们就可以研究MTD下的nand驱动了,我这里用的是jz4780grus开发板,我将以下面几个部分做一个介绍,如果有没有涉及的或者需要详细介绍的我还会再开几篇博客进行介绍,敬请参阅!!
一、MTD概述
二、MTD系统层次
三、MTD设备节点的创建
四、MTD子系统的注册
五、NAND FLASH驱动层
六、MTD下NAND FLASH读操作分析
七、如何调试新的NAND FLASH芯片
一、MTD的概述
1、MTD(memory technology device)是用于访问memory设备(比如NOR Flash、NAND Flash)的Linux的子系统。
2、MTD在硬件和上层之间提供了一个抽象的接口。
MTD将 Nand Flash,nor flash 和其他类型的 flash 等设备,统一抽象成MTD 设备来管理,根据这些设备的特点,上层实现了常见的操作函数封装,而底层具体的内部实现(具体的内部硬件设备的读/写/擦除函数),就需要驱动设计者自己来实现了。
3、MTD的主要目的是为了使新的存储设备的驱动更加简单并有通用接口函数可用。
MTD将文件系统与底层的Flash存储器进行了隔离,使Flash驱动工程师无须关心Flash作为字符设备和块设备与Linux内核的接口。
4、MTD 的所有源代码在kernel/drivers/mtd 子目录下:
5、MTD子系统的层次框图
二、linux MTD系统层次
如下图所示:在引入MTD后,linux系统中的flash设备驱动及接口可分为4层:设备节点、MTD设备层、MTD原始层和硬件驱动。
MTD的源代码都在kernel/drivers/mtd目录中。
设备节点:
通过mknod在dev子目录下建立MTD字符设备节点(90)和MTD块设备节点(31)基于MTD原始设备,由linux系统定义出MTD的块设备和字符设备构成。
字符设备的定义在mtdchar.c中实现,通过注册一系列file_operation函数可实现对MTD设备的读写和控制。
MTD的块设备则是定义了一个描述MTD块设备的结构mtd_dev,并声明了一个名为mtdblks的指针数组,该数组中的每一个mtd_dev都与mtd_info一一对应。
完成flash的基本操作。
用户通过访问此设备节点即可访问MTD字符设备和块设备
设备层:
基于MTD原始设备,由linux系统定义出MTD的块设备和字符设备构成。
字符设备的定义在mtdchar.c中实现,通过注册一系列file_operation函数可实现对MTD设备的读写和控制。
MTD的块设备则是定义了一个描述MTD块设备的结构mtd_dev,并声明了一个名为mtdblks的指针数组,该数组中的每一个mtd_dev都与mtd_info一一对应。
完成flash的基本操作。
原始设备层:
MTD原始设备的通用代码(mtdcore.c),(mtdpart.c).其中mtdcore.c中定义了描述mtd设备的核心结构mtdinfo.
硬件驱动层:
负责Flash硬件设备的读、写、擦除,Linux MTD设备的NAND型flash的
驱动代码位于/driver/mtd/nand子目录下。
了解了上面的知识,我们就可以了解下他们各个层的接口关系,这样我们能更好的熟悉代码,和他们之间的接口调用关系,接口图如下所示: