毕业论文设计基于mtd的nand驱动开发.doc
《毕业论文设计基于mtd的nand驱动开发.doc》由会员分享,可在线阅读,更多相关《毕业论文设计基于mtd的nand驱动开发.doc(46页珍藏版)》请在咨信网上搜索。
1、基于MTD的NAND驱动开发说明大约用了两个礼拜不到的时间为公司的IPcamera系统写了基于MTD的NAND驱动(linux-2.6.22.10内 核),目前已可以在该驱动的支持下跑cramfs和jffs2文件系统,另 外,该驱动也可以同时支持small page(每页512 Byte)和big page(每页2048 Byte)两种NAND芯片。在此整理一下与NAND驱 动相关的概念,结构体,驱动框架和流程,同时分析一下基于MTD的NAND驱动的部分函数,尤其是其中的nand_scan()函数。(涉及到具体NAND芯片时,若不做说明,将以small page的NAND芯片为例。)注:个人理
2、解,有误难免! 笔者:曹荣荣MTD 驱动程序是专门针对嵌入式Linux的 一种驱动程序,相对于常规块设备驱动程序(比如PC中 的IDE硬盘)而言,MTD驱动程序能更好的支持和管理闪存设备,因为它本身就是专为闪存设备 而设计的。具体地讲,基于MTD的FLASH驱动,承上可以很好地支持cramfs,jffs2和yaffs等文件系统,启下也能对FLASH的擦除,读写,FLASH坏块以及损耗平衡进行很好的管理。所谓损耗平衡,是指对NAND的擦写不能总是集中在某一个或某几个block中,这是由NAND芯片有限的擦写次数的特性决定的。总之,在现阶段,要为FLASH设备开发Linux下的驱动程序,那么基于M
3、TD的开发将几乎是省时又省力的唯一选择!一、NAND和NOR的区别Google “Nand Flash和Nor Flash的区别”。简单点说,主要的区别就是:1、 NAND比NOR便宜;NAND的容量比NOR大(指相同成 本);NAND的擦写次数是NOR的十倍;NAND的擦除和写入速度比NOR快,读取速度比NOR稍 慢;2、 NAND和NOR的读都可以以字节为单位,但NAND的写以page为 单位,而NOR可以随机写每一个字节。NAND和NOR的擦除都以block为单位,但一般NAND的block比NOR的block小。另外,不管是NAND还 是NOR,在写入前,都必须先进行擦除操作,但是NO
4、R在擦除前要先写0;3、 NAND不能在片内运行程序,而NOR可以。但目前很多CPU都可以在上电时,以硬件的方式先将NAND的第一个block中的内容(一般是程 序代码,且也许不足一个block,如2KB大小)自动copy到ram中,然后再运行,因此只要CPU支持,NAND也可以当成启动设备;4、 NAND和NOR都可能发生比特位反转(但NAND反转的几率远大于NOR), 因此这两者都必须进行ECC操作;NAND可能会有坏块(出厂时厂家会对坏块做标记),在使用过程中也还有可能会出现新的坏块,因此NAND驱动必须对坏块进行管理。二、内 核树中基于MTD的NAND驱动代码的布局在Linux内 核中
5、,MTD源代码放在linux-2.6.22.10/driver/mtd目录中,该目录中包含chips、devices、maps、nand、onenand和ubi六 个子目录。其中只有nand和onenand目录中的代码才与NAND驱动相关,不过nand目录中的代码比 较通用,而onenand目录中的代码相对于nand中的代码而言则简化了很多,它是针对三星公司开发的另一类Flash芯片,即 OneNAND Flash。我尚未对OneNand FLASH有过研究,只是通过网上资料得知,OneNand FLASH克服了传统NAND Flash接口复杂的缺点,具有接口简单、读写速度快、容量大、寿命长、
6、成本低等优点,因此应该是一种较常用NAND先进的FLASH吧,只是目前似乎普 及率并不高,本文也将不做讨论。因此,若只是开发基于MTD的NAND驱动程序,那么我们需要关注的 代码就基本上全在linux-2.6.22.10/drivers/mtd/nand目 录中了,而该目录中也不是所有的代码文件都与我们将要开发的NAND驱动有 关,除了Makefile和Kconfig之外,其中真正与NAND驱动有 关的代码文件只有6个,即:1、 nand_base.c:定义了NAND驱 动中对NAND芯片最基本的操作函数和操作流程,如擦除、读写page、读写oob等。 当然这些函数都只是进行一些default
7、的操作,若你的系统在对NAND操作时有一些特殊的动作,则需要在你自己的驱动代码中进行定义,然后Replace这些default的 函数。2、 nand_bbt.c:定义了NAND驱 动中与坏块管理有关的函数和结构体。3、 nand_ids.c:定义了两个全局类型的结构体:struct nand_flash_dev nand_flash_ids 和struct nand_manufacturers nand_manuf_ids 。其中前者定义了一些NAND芯片的类型,后者定义了NAND芯片的几个厂商。NAND芯片的ID至少包含两项内容:厂商ID和 厂商为自己的NAND芯片定义的芯片ID。当NAN
8、D驱动被加载的时候,它 会去读取具体NAND芯片的ID,然后根据读取的内容到上述定义的nand_manuf_ids 和nand_flash_ids 两个结构体中去查 找,以此判断该NAND芯片是那个厂商的产品,以及该NAND芯片的类型。若查找不到,则NAND驱动就会加载失败,因此在开发NAND驱 动前必须事先将你的NAND芯片添加到这两个结构体中去(其实这两个结构体中 已经定义了市场上绝大多数的NAND芯片,所以除非你的NAND芯片实在比较特殊,否则一般不需要额外添加)。值得一提的是,nand_flash_ids 中有三项属性比较重要,即pagesize、chipsize和erasesize,
9、驱动就是依据这三项属性来决定对NAND芯片进行擦除,读写等操作时的大小的。其中pagesize即NAND芯片的页大 小,一般为256、512或2048;chipsize即NAND芯 片的容量;erasesize即每次擦除操作的大小,通常就是NAND芯片的block大 小。4、 nand_ecc.c:定义了NAND驱 动中与softeware ECC有关的函数和结构体,若你的系统支持hardware ECC,且不需要software ECC,则该文件也不需理会。5、 nandsim.c:定义了Nokia开 发的模拟NAND设备,默认是Toshiba NAND 8MiB 1,8V 8-bit(根据
10、ManufactureID),开发普通NAND驱 动时不用理会。6、 diskonchip.c:定义了片上磁盘(DOC)相 关的一些函数,开发普通NAND驱动时不用理会。除了上述六个文件之外,nand目录中其他文件基本都是特定系统的NAND驱 动程序例子,但本人看来真正有参考价值的只有cafe_nand.c和s3c2410.c两个,而其中又尤以cafe_nand.c更为详细,另外,nand目 录中也似乎只有cafe_nand.c中的驱动程序在读写NAND芯片时用到了DMA操 作。综上所述,若要研究基于MTD的NAND驱动,其实所需阅读的代码量也 不是很大。另外,在动手写NAND驱 动之前,也许
11、需要读一下以下文档:1、 Linux MTD 源代码分析:该文档可以让我们对MTD有一个直观而又相对具体的认识,但它似乎主要是针对NOR FLASH的,对于实际开发NAND驱动的帮助并不是很大。2、 MTD NAND Driver Programming Interface:http:/www.aoc.nrao.edu/tjuerges/ALMA/Kernel/mtdnand/该文档中关于ECC的 说明很有帮助。3、 MTD的官方网站:http:/www.linux-mtd.infradead.org/三、NAND相 关原理在我们开始NAND驱 动编写之前,至少应该知道:数据在NAND中是怎样
12、存储的,以及以怎样的方式 从NAND中读写数据时。1、 NAND的存储结构和操作方式这方面的资料可以从任意一种NAND的datasheet中得到,因为基本 上每一种NAND的datasheet都会介绍NAND的组成结构 和操作命令,而且事实上,大多数的NAND datasheet都大同小异, 所不同的大概只是该NAND芯片的容量大小和读写速度等基本特性。这里以每页512字 节的NAND FLASH为例简单说明一下:每一块NAND芯片由n个block组成每 一个block由m个page组成每 一个page由256字 节大小的column1(也称1st half page)、256字节大小 的co
13、lumn2(也称2nd half page)和16字节大小的oob(out-of-band,也称spare area)组成。至于m和n的大小可以查看特定NAND的datasheet。相应的,若给定NAND中的一个字节的地址,我们可以根据这个地址算出block地 址(即第几个block)、page地址(即 该block中的第几个page)和column地址(即1st half page,或2nd half page,或oob中的第几个字节)。在擦除NAND时, 必须每次至少擦除1个block;在写NAND时,必须每次写1个page(有 些NAND也支持写不足一个page大小的数据);在读NAND
14、时,分为三种情况(对 应三种不同的NAND命令),即读column1、读column2和读oob, 那么为什么要分这三种情况呢?假如知道NAND怎样根据给定的地址确定它的存 储单元,那么自然也就能明白原因了,其实也并不复杂,主要是因为给定地址中的A8并 不在NAND的视野范围之内(也许表达并不准确)。事实上,在写基于MTD的NAND驱动时,我们并不需要实现精确到读写某一个byte地址的函数(除了读oob之外), 这是因为:基于MTD的NAND驱动在读写NAND时, 可以分两种情况,即:(1)不进行ECC检测时,一次读写一整个page中 的MAIN部分(也 就是那真实存储数据的512字节);(2
15、)进行ECC检测时(不 管是hardware ECC还是software ECC),一次读写一整个page(包 括16字节的oob部 分)。所以部分NAND所 支持的写不足一个page大小数据的功能,对MTD来说是用不着的。那么,如果只需要读写不足一个page大小的数据怎么办?这是MTD更上层的 部分需要处理的事。也就是说,对于NAND驱动来说,它只会读写整整一个page的数据!最后值得一提的是,NAND驱动有可能只去读oob部分,这是因为 除了ECC信息之外,坏块信息也存储在oob之中,NAND驱动需要读取oob中描述坏块的那个字节(通 常是每个block的第一个page的oob中的第六个字
16、节)来判断该block是 不是一个坏块。所以,我们只有在读oob时,才需要实现精确到读某一个byte地址的函数。由此,我们也可以额外知道一件事,那就是NAND驱动中用到的column地 址只在读oob时才有用,而在其他情况下,column地址都为0。2、 ECC相关的结构体struct nand_ecclayout uint32_t eccbytes; uint32_t eccpos64; uint32_t oobavail; struct nand_oobfree oobfreeMTD_MAX_OOBFREE_ENTRIES;这是用来定义ECC在oob中布局的一个结构体。前面已经提及过,oo
17、b中 主要存储两种信息:坏块信息和ECC数据。对与small page的NAND芯 片来说,其中坏块信息占据1个字节(一般固定在第六个字节),ECC数据占据三个字节。所以sturct nand_ecclayout这个结构体,也就是用来告诉那些与ECC操作无关的函数,Nand芯片的oob部分中,哪些字节是用来存储ECC的(即不可用作它用的),哪些字节是空闲的,即可用的。其实之所以有这个结构体,主要是因为硬件ECC的缘故。以写数据为例,在使用硬件ECC的 情况下,那三个字节的ECC数据是由硬件计算得到,并且写到NAND芯片的oob中 去的,同时也是由硬件决定写到oob的哪三个字节中去。这些都是由硬
18、件做的, 而NAND驱动并不知道,所以就需要用这个结构体来告诉驱动了。所以,在写NAND驱 动时,就有可能需要对这个结构体进行赋值。这里说“有可能”,是因为MTD对 这个结构体有一个默认的赋值,假如这个赋值所定义的ECC位置与你的硬件一致 的话,那就不必在你的驱动中手动赋值了。其实对大多数硬件(这里所说的硬件, 不是指NAND芯片,而是NAND控制器)来说,是不必手动赋值的,但也 有许多例外。值得一提的是,这个结构体不仅仅用来定义ECC布局,也可以用来将你的驱动在oob中 需要额外用到的字节位置保护起来。现在对struct nand_ecclayout 这个结构体进行一下说明。uint32_t
19、 eccbytes:ECC的字节数,对于512B-per-page的NAND来 说,eccbytes = 3,如果你需要额外用到oob中的数据,那么也可以大于3.uint32_t eccpos64:ECC数据在oob中的位置,这里之所以是个64字节的数组,是因为对于2048-per-page的NAND来说,它的oob有64个字节。而对于512B-per-page的NAND来说,可以而且只可以定义它的前16个字节。uint32_t oobavail:oob中可用的字节数,这个值不用赋值,MTD会根据其它三个变量自动计算得到。struct nand_oobfree oobfreeMTD_MAX_O
20、OBFREE_ENTRIES:显示定义空闲的oob字节。四、基于MTD的NAND驱动架构1、platform_device和platform_driver的 定义和注册对于我们的NAND driver,以下是一个典型的例子:static struct platform_driver caorr_nand_driver = .driver = .name = caorr-nand,.owner = THIS_MODULE,.probe = caorr_nand_probe,.remove = caorr_nand_remove,;static int _init caorr_nand_init(
21、void)printk(CAORR NAND Driver, (c) 2008-2009.n);return platform_driver_register(&caorr_nand_driver);static void _exit caorr_nand_exit(void)platform_driver_unregister(&caorr_nand_driver);module_init(caorr_nand_init);module_exit(caorr_nand_exit);与大多数嵌入式Linux驱 动一样,NAND驱动也是从module_init宏 开始。caorr_nand_in
22、it是驱动初始化函数,在此函数中注册platform driver结构体,platform driver结构体中自然需要定义probe和remove函数。其实在大多数嵌入式Linux驱 动中,这样的套路基本已经成了一个定式至于module_init有 什么作用,caorr_nand_probe又是何时调用的,以及这个driver是怎么和NAND设备联系起来的, 就不再多说了,这里只提三点:A、以 上代码只是向内核注册了NAND的platform_driver, 即caorr_nand_driver,我们当然还需要一个NAND的platform_device,要 不然caorr_nand_dri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业论文 设计 基于 mtd nand 驱动 开发
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。