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