linux内核-Nand驱动-内核中nand的代码布局

在Linux 内核中,MTD 源代码放在/driver/mtd 目录中,该目录中包含chips 、devices 、maps 、nand 、onenand 和ubi 六个子目录。其中只有nand 和onenand 目录中的代码才与NAND 驱动相关,不过nand 目录中的代码比较通用,而onenand 目录中的代码相对于nand 中的代码而言则简化了不少,它是针对三星公司开发的另外一类Flash芯片,即OneNAND Flash,是一种较经常使用NAND先进的FLASH吧,只是目前彷佛普及率并不高,本文也将不作讨论。
      所以,若只是开发基于MTD 的NAND 驱动程序,那么咱们须要关注的代码就基本上全在drivers/mtd/nand 目录中了,而该目录中也不是全部的代码文件都与咱们将要开发的NAND 驱动有关,除了Makefile 和Kconfig 以外,其中真正与NAND 驱动有关的代码文件只有6 个,即:
1)nand_base.c :
      定义了NAND 驱动中对NAND 芯片最基本的操做函数和操做流程,如擦除、读写page 、读写oob 等。固然这些函数都只是进行一些default 的操做,若你的系统在对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 。当NAND 驱动被加载的时候,它会去读取具体NAND 芯片的ID ,而后根据读取的内容到上述定义的nand_manuf_ids[ ] 和nand_flash_ids[ ] 两个结构体中去查找,以此判断该NAND 芯片是那个厂商的产品,以及该NAND 芯片的类型。若查找不到,则NAND 驱动就会加载失败,所以在开发NAND 驱动前必须事先将你的NAND 芯片添加到这两个结构体中去(其实这两个结构体中已经定义了市场上绝大多数的NAND 芯片,因此除非你的NAND 芯片实在比较特殊,不然通常不须要额外添加)。ide

     值得一提的是,nand_flash_ids[ ] 中有三项属性比较重要,即pagesize 、chipsize 和erasesize ,驱动就是依据这三项属性来决定对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 (根据ManufactureID ),开发普通NAND 驱动时不用理会。
6)diskonchip.c :
      定义了片上磁盘(DOC) 相关的一些函数,开发普通NAND 驱动时不用理会。
除了上述六个文件以外,nand 目录中其余文件基本都是特定系统的NAND 驱动程序例子,但看来真正有参考价值的还有cafe_nand.c 和s3c2410.c 两个,而其中又尤以cafe_nand.c 更为详细,另外,nand 目录中也彷佛只有cafe_nand.c 中的驱动程序在读写NAND 芯片时用到了DMA 操做。函数

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhandoushi1982/archive/2010/03/22/5405393.aspxspa

相关文章
相关标签/搜索