欢迎来到天天文库
浏览记录
ID:19534807
大小:1.05 MB
页数:61页
时间:2018-10-03
《基于mtd的nandflash设备驱动底层实现原理分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于MTD的NANDFLASH设备驱动底层实现原理分析(一)经过UBOOT初步的移植,Linux内核初步的移植,Linux内核总线设备模型的分析,等一系列痛苦的折腾,目的就是想更好的来分析下NANDFLASH的驱动。。大概一共历经了半个月的时间,慢慢的对NANDFLASH驱动程序有感觉了。。。一、MTD体系结构:Linux内核提供MTD子系统来建立FLASH针对Linux的统一、抽象接口。MTD将文件系统与底层的FLASH存储器进行隔离。 引入MTD后Linux系统中对FLASH的设备驱动分为4层 设备节点:用户在/dev目
2、录下使用mknod命令建立MTD字符设备节点(主设备号为90),或者MTD块设备节点(主设备号为31),使用该设备节点即可访问MTD设备。MTD设备层:基于MTD原始设备层,系统将MTD设备可以定义为MTD字符(在/mtd/mtdchar.c中实现,设备号90)和MTD块设备(在/mtd/mtdblock.c中实现,设备号31)。MTD原始设备层:MTD原始设备层由两部分构成,一部分是MTD原始设备的通用代码,另一部分是各个特定Flash的数据,如分区。 主要构成的文件有:
3、 drivers/mtd/mtdcore.c支持mtd字符设备 driver/mtd/mtdpart.c支持mtd块设备Flash硬件驱动层:Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的NorFlash芯片驱动位于drivers/mtd/chips/子目录下,NandFlash芯片的驱动则位于drivers/mtd/nand/子目录下。二、Linux内核中基于MTD的NANDFLASH驱动代码布局:在Linux2.6.35内核中,MTD源代码放在driver/mtd目录
4、中,该目录中包含chips、devices、maps、nand、onenand、lpdrr、tests和ubi八个子目录。其中只有nand和onenand目录中的代码才与NAND驱动相关,不过nand目录中的代码比较通用,而onenand目录中的代码相对于nand中的代码而言则简化了很多,它是针对三星公司开发的另一类Flash芯片,即OneNANDFlash。本文我们需要关注的代码是linux-2.6.35/drivers/mtd/nand目录中,在该目录中我们关心的文件如下:1、 nand_base.c:定义了NAND驱动中对NAND
5、芯片最基本的操作函数和操作流程,如擦除、读写page、读写oob等。当然这些函数都只是进行一些default的操作,若你的系统在对NAND操作时有一些特殊的动作,则需要在你自己的驱动代码中进行定义,然后Replace这些default的函数。2、 nand_bbt.c:定义了NAND驱动中与坏块管理有关的函数和结构体。3、 nand_ids.c:定义了两个全局类型的结构体:structnand_flash_devnand_flash_ids[]和structnand_manufacturersnand_manuf_ids[]。其中前者定
6、义了一些NAND芯片的类型,后者定义了NAND芯片的几个厂商。NAND芯片的ID至少包含两项内容:厂商ID和厂商为自己的NAND芯片定义的芯片ID。当NAND驱动被加载的时候,它会去读取具体NAND芯片的ID,然后根据读取的内容到上述定义的nand_manuf_ids[]和nand_flash_ids[]两个结构体中去查找,以此判断该NAND芯片是那个厂商的产品,以及该NAND芯片的类型。若查找不到,则NAND驱动就会加载失败,因此在开发NAND驱动前必须事先将你的NAND芯片添加到这两个结构体中去(其实这两个结构体中已经定义了市场上绝
7、大多数的NAND芯片,所以除非你的NAND芯片实在比较特殊,否则一般不需要额外添加)。值得一提的是,nand_flash_ids[]中有三项属性比较重要,即pagesize、chipsize和erasesize,驱动就是依据这三项属性来决定对NAND芯片进行擦除,读写等操作时的大小的。其中pagesize即NAND芯片的页大小,一般为256、512或2048;chipsize即NAND芯片的容量;erasesize即每次擦除操作的大小,通常就是NAND芯片的block大小。4、 nand_ecc.c:定义了NAND驱动中与softewa
8、reECC有关的函数和结构体,若你的系统支持hardwareECC,且不需要softwareECC,则该文件也不需理会。上面这些内容我是Copy别人的我觉得写得太好了,因为一开始我真的很迷茫,在nand目录
此文档下载收益归作者所有