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

相關文章
相關標籤/搜索