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