資源描述:
《參考基于mtd的nand驅(qū)動(dòng)開(kāi)發(fā)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、基于MTD的NAND驅(qū)動(dòng)開(kāi)發(fā)說(shuō)明?大約用了兩個(gè)禮拜不到的時(shí)間為公司的IPcamera系統(tǒng)寫了基于MTD的NAND驅(qū)動(dòng)(linux-2.6.22.10內(nèi)核),目前已可以在該驅(qū)動(dòng)的支持下跑cramfs和jffs2文件系統(tǒng),另外,該驅(qū)動(dòng)也可以同時(shí)支持smallpage(每頁(yè)512Byte)和bigpage(每頁(yè)2048Byte)兩種NAND芯片。在此整理一下與NAND驅(qū)動(dòng)相關(guān)的概念,結(jié)構(gòu)體,驅(qū)動(dòng)框架和流程,同時(shí)分析一下基于MTD的NAND驅(qū)動(dòng)的部分函數(shù),尤其是其中的nand_scan()函數(shù)。(涉及到具體NAND芯片時(shí),若不做說(shuō)明,將以smallpage的NAND芯片為例。)?注:個(gè)人理解,有誤
2、難免!——筆者:曹榮榮??MTD驅(qū)動(dòng)程序是專門針對(duì)嵌入式Linux的一種驅(qū)動(dòng)程序,相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序(比如PC中的IDE硬盤)而言,MTD驅(qū)動(dòng)程序能更好的支持和管理閃存設(shè)備,因?yàn)樗旧砭褪菍殚W存設(shè)備而設(shè)計(jì)的。具體地講,基于MTD的FLASH驅(qū)動(dòng),承上可以很好地支持cramfs,jffs2和yaffs等文件系統(tǒng),啟下也能對(duì)FLASH的擦除,讀寫,F(xiàn)LASH壞塊以及損耗平衡進(jìn)行很好的管理。所謂損耗平衡,是指對(duì)NAND的擦寫不能總是集中在某一個(gè)或某幾個(gè)block中,這是由NAND芯片有限的擦寫次數(shù)的特性決定的??傊?,在現(xiàn)階段,要為FLASH設(shè)備開(kāi)發(fā)Linux下的驅(qū)動(dòng)程序,那么基于MTD的
3、開(kāi)發(fā)將幾乎是省時(shí)又省力的唯一選擇!?一、NAND和NOR的區(qū)別?Google“NandFlash和NorFlash的區(qū)別”。?簡(jiǎn)單點(diǎn)說(shuō),主要的區(qū)別就是:?1、?NAND比NOR便宜;NAND的容量比NOR大(指相同成本);NAND的擦寫次數(shù)是NOR的十倍;NAND的擦除和寫入速度比NOR快,讀取速度比NOR稍慢;?2、?NAND和NOR的讀都可以以字節(jié)為單位,但NAND的寫以page為單位,而NOR可以隨機(jī)寫每一個(gè)字節(jié)。NAND和NOR的擦除都以block為單位,但一般NAND的block比NOR的block小。另外,不管是NAND還是NOR,在寫入前,都必須先進(jìn)行擦除操作,但是NOR在擦
4、除前要先寫0;?3、?NAND不能在片內(nèi)運(yùn)行程序,而NOR可以。但目前很多CPU都可以在上電時(shí),以硬件的方式先將NAND的第一個(gè)block中的內(nèi)容(一般是程序代碼,且也許不足一個(gè)block,如2KB大小)自動(dòng)copy到ram中,然后再運(yùn)行,因此只要CPU支持,NAND也可以當(dāng)成啟動(dòng)設(shè)備;?4、?NAND和NOR都可能發(fā)生比特位反轉(zhuǎn)(但NAND反轉(zhuǎn)的幾率遠(yuǎn)大于NOR),因此這兩者都必須進(jìn)行ECC操作;NAND可能會(huì)有壞塊(出廠時(shí)廠家會(huì)對(duì)壞塊做標(biāo)記),在使用過(guò)程中也還有可能會(huì)出現(xiàn)新的壞塊,因此NAND驅(qū)動(dòng)必須對(duì)壞塊進(jìn)行管理。?二、內(nèi)核樹(shù)中基于MTD的NAND驅(qū)動(dòng)代碼的布局?34在Linux內(nèi)核
5、中,MTD源代碼放在linux-2.6.22.10/driver/mtd目錄中,該目錄中包含chips、devices、maps、nand、onenand和ubi六個(gè)子目錄。?其中只有nand和onenand目錄中的代碼才與NAND驅(qū)動(dòng)相關(guān),不過(guò)nand目錄中的代碼比較通用,而onenand目錄中的代碼相對(duì)于nand中的代碼而言則簡(jiǎn)化了很多,它是針對(duì)三星公司開(kāi)發(fā)的另一類Flash芯片,即OneNANDFlash。我尚未對(duì)OneNandFLASH有過(guò)研究,只是通過(guò)網(wǎng)上資料得知,OneNandFLASH克服了傳統(tǒng)NANDFlash接口復(fù)雜的缺點(diǎn),具有接口簡(jiǎn)單、讀寫速度快、容量大、壽命長(zhǎng)、成本低
6、等優(yōu)點(diǎn),因此應(yīng)該是一種較常用NAND先進(jìn)的FLASH吧,只是目前似乎普及率并不高,本文也將不做討論。?因此,若只是開(kāi)發(fā)基于MTD的NAND驅(qū)動(dòng)程序,那么我們需要關(guān)注的代碼就基本上全在linux-2.6.22.10/drivers/mtd/nand目錄中了,而該目錄中也不是所有的代碼文件都與我們將要開(kāi)發(fā)的NAND驅(qū)動(dòng)有關(guān),除了Makefile和Kconfig之外,其中真正與NAND驅(qū)動(dòng)有關(guān)的代碼文件只有6個(gè),即:?1、?nand_base.c:定義了NAND驅(qū)動(dòng)中對(duì)NAND芯片最基本的操作函數(shù)和操作流程,如擦除、讀寫page、讀寫oob等。當(dāng)然這些函數(shù)都只是進(jìn)行一些default的操作,若你
7、的系統(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、?nand_ids.c:定義了兩個(gè)全局類型的結(jié)構(gòu)體:structnand_flash_devnand_flash_ids[]和structnand_manufacturersnand_manuf_ids[]。其中前者