資源描述:
《基于mtd的nandflash設備驅動底層實現(xiàn)原理分析》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、基于MTD的NANDFLASH設備驅動底層實現(xiàn)原理分析(一)經(jīng)過UBOOT初步的移植,Linux內核初步的移植,Linux內核總線設備模型的分析,等一系列痛苦的折騰,目的就是想更好的來分析下NANDFLASH的驅動。。大概一共歷經(jīng)了半個月的時間,慢慢的對NANDFLASH驅動程序有感覺了。。。一、MTD體系結構:Linux內核提供MTD子系統(tǒng)來建立FLASH針對Linux的統(tǒng)一、抽象接口。MTD將文件系統(tǒng)與底層的FLASH存儲器進行隔離。?????引入MTD后Linux系統(tǒng)中對FLASH的設備驅動分為4層???設備節(jié)點:用戶在/dev目錄下使用mknod命令建立MTD字符設備節(jié)點(主
2、設備號為90),或者MTD塊設備節(jié)點(主設備號為31),使用該設備節(jié)點即可訪問MTD設備。MTD設備層:基于MTD原始設備層,系統(tǒng)將MTD設備可以定義為MTD字符(在/mtd/mtdchar.c中實現(xiàn),設備號90)和MTD塊設備(在/mtd/mtdblock.c中實現(xiàn),設備號31)。MTD原始設備層:MTD原始設備層由兩部分構成,一部分是MTD原始設備的通用代碼,另一部分是各個特定Flash的數(shù)據(jù),如分區(qū)。???????????????主要構成的文件有:????????????????????drivers/mtd/mtdcore.c支持mtd字符設備????????????????
3、????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目錄中,該目錄中包含chips、devices、maps、nand、onenand、lpdrr、tests和ubi八個子目錄。其中只有nand和on
4、enand目錄中的代碼才與NAND驅動相關,不過nand目錄中的代碼比較通用,而onenand目錄中的代碼相對于nand中的代碼而言則簡化了很多,它是針對三星公司開發(fā)的另一類Flash芯片,即OneNANDFlash。本文我們需要關注的代碼是linux-2.6.35/drivers/mtd/nand目錄中,在該目錄中我們關心的文件如下:1、?nand_base.c:定義了NAND驅動中對NAND芯片最基本的操作函數(shù)和操作流程,如擦除、讀寫page、讀寫oob等。當然這些函數(shù)都只是進行一些default的操作,若你的系統(tǒng)在對NAND操作時有一些特殊的動作,則需要在你自己的驅動代碼中進行
5、定義,然后Replace這些default的函數(shù)。2、?nand_bbt.c:定義了NAND驅動中與壞塊管理有關的函數(shù)和結構體。3、?nand_ids.c:定義了兩個全局類型的結構體:structnand_flash_devnand_flash_ids[]和structnand_manufacturersnand_manuf_ids[]。其中前者定義了一些NAND芯片的類型,后者定義了NAND芯片的幾個廠商。NAND芯片的ID至少包含兩項內容:廠商ID和廠商為自己的NAND芯片定義的芯片ID。當NAND驅動被加載的時候,它會去讀取具體NAND芯片的ID,然后根據(jù)讀取的內容到上述定義的
6、nand_manuf_ids[]和nand_flash_ids[]兩個結構體中去查找,以此判斷該NAND芯片是那個廠商的產(chǎn)品,以及該NAND芯片的類型。若查找不到,則NAND驅動就會加載失敗,因此在開發(fā)NAND驅動前必須事先將你的NAND芯片添加到這兩個結構體中去(其實這兩個結構體中已經(jīng)定義了市場上絕大多數(shù)的NAND芯片,所以除非你的NAND芯片實在比較特殊,否則一般不需要額外添加)。值得一提的是,nand_flash_ids[]中有三項屬性比較重要,即pagesize、chipsize和erasesize,驅動就是依據(jù)這三項屬性來決定對NAND芯片進行擦除,讀寫等操作時的大小的。其
7、中pagesize即NAND芯片的頁大小,一般為256、512或2048;chipsize即NAND芯片的容量;erasesize即每次擦除操作的大小,通常就是NAND芯片的block大小。4、?nand_ecc.c:定義了NAND驅動中與softewareECC有關的函數(shù)和結構體,若你的系統(tǒng)支持hardwareECC,且不需要softwareECC,則該文件也不需理會。上面這些內容我是Copy別人的我覺得寫得太好了,因為一開始我真的很迷茫,在nand目錄