欢迎来到天天文库
浏览记录
ID:29471750
大小:449.54 KB
页数:46页
时间:2018-12-20
《基于mtd的nand驱动开发》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、基于MTD的NAND驱动开发说明 大约用了两个礼拜不到的时间为公司的IPcamera系统写了基于MTD的NAND驱动(linux-2.6.22.10内核),目前已可以在该驱动的支持下跑cramfs和jffs2文件系统,另外,该驱动也可以同时支持smallpage(每页512Byte)和bigpage(每页2048Byte)两种NAND芯片。在此整理一下与NAND驱动相关的概念,结构体,驱动框架和流程,同时分析一下基于MTD的NAND驱动的部分函数,尤其是其中的nand_scan()函数。(涉及到具体NAND芯片时,若不做说明,将
2、以smallpage的NAND芯片为例。) 注:个人理解,有误难免!——笔者:曹荣荣 MTD驱动程序是专门针对嵌入式Linux的一种驱动程序,相对于常规块设备驱动程序(比如PC中的IDE硬盘)而言,MTD驱动程序能更好的支持和管理闪存设备,因为它本身就是专为闪存设备而设计的。具体地讲,基于MTD的FLASH驱动,承上可以很好地支持cramfs,jffs2和yaffs等文件系统,启下也能对FLASH的擦除,读写,FLASH坏块以及损耗平衡进行很好的管理。所谓损耗平衡,是指对NAND的擦写不能总是集中在某一个或某几个block中,
3、这是由NAND芯片有限的擦写次数的特性决定的。总之,在现阶段,要为FLASH设备开发Linux下的驱动程序,那么基于MTD的开发将几乎是省时又省力的唯一选择! 一、NAND和NOR的区别 Google“NandFlash和NorFlash的区别”。 简单点说,主要的区别就是: 1、 NAND比NOR便宜;NAND的容量比NOR大(指相同成本);NAND的擦写次数是NOR的十倍;NAND的擦除和写入速度比NOR快,读取速度比NOR稍慢; 2、 NAND和NOR的读都可以以字节为单位,但NAND的写以page为单位,而NOR可以随机
4、写每一个字节。NAND和NOR的擦除都以block为单位,但一般NAND的block比NOR的block小。另外,不管是NAND还是NOR,在写入前,都必须先进行擦除操作,但是NOR在擦除前要先写0; 3、 NAND不能在片内运行程序,而NOR可以。但目前很多CPU都可以在上电时,以硬件的方式先将NAND的第一个block中的内容(一般是程序代码,且也许不足一个block,如2KB大小)自动copy到ram中,然后再运行,因此只要CPU支持,NAND也可以当成启动设备; 4、 NAND和NOR都可能发生比特位反转(但NAND反转
5、的几率远大于NOR),因此这两者都必须进行ECC操作;NAND可能会有坏块(出厂时厂家会对坏块做标记),在使用过程中也还有可能会出现新的坏块,因此NAND驱动必须对坏块进行管理。 二、内核树中基于MTD的NAND驱动代码的布局 34在Linux内核中,MTD源代码放在linux-2.6.22.10/driver/mtd目录中,该目录中包含chips、devices、maps、nand、onenand和ubi六个子目录。 其中只有nand和onenand目录中的代码才与NAND驱动相关,不过nand目录中的代码比较通用,而onen
6、and目录中的代码相对于nand中的代码而言则简化了很多,它是针对三星公司开发的另一类Flash芯片,即OneNANDFlash。我尚未对OneNandFLASH有过研究,只是通过网上资料得知,OneNandFLASH克服了传统NANDFlash接口复杂的缺点,具有接口简单、读写速度快、容量大、寿命长、成本低等优点,因此应该是一种较常用NAND先进的FLASH吧,只是目前似乎普及率并不高,本文也将不做讨论。 因此,若只是开发基于MTD的NAND驱动程序,那么我们需要关注的代码就基本上全在linux-2.6.22.10/drive
7、rs/mtd/nand目录中了,而该目录中也不是所有的代码文件都与我们将要开发的NAND驱动有关,除了Makefile和Kconfig之外,其中真正与NAND驱动有关的代码文件只有6个,即: 1、 nand_base.c:定义了NAND驱动中对NAND芯片最基本的操作函数和操作流程,如擦除、读写page、读写oob等。当然这些函数都只是进行一些default的操作,若你的系统在对NAND操作时有一些特殊的动作,则需要在你自己的驱动代码中进行定义,然后Replace这些default的函数。 2、 nand_bbt.c:定义了NA
8、ND驱动中与坏块管理有关的函数和结构体。 3、 nand_ids.c:定义了两个全局类型的结构体:structnand_flash_devnand_flash_ids[]和structnand_manufacturersnand_manuf_ids[]。其中前者
此文档下载收益归作者所有