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