国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
基于MTD的NAND驅(qū)動開發(fā)(一)
 
大約用了兩個禮拜不到的時間為公司的IPcamera系統(tǒng)寫了基于MTDNAND驅(qū)動(linux-2.6.22.10內(nèi)核),目前已可以在該驅(qū)動的支持下跑cramfsjffs2文件系統(tǒng),另外,該驅(qū)動也可以同時支持small page(每頁512 Byte)big page(每頁2048 Byte)兩種NAND芯片。在此整理一下與NAND驅(qū)動相關(guān)的概念,結(jié)構(gòu)體,驅(qū)動框架和流程,同時分析一下基于MTDNAND驅(qū)動的部分函數(shù),尤其是其中的nand_scan()函數(shù)。(涉及到具體NAND芯片時,若不做說明,將以small pageNAND芯片為例。)
 
注:個人理解,有誤難免!—— 筆者:曹榮榮
 
 
MTD 驅(qū)動程序是專門針對嵌入式Linux的一種驅(qū)動程序,相對于常規(guī)塊設(shè)備驅(qū)動程序(比如PC中的IDE硬盤)而言,MTD驅(qū)動程序能更好的支持和管理閃存設(shè)備,因為它本身就是專為閃存設(shè)備而設(shè)計的。
具體地講,基于MTDFLASH驅(qū)動,承上可以很好地支持cramfs,jffs2yaffs等文件系統(tǒng),啟下也能對FLASH的擦除,讀寫,FLASH壞塊以及損耗平衡進行很好的管理。所謂損耗平衡,是指對NAND的擦寫不能總是集中在某一個或某幾個block中,這是由NAND芯片有限的擦寫次數(shù)的特性決定的。
總之,在現(xiàn)階段,要為FLASH設(shè)備開發(fā)Linux下的驅(qū)動程序,那么基于MTD的開發(fā)將幾乎是省時又省力的唯一選擇!
 
一、NANDNOR的區(qū)別
 
Google Nand FlashNor Flash的區(qū)別”。
 
簡單點說,主要的區(qū)別就是:
 
1、  NANDNOR便宜;NAND的容量比NOR大(指相同成本);NAND的擦寫次數(shù)是NOR的十倍;NAND的擦除和寫入速度比NOR快,讀取速度比NOR稍慢;
 
2、  NANDNOR的讀都可以以字節(jié)為單位,但NAND的寫以page為單位,而NOR可以隨機寫每一個字節(jié)。NANDNOR的擦除都以block為單位,但一般NANDblockNORblock小。另外,不管是NAND還是NOR,在寫入前,都必須先進行擦除操作,但是NOR在擦除前要先寫0
 
3、  NAND不能在片內(nèi)運行程序,而NOR可以。但目前很多CPU都可以在上電時,以硬件的方式先將NAND的第一個block中的內(nèi)容(一般是程序代碼,且也許不足一個block,如2KB大?。┳詣?font face="Times New Roman">copyram中,然后再運行,因此只要CPU支持,NAND也可以當(dāng)成啟動設(shè)備;
 
4、  NANDNOR都可能發(fā)生比特位反轉(zhuǎn)(但NAND反轉(zhuǎn)的幾率遠大于NOR),因此這兩者都必須進行ECC操作;NAND可能會有壞塊(出廠時廠家會對壞塊做標(biāo)記),在使用過程中也還有可能會出現(xiàn)新的壞塊,因此NAND驅(qū)動必須對壞塊進行管理。
 
二、內(nèi)核樹中基于MTDNAND驅(qū)動代碼的布局
 
Linux內(nèi)核中,MTD源代碼放在linux-2.6.22.10/driver/mtd目錄中,該目錄中包含chips、devicesmaps、nand、onenandubi六個子目錄。
 
其中只有nandonenand目錄中的代碼才與NAND驅(qū)動相關(guān),不過nand目錄中的代碼比較通用,而onenand目錄中的代碼相對于nand中的代碼而言則簡化了很多,它是針對三星公司開發(fā)的另一類Flash芯片,即OneNAND Flash。我尚未對OneNandFLASH有過研究,只是通過網(wǎng)上資料得知,OneNand FLASH克服了傳統(tǒng)NANDFlash接口復(fù)雜的缺點,具有接口簡單、讀寫速度快、容量大、壽命長、成本低等優(yōu)點,因此應(yīng)該是一種較常用NAND先進的FLASH吧,只是目前似乎普及率并不高,本文也將不做討論。
 
因此,若只是開發(fā)基于MTDNAND驅(qū)動程序,那么我們需要關(guān)注的代碼就基本上全在linux-2.6.22.10/drivers/mtd/nand目錄中了,而該目錄中也不是所有的代碼文件都與我們將要開發(fā)的NAND驅(qū)動有關(guān),除了MakefileKconfig之外,其中真正與NAND驅(qū)動有關(guān)的代碼文件只有6個,即:
 
1、  nand_base.c
定義了NAND驅(qū)動中對NAND芯片最基本的操作函數(shù)和操作流程,如擦除、讀寫page、讀寫oob等。當(dāng)然這些函數(shù)都只是進行一些default的操作,若你的系統(tǒng)在對NAND操作時有一些特殊的動作,則需要在你自己的驅(qū)動代碼中進行定義,然后Replace這些default的函數(shù)。
 
2、  nand_bbt.c
定義了NAND驅(qū)動中與壞塊管理有關(guān)的函數(shù)和結(jié)構(gòu)體。
 
3、  nand_ids.c
定義了兩個全局類型的結(jié)構(gòu)體:struct nand_flash_dev nand_flash_ids[ ]struct nand_manufacturers nand_manuf_ids[ ]。其中前者定義了一些NAND芯片的類型,后者定義了NAND芯片的幾個廠商。NAND芯片的ID至少包含兩項內(nèi)容:廠商ID和廠商為自己的NAND芯片定義的芯片ID。當(dāng)NAND驅(qū)動被加載的時候,它會去讀取具體NAND芯片的ID,然后根據(jù)讀取的內(nèi)容到上述定義的nand_manuf_ids[ ]nand_flash_ids[ ]兩個結(jié)構(gòu)體中去查找,以此判斷該NAND芯片是那個廠商的產(chǎn)品,以及該NAND芯片的類型。若查找不到,則NAND驅(qū)動就會加載失敗,因此在開發(fā)NAND驅(qū)動前必須事先將你的NAND芯片添加到這兩個結(jié)構(gòu)體中去(其實這兩個結(jié)構(gòu)體中已經(jīng)定義了市場上絕大多數(shù)的NAND芯片,所以除非你的NAND芯片實在比較特殊,否則一般不需要額外添加)。值得一提的是,nand_flash_ids[ ]中有三項屬性比較重要,即pagesize、chipsizeerasesize,驅(qū)動就是依據(jù)這三項屬性來決定對NAND芯片進行擦除,讀寫等操作時的大小的。其中pagesizeNAND芯片的頁大小,一般為256、5122048chipsizeNAND芯片的容量;erasesize即每次擦除操作的大小,通常就是NAND芯片的block大小。
 
4、  nand_ecc.c
定義了NAND驅(qū)動中與softeware ECC有關(guān)的函數(shù)和結(jié)構(gòu)體,若你的系統(tǒng)支持hardware ECC,且不需要software ECC,則該文件也不需理會。
 
5、  nandsim.c
定義了Nokia開發(fā)的模擬NAND設(shè)備,默認是Toshiba NAND 8MiB 1,8V 8-bit(根據(jù)ManufactureID),開發(fā)普通NAND驅(qū)動時不用理會。
 
6、  diskonchip.c
定義了片上磁盤(DOC)相關(guān)的一些函數(shù),開發(fā)普通NAND驅(qū)動時不用理會。
 
除了上述六個文件之外,nand目錄中其他文件基本都是特定系統(tǒng)的NAND驅(qū)動程序例子,但本人看來真正有參考價值的只有cafe_nand.cs3c2410.c兩個,而其中又尤以cafe_nand.c更為詳細,另外,nand目錄中也似乎只有cafe_nand.c中的驅(qū)動程序在讀寫NAND芯片時用到了DMA操作。
 
綜上所述,若要研究基于MTDNAND驅(qū)動,其實所需閱讀的代碼量也不是很大。
 
另外,在動手寫NAND驅(qū)動之前,也許需要讀一下以下文檔:
1、  Linux MTD 源代碼分析:
該文檔可以讓我們對MTD有一個直觀而又相對具體的認識,但它似乎主要是針對NOR FLASH的,對于實際開發(fā)NAND驅(qū)動的幫助并不是很大。
2、  MTD NAND Driver Programming Interface
該文檔中關(guān)于ECC的說明很有幫助。
3、  MTD的官方網(wǎng)站:
 
三、NAND相關(guān)原理
 
在我們開始NAND驅(qū)動編寫之前,至少應(yīng)該知道:數(shù)據(jù)在NAND中是怎樣存儲的,以及以怎樣的方式從NAND中讀寫數(shù)據(jù)時。
 
1、  NAND的存儲結(jié)構(gòu)和操作方式
 
這方面的資料可以從任意一種NANDdatasheet中得到,因為基本上每一種NANDdatasheet都會介紹NAND的組成結(jié)構(gòu)和操作命令,而且事實上,大多數(shù)的NAND datasheet都大同小異,所不同的大概只是該NAND芯片的容量大小和讀寫速度等基本特性。
 
這里以每頁512字節(jié)的NAND FLASH為例簡單說明一下:每一塊NAND芯片由nblock組成->每一個blockmpage組成->每一個page256字節(jié)大小的column1(也稱1st half page)、256字節(jié)大小的column2(也稱2nd half page)16字節(jié)大小的oob(out-of-band,也稱spare area)組成。至于mn的大小可以查看特定NANDdatasheet。相應(yīng)的,若給定NAND中的一個字節(jié)的地址,我們可以根據(jù)這個地址算出block地址(即第幾個block)、page地址(即該block中的第幾個page)column地址(1st half page,或2nd half page,或oob中的第幾個字節(jié))。
 
在擦除NAND時,必須每次至少擦除1block;在寫NAND時,必須每次寫1page(有些NAND也支持寫不足一個page大小的數(shù)據(jù));在讀NAND時,分為三種情況(對應(yīng)三種不同的NAND命令),即讀column1、讀column2和讀oob,那么為什么要分這三種情況呢?假如知道NAND怎樣根據(jù)給定的地址確定它的存儲單元,那么自然也就能明白原因了,其實也并不復(fù)雜,主要是因為給定地址中的A8并不在NAND的視野范圍之內(nèi)(也許表達并不準(zhǔn)確)
 
事實上,在寫基于MTDNAND驅(qū)動時,我們并不需要實現(xiàn)精確到讀寫某一個byte地址的函數(shù)(除了讀oob之外),這是因為:
 
基于MTDNAND驅(qū)動在讀寫NAND時,可以分兩種情況,即:(1)不進行ECC檢測時,一次讀寫一整個page中的MAIN部分(也就是那真實存儲數(shù)據(jù)的512字節(jié));(2)進行ECC檢測時(不管是hardware ECC還是software ECC),一次讀寫一整個page(包括16字節(jié)的oob部分)。所以部分NAND所支持的寫不足一個page大小數(shù)據(jù)的功能,對MTD來說是用不著的。
 
那么,如果只需要讀寫不足一個page大小的數(shù)據(jù)怎么辦?這是MTD更上層的部分需要處理的事。也就是說,對于NAND驅(qū)動來說,它只會讀寫整整一個page的數(shù)據(jù)!
 
最后值得一提的是,NAND驅(qū)動有可能只去讀oob部分,這是因為除了ECC信息之外,壞塊信息也存儲在oob之中,NAND驅(qū)動需要讀取oob中描述壞塊的那個字節(jié)(通常是每個block的第一個pageoob中的第六個字節(jié))來判斷該block是不是一個壞塊。所以,我們只有在讀oob時,才需要實現(xiàn)精確到讀某一個byte地址的函數(shù)。
 
由此,我們也可以額外知道一件事,那就是NAND驅(qū)動中用到的column地址只在讀oob時才有用,而在其他情況下,column地址都為0。
 
2、  ECC相關(guān)的結(jié)構(gòu)體
struct nand_ecclayout {
           uint32_t eccbytes;
           uint32_t eccpos[64];
           uint32_t oobavail;
           struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
};
這是用來定義ECCoob中布局的一個結(jié)構(gòu)體。
 
前面已經(jīng)提及過,oob中主要存儲兩種信息:壞塊信息和ECC數(shù)據(jù)。對與small pageNAND芯片來說,其中壞塊信息占據(jù)1個字節(jié)(一般固定在第六個字節(jié))ECC數(shù)據(jù)占據(jù)三個字節(jié)。所以sturct nand_ecclayout這個結(jié)構(gòu)體,也就是用來告訴那些與ECC操作無關(guān)的函數(shù),Nand芯片的oob部分中,哪些字節(jié)是用來存儲ECC(即不可用作它用的),哪些字節(jié)是空閑的,即可用的。
 
其實之所以有這個結(jié)構(gòu)體,主要是因為硬件ECC的緣故。以寫數(shù)據(jù)為例,在使用硬件ECC的情況下,那三個字節(jié)的ECC數(shù)據(jù)是由硬件計算得到,并且寫到NAND芯片的oob中去的,同時也是由硬件決定寫到oob的哪三個字節(jié)中去。這些都是由硬件做的,而NAND驅(qū)動并不知道,所以就需要用這個結(jié)構(gòu)體來告訴驅(qū)動了。
 
所以,在寫NAND驅(qū)動時,就有可能需要對這個結(jié)構(gòu)體進行賦值。這里說“有可能”,是因為MTD對這個結(jié)構(gòu)體有一個默認的賦值,假如這個賦值所定義的ECC位置與你的硬件一致的話,那就不必在你的驅(qū)動中手動賦值了。其實對大多數(shù)硬件(這里所說的硬件,不是指NAND芯片,而是NAND控制器)來說,是不必手動賦值的,但也有許多例外。
 
值得一提的是,這個結(jié)構(gòu)體不僅僅用來定義ECC布局,也可以用來將你的驅(qū)動在oob中需要額外用到的字節(jié)位置保護起來。
 
現(xiàn)在對struct nand_ecclayout 這個結(jié)構(gòu)體進行一下說明。
 
uint32_t eccbytesECC的字節(jié)數(shù),對于512B-per-pageNAND來說,eccbytes = 3,如果你需要額外用到oob中的數(shù)據(jù),那么也可以大于3.
uint32_t eccpos[64]ECC數(shù)據(jù)在oob中的位置,這里之所以是個64字節(jié)的數(shù)組,是因為對于2048-per-pageNAND來說,它的oob64個字節(jié)。而對于512B-per-pageNAND來說,可以而且只可以定義它的前16個字節(jié)。
uint32_t oobavailoob中可用的字節(jié)數(shù),這個值不用賦值,MTD會根據(jù)其它三個變量自動計算得到。
struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]:顯示定義空閑的oob字節(jié)。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MTD(3)-- nandflash的erase,read,write接口函數(shù)代碼分析
uboot移植與源碼分析總結(jié)(6)-Nand驅(qū)動
【簡介】如何編寫linux下nand flash驅(qū)動
MTD NANDFLASH驅(qū)動相關(guān)知識介紹
轉(zhuǎn) powerpc平臺,norflash及nandflash驅(qū)動及設(shè)備注冊全過程
如何逆向嵌入式設(shè)備的NAND Flash
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服