程 偉
(安徽理工大學(xué) 電氣與信息工程學(xué)院,安徽 淮南232001)
在嵌入式產(chǎn)品中,隨著系統(tǒng)功能復(fù)雜度的增加和對(duì)數(shù)據(jù)操作靈活性的提高,小容量的Flash設(shè)備已經(jīng)不能滿(mǎn)足需求,大容量Flash設(shè)備使用的越來(lái)越廣泛。嵌入式文件系統(tǒng)可以對(duì)Flash存儲(chǔ)器上龐大的數(shù)據(jù)進(jìn)行存儲(chǔ)和管理,而Yaffs2文件系統(tǒng)就是專(zhuān)門(mén)針對(duì)大容量NAND Flash存儲(chǔ)器設(shè)計(jì)的嵌入式文件系統(tǒng),在NAND Flash上運(yùn)行性能穩(wěn)定優(yōu)異。由于Yaffs2文件系統(tǒng)自身的特點(diǎn),在寫(xiě)入到NAND Flash存儲(chǔ)器中時(shí)不能使用一般的工具和方法。U-Boot作為目前被廣泛使用的一種嵌入式系統(tǒng)中的啟動(dòng)引導(dǎo)程序,可以在開(kāi)發(fā)過(guò)程中實(shí)現(xiàn)對(duì)文件的燒寫(xiě)和調(diào)試[1]。目前UBoot自身還不支持燒寫(xiě)Yaffs2文件系統(tǒng),由于Yaffs2文件系統(tǒng)的特殊結(jié)構(gòu),需要對(duì)U-Boot做一定的改進(jìn)。本文給出了U-Boot的修改過(guò)程并進(jìn)行了詳細(xì)分析,改進(jìn)后的U-Boot可直接把Yaffs2文件系統(tǒng)寫(xiě)入NAND Flash存儲(chǔ)器中,方便了構(gòu)建Yaffs2文件系統(tǒng)+大容量NAND Flash形式的嵌入式系統(tǒng)結(jié)構(gòu)[2],使得嵌入式系統(tǒng)的設(shè)計(jì)開(kāi)發(fā)更加便利。
目前Flash存儲(chǔ)器以其速度快、容量大、成本低等優(yōu)點(diǎn),正被廣泛的應(yīng)用于嵌入式系統(tǒng)中。常用的Flash存儲(chǔ)設(shè)備類(lèi)型有 NOR Flash和 NAND Flash兩種。其中 NOR Flash采用或非結(jié)構(gòu)柵格存儲(chǔ)矩陣實(shí)現(xiàn),可片內(nèi)運(yùn)行程序,常用于系統(tǒng)啟動(dòng)代碼和內(nèi)核映像等存儲(chǔ)[3],但是工藝復(fù)雜,容量小、價(jià)格較貴,具有很低的寫(xiě)入和擦除速度。NAND Flash在嵌入式系統(tǒng)中的地位與PC上的硬盤(pán)類(lèi)似,用于保存系統(tǒng)運(yùn)行所必須的操作系統(tǒng)、應(yīng)用程序、用戶(hù)數(shù)據(jù)等,容量大可達(dá)1GB以上且價(jià)格也相對(duì)便宜,其可擦除次數(shù)是NOR Flash的10倍,其壽命也遠(yuǎn)遠(yuǎn)超過(guò) NOR Flash。NAND Flash也不是完全可靠的,每塊芯片出廠時(shí)都有一定比例的壞塊存在,在使用前需要將壞塊掃描出來(lái),確保不再使用它們,否則會(huì)使產(chǎn)品有嚴(yán)重的故障隱患;而且發(fā)生位反轉(zhuǎn)的概率要高于NOR Flash,當(dāng)位反轉(zhuǎn)發(fā)生在關(guān)鍵代碼、數(shù)據(jù)上時(shí),有可能導(dǎo)致系統(tǒng)崩潰,一般在讀寫(xiě)時(shí)需要使用ECC (error correction code)進(jìn)行錯(cuò)誤檢驗(yàn)和恢復(fù)。
為了方便管理,NAND Flash的存儲(chǔ)空間使用了塊(block)和頁(yè) (page)兩級(jí)存儲(chǔ)體系。一般128MB以下容量的NAND Flash芯片,一頁(yè)大小為 (512+16)字節(jié),其中的512字節(jié)就是一般的存儲(chǔ)數(shù)據(jù)的區(qū)域,16字節(jié)為空閑區(qū) (spare data)又稱(chēng)為 OOB (out of band)區(qū);通常在OOB區(qū)存放壞塊標(biāo)記、前面512字節(jié)的ECC校驗(yàn)碼等[4]。128MB以上大容量的NAND Flash芯片,一頁(yè)大小通常為2 KB,每頁(yè)包含一個(gè)2048字節(jié)的數(shù)據(jù)區(qū)和64字節(jié)的OOB區(qū)[5]。目前大容量的NAND Flash作為嵌入式產(chǎn)品中的存儲(chǔ)介質(zhì),其應(yīng)用日益廣泛,NAND Flash在Compact Flash、Secure Digital、PC Cards和MMC存儲(chǔ)卡市場(chǎng)上所占份額很大。
嵌入式文件系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務(wù)是對(duì)邏輯文件進(jìn)行管理,提供對(duì)邏輯文件操作的接口,如檢索、修改、刪除、復(fù)制等,以方便用戶(hù)的使用[6]。嵌入式文件系統(tǒng)還具有兼容性好、支持自定義的實(shí)時(shí)文件系統(tǒng)、可裁剪可配置、支持多種存儲(chǔ)設(shè)備等特點(diǎn),一個(gè)適合嵌入式設(shè)備的文件系統(tǒng),將使嵌入式設(shè)備上的文件管理更加方便快捷,大大提高嵌入式設(shè)備的性能[7]。支持在Flash上運(yùn)行的常用嵌入式文件系統(tǒng)有Cramfs、Jffs、Jffs2、Yaffs、Yaffs2等,Cramfs文件系統(tǒng)是只讀文件系統(tǒng)。通常在NOR Flash上多選用Jffs及Jffs2文件系統(tǒng),在NAND Flash上選用Yaffs或Yaffs2文件系統(tǒng)。
Yaffs文件系統(tǒng)是一種類(lèi)似于Jffs/Jffs2、專(zhuān)門(mén)為NAND Flash設(shè)計(jì)的嵌入式文件系統(tǒng),目前有Yaffs和Yaffs2兩個(gè)版本,它是日志結(jié)構(gòu)的文件系統(tǒng)[8],開(kāi)源具有很好的移植性,能夠在Linux、ucLinux和 WinCE下面運(yùn)行。提供了損耗平衡和掉電保護(hù),可以有效地避免意外掉電對(duì)文件系統(tǒng)一致性和完整性的影響[9]。
2.2.1 Yaffs2文件系統(tǒng)簡(jiǎn)介
Yaffs是效果很理想的NAND Flash上的文件系統(tǒng),但它不支持?jǐn)?shù)據(jù)壓縮,而且它僅針對(duì)每頁(yè)512字節(jié) (小頁(yè))大小的NAND Flash存儲(chǔ)器;而很多大容量的NAND Flash使用大小為2KB的頁(yè) (大頁(yè)),Yaffs并不能支持這種大頁(yè)NAND Flash。Yaffs2正是為了支持2KB每頁(yè)的大容量NAND Flash和嚴(yán)格的連續(xù)頁(yè)寫(xiě)命令而開(kāi)發(fā)出來(lái)的,Yaffs2作為Yaffs的升級(jí)版,不但支持這兩種頁(yè)大小的NAND Flash,而且還支持一些新型的和具有嚴(yán)格寫(xiě)入時(shí)序的NAND Flash。NAND Flash的基本擦除單位是Block(塊),而基本寫(xiě)入單位是page(頁(yè));Yaffs2在分配存儲(chǔ)空間的時(shí)候也是以頁(yè)為單位的,不過(guò)在Yaffs2中通常被稱(chēng)為塊(chunk),其實(shí)和大頁(yè)NAND Flash的頁(yè) (page)是一樣的大小,在大多數(shù)情況下和頁(yè)是一個(gè)意思。
Yaffs2充分考慮了大頁(yè)NAND Flash的結(jié)構(gòu)特點(diǎn),文件系統(tǒng)本身就包含了OOB區(qū)的數(shù)據(jù) (里面有壞塊標(biāo)記、ECC校驗(yàn)碼以及其它和Yaffs2相關(guān)的信息)。根據(jù)大頁(yè)NAND Flash以頁(yè)面為單位存取的特點(diǎn),將文件組織成固定大小的數(shù)據(jù)段;利用大頁(yè)NAND Flash提供的每個(gè)頁(yè)面64字節(jié)的OOB空間來(lái)存放ECC和文件系統(tǒng)的組織信息,實(shí)現(xiàn)了錯(cuò)誤檢測(cè)和壞塊處理[10]。寫(xiě)入Yaffs2時(shí),不需要再計(jì)算ECC值,首先檢查是否壞塊 (是則跳過(guò)),然后寫(xiě)入2048字節(jié)的數(shù)據(jù),最后寫(xiě)入64字節(jié)的OOB數(shù)據(jù),如此循環(huán)。
2.2.2 Yaffs2文件系統(tǒng)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
Yaffs2文件系統(tǒng)中的文件、目錄、鏈接、設(shè)備文件(以下統(tǒng)稱(chēng)文件)統(tǒng)一用文件頭 (Yaffs2_objectHeader結(jié)構(gòu))描述,每個(gè)文件頭存放在NAND Flash某頁(yè)的數(shù)據(jù)區(qū)內(nèi),其中包括了這個(gè)文件的模式、類(lèi)型、所有者ID、創(chuàng)建時(shí)問(wèn)、Parent Object ID等信息,Yaffs2文件系統(tǒng)分區(qū)內(nèi)的所有文件用object ID來(lái)惟一標(biāo)識(shí)。一些文件系統(tǒng)組織信息(YAFFS TAG)即元數(shù)據(jù) (如文件ID、頁(yè)ID、有效字節(jié)數(shù)等)存放在NAND Flash每頁(yè)的OOB區(qū)中,由于文件系統(tǒng)的基本組織信息保存在頁(yè)面的空閑空間中,因此在文件系統(tǒng)加載時(shí)只需要掃描各個(gè)頁(yè)面的空閑空間,即可建立起整個(gè)文件系統(tǒng)的結(jié)構(gòu),提高了文件系統(tǒng)的加載速度。同時(shí)由于支持的頁(yè)變大,Yaffs2的OOB區(qū)的數(shù)據(jù)結(jié)構(gòu)與Yaffs的略有不同,比如Yaffs2的OOB區(qū)中增加了塊分配序列號(hào)[11]。
2.2.3 Yaffs2文件系統(tǒng)的優(yōu)勢(shì)
與Yaffs相比,Yaffs2除了可以支持2KB每頁(yè)的NAND Flash外,還做了一些改進(jìn)[12],可存儲(chǔ)信息更多,也更靈活。如文件頭的部分元數(shù)據(jù),免去讀文件頭獲取這些數(shù)據(jù)的時(shí)間;Yaffs在更新文件chunk數(shù)據(jù)時(shí),將標(biāo)志位復(fù)制下來(lái)且寫(xiě)入序列號(hào)加1和新數(shù)據(jù)一起寫(xiě)入空白頁(yè),然后將原chunk的標(biāo)志位字節(jié)寫(xiě)為0,標(biāo)記chunk無(wú)效;而Yaffs2在更新時(shí)不再重寫(xiě)其標(biāo)志位,來(lái)標(biāo)記chunk無(wú)效,加快了寫(xiě)入速度[13]。塊分配序列號(hào)的采用使加載時(shí)還可區(qū)別chunk有效和無(wú)效,在垃圾收集的時(shí)候也會(huì)以此作為參考之一,判斷該塊是否適合回收,同時(shí)垃圾回收策略也有改進(jìn)。Yaffs2在內(nèi)存空間占用、垃圾回收速度、讀/寫(xiě)速度等方面相對(duì)于Yaffs也有較大改進(jìn),如表1所示。
表1 Yaffs2與Yaffs的性能比較
表1中Yaffs2的最差性能表現(xiàn)在每頁(yè)512字節(jié)的NAND Flash上,與Yaffs相似;較佳性能則表現(xiàn)在每頁(yè)2KB的NAND Flash上。Yaffs2還可以支持東芝和SanDisk公司的多層單元閃存 (multi-level cell,MLC)部件[14]。
在嵌入式系統(tǒng)中,Bootloader是系統(tǒng)上電后執(zhí)行的一小段程序,它主要完成了初始化硬件設(shè)備、準(zhǔn)備好軟件環(huán)境,最后調(diào)用操作系統(tǒng)內(nèi)核,真正起到了引導(dǎo)和加載內(nèi)核的作用。U-Boot作為嵌入式系統(tǒng)中一種比較流行、功能強(qiáng)大的Bootloader,支持多種嵌入式操作系統(tǒng)和多種處理器系列,性能可靠穩(wěn)定,功能設(shè)置靈活,源代碼開(kāi)放調(diào)試方便,可移植性強(qiáng)可以在不同硬件平臺(tái)上進(jìn)行移植,通過(guò)修改可以方便的增加其功能。
在實(shí)際生產(chǎn)中,可以通過(guò)燒片器等手段將內(nèi)核、文件系統(tǒng)映像燒入固態(tài)存儲(chǔ)設(shè)備中,U-Boot不需要具備燒寫(xiě)功能。但在嵌入式產(chǎn)品開(kāi)發(fā)過(guò)程中,為了方便通常在U-Boot中增加燒寫(xiě)內(nèi)核、文件系統(tǒng)映像文件等功能,完成向Flash中燒寫(xiě)文件。在目前的U-Boot官方版本中僅能夠支持Cramfs、Jffs1/2文件系統(tǒng)的燒寫(xiě),這些文件系統(tǒng)最初是針對(duì)NOR Flash的設(shè)計(jì)的?,F(xiàn)在大容量的NAND Flash使用越來(lái)越多,同時(shí)由于很多使用NAND Flash的系統(tǒng),在Linux下都用Yaffs2作為存儲(chǔ)數(shù)據(jù)的文件系統(tǒng),甚至是根文件系統(tǒng),所以在實(shí)際開(kāi)發(fā)過(guò)程中U-Boot能夠?qū)崿F(xiàn)燒寫(xiě)Yaffs2文件系統(tǒng)非常必要。
本次設(shè)計(jì)的嵌入式手持設(shè)備中用到的軟硬件開(kāi)發(fā)平臺(tái)為處理器ARM+DSP結(jié)構(gòu),ARM處理器采用三星公司的S3C2440A,U-Boot為 u-boot-2010.06版本,基于嵌入式Linux操作系統(tǒng)。由于性能上的需要用到了三星大容量NAND Flash芯片,型號(hào)為K9K4G08U0M總?cè)萘?12M,每頁(yè)大小為 (2048+64)字節(jié),開(kāi)發(fā)過(guò)程中需要使用UBoot燒寫(xiě)Yaffs2文件系統(tǒng)。
要實(shí)現(xiàn)對(duì)Yaffs2文件系統(tǒng)的支持,首先要修改U-Boot的NAND Flash讀寫(xiě)命令,增加燒寫(xiě)Yaffs2文件系統(tǒng)的命令,其次重要的是實(shí)現(xiàn)U-Boot的內(nèi)存技術(shù)設(shè)備 (memory technology device,MTD)層的驅(qū)動(dòng)支持,針對(duì)大頁(yè)NAND Flash的特點(diǎn)增加處理OOB區(qū)域數(shù)據(jù)的功能。MTD是Linux中對(duì)ROM、NOR Flash、NAND Flash等存儲(chǔ)設(shè)備抽象出來(lái)的一個(gè)設(shè)備層,對(duì)Flash操作的接口提供了一系列的標(biāo)準(zhǔn)函數(shù),將硬件驅(qū)動(dòng)設(shè)計(jì)和系統(tǒng)程序設(shè)計(jì)分開(kāi),硬件驅(qū)動(dòng)人員不用了解存儲(chǔ)設(shè)備的組織方法,只需提供標(biāo)準(zhǔn)的函數(shù)調(diào)用。無(wú)論是Jffs2還是Yaffs2[15],還有當(dāng)NAND Flash進(jìn)行寫(xiě)入和擦出操作時(shí),都需要MTD的支持。
在此之前還要針對(duì)具體的NAND Flash芯片,對(duì)NAND Flash的底層驅(qū)動(dòng)代碼進(jìn)行必要的修改,使U-Boot支持大容量的NAND Flash。
在U-Boot的源代碼目錄中,首先添加自己的開(kāi)發(fā)板命名為Key2440(可任意設(shè)置),然后再添加配置文件include/configs/Key2440.h,并在文件中添加如下宏定義:
#define CONFIG_CMD_NAND_YAFFS2 1
/*支持Yaffs2文件系統(tǒng)*/
#define CONFIG _CMD _NAND _YAFFS2 _SKIPFB 1
/*Yaffs2文件系統(tǒng)特性決定跳過(guò)第一個(gè)可用的邏輯塊*/
U-Boot的命令為用戶(hù)提供了交互功能,并且已經(jīng)實(shí)現(xiàn)了幾十個(gè)常用的命令。如果開(kāi)發(fā)板需要很特殊的操作,可以添加新的U-Boot命令。U-Boot的每一個(gè)命令都是通過(guò)U_Boot_CMD宏定義的,這樣每一個(gè)U-Boot命令有一個(gè)結(jié)構(gòu)體來(lái)描述。在u-boot-2010.06版本中已經(jīng)可以通過(guò)“nand write…”、“nand write.jffs2…”等命令來(lái)燒寫(xiě)內(nèi)核,燒寫(xiě)Cramfs、Jffs2文件系統(tǒng),因此可以仿照此結(jié)構(gòu)添加燒寫(xiě)Yaffs2文件系統(tǒng)的命令。
3.4.1 修改common/cmd_nand.c文件
(1)先添加 “nand write [.Yaffs2]”命令的使用說(shuō)明,U-Boot中的命令都在common/cmd_nand.c文件中定義。
U _BOOT _CMD (nand,CONFIG _SYS_M(jìn)AXARGS,1,do_nand, …….
“nand write [.Yaffs2]addr off size- write the‘size’byte Yaffs2image starting\n” /*Yaffs2的寫(xiě)命令*/
“at offset‘off’from memory address‘a(chǎn)ddr’(.Yaffs2 for 2048+64NAND)\n”
(2)修改函數(shù)do_nand,添加對(duì) “write[.Yaffs2]”命令的支持,do_nand函數(shù)主要是處理與NAND Flash操作相關(guān)的命令,負(fù)責(zé)NAND命令族的區(qū)分和執(zhí)行[16]。
}else if(s?。絅ULL &&!strcmp (s," .Yaffs2")){if(read)
{printf ("nand read.Yaffs [2]is not provide temporarily!" );}
else{nand->rw_oob=1;/*寫(xiě)OOB數(shù)據(jù)區(qū)*/
#if defined(CONFIG_CMD_NAND_YAFFS2_SKIPFB)
nand->skipfirstblk=1;/*跳過(guò)第一個(gè)可用塊*/
#else nand->skipfirstblk=0;
#endif
ret=nand_write_skip_bad (nand,off,&size,(u_char*)addr);
3.4.2 修改include/linux/mtd/mtd.h文件
在修改do_nand時(shí)用到了rw_oob和skipfirstblk兩個(gè)結(jié)構(gòu)體數(shù)據(jù)成員,它們是mtd_info結(jié)構(gòu)體中新加的項(xiàng),mtd_info是用于描述MTD原始設(shè)備的數(shù)據(jù)結(jié)構(gòu),其中定義了大量關(guān)于MTD的數(shù)據(jù)和操作函數(shù),所以要修改mtd_info結(jié)構(gòu)添加對(duì)兩個(gè)成員的支持。
struct mtd_in fo{u_int32_t writesize;
u_char rw_oob;
u_char skipfirstblk};
3.5.1 修改drivers/mtd/nand/nand_util.c文件
在文件中添加NAND Flash的OOB區(qū)數(shù)據(jù)的相關(guān)操作信息。
/*大頁(yè)NAND Flash中ECC校驗(yàn)碼信息,OOB區(qū)為64字節(jié)*/
在進(jìn)一步深化大學(xué)英語(yǔ)教學(xué)改革的熱潮下,面對(duì)本科辦學(xué)歷史較短、辦學(xué)經(jīng)驗(yàn)不足、辦學(xué)條件也較有限的辦學(xué)實(shí)情,新升格本科院校的藝體類(lèi)本科大學(xué)英語(yǔ)教學(xué)改革所面臨的壓力和挑戰(zhàn)可想而知。但是,只要切實(shí)結(jié)合自身的辦學(xué)實(shí)情,嚴(yán)格遵循“分類(lèi)指導(dǎo)、因材施教”、“動(dòng)態(tài)分層”、“課程教學(xué)漸進(jìn)性、持續(xù)性和靈活性”等原則,將分類(lèi)分層教學(xué)模式與課程階段遞進(jìn)式教學(xué)模式、必修課程和選修課程有機(jī)結(jié)合,勇于實(shí)踐和創(chuàng)新,新升格本科院校就一定能開(kāi)辟出一條獨(dú)特的藝體類(lèi)本科大學(xué)英語(yǔ)教學(xué)之路,培養(yǎng)出新時(shí)期國(guó)家和社會(huì)所需要的藝體類(lèi)復(fù)合型人才。
static struct nand_ecclayout Yaffs2_ecclayout= {
.useecc= MTD_NANDECC_PLACE,
/*ECC的放置模式*/
.eccbytes=24, /*ECC字節(jié)數(shù)*/
.eccpos= { 40,41,……62,63 }
/*ECC校驗(yàn)碼在OOB區(qū)中的位置*/
.oobfree= {{2,38}} /*還可被自由使用OOB區(qū)域的開(kāi)始位置和長(zhǎng)度*/};
剛才在添加 “nand write[.Yaffs2]”命令的代碼中,調(diào)用了nand_write_skip_bad函數(shù),還要對(duì)其進(jìn)行相應(yīng)修改增加兩部分程序,一部分是為了計(jì)算正常數(shù)據(jù)區(qū)的長(zhǎng)度;另一部分是為了在寫(xiě)入一段數(shù)據(jù)后,數(shù)據(jù)指針能正確指向下一段數(shù)據(jù)。
(1)int nand_write_skip_bad (nand_info_t*nand,loff_t offset,size_t*length,u_char*buffer){
#if defined (CONFIG_CMD_NAND_YAFFS2)
/*得到正常數(shù)據(jù)區(qū)的長(zhǎng)度*/
if(nand->rw_oob==1)
{size_t oobsize=nand->oobsize;
size_t datasize=nand->writesize;
datapages= *length/ (datasize+oobsize);
*length=datapages*datasize;
left_to_write= *length;
#if!defined (CONFIG_M(jìn)TD_NAND_YAFFS2)
if(len_incl_bad== *length){
rval=nand_write(nand,offset,length,+buffer);
return rval; }
(2)/*使數(shù)據(jù)指針指向下一段數(shù)據(jù)*/
if(nand->rw_oob==1)
p_buffer+=write_size+ (write_size/nand->
writesiz*nand->+oobsize);else p_buffer+= write_size;
3.5.2 修改drivers/mtd/nand/nand_base.c文件
在上步中nand_write_skip_bad函數(shù)又對(duì)nand_write函數(shù)進(jìn)行了訪(fǎng)問(wèn),所以還要對(duì)nand_write函數(shù)進(jìn)行修改,添加對(duì)Yaffs2的支持。主要是添加兩部分代碼,一部分把正常數(shù)據(jù)與OOB區(qū)數(shù)據(jù)進(jìn)行分離;另一部分將寫(xiě)頁(yè)時(shí)的模式設(shè)置為MTD_OOB_RAW,使寫(xiě)頁(yè)時(shí)不再進(jìn)行ECC值的計(jì)算。因?yàn)楦鶕?jù)Yaffs2文件系統(tǒng)的特性,ECC的校驗(yàn)值已經(jīng)包含在了Yaffs2文件系統(tǒng)自帶的OOB區(qū)中,不能重寫(xiě)入。在此模式下,寫(xiě)入正常數(shù)據(jù)后會(huì)把OOB區(qū)緩存的數(shù)據(jù)寫(xiě)入NAND Flash的OOB區(qū)中。
nand_write函數(shù)在drivers/mtd/nand/nand_base.c文件中。
(1)static int nand_write (struct mtd_info*mtd,loff_t to,s ize_t len,size_t*retlen,const uint8_t*buf)
{ if(mtd->rw_oob==1)
{ size_t oobsize= mtd->oobsize;
/*mtd->oobsize是U-Boot初始化NAND Flash時(shí)得到的OOB區(qū)的大小,本系統(tǒng)中用的是三星K9K4G08U0M芯片OOB區(qū)為64字節(jié)*/
size_t datasize= mtd->writesize; /*NAND Flash頁(yè)大小2KB*/
uint8_t oobtemp [oobsize];/*臨時(shí) OOB區(qū)*/
datapages=len/(datasize); /*需用頁(yè)數(shù)/*
for(i=0;i< (datapages);i++)
/*把正常數(shù)據(jù)與OOB區(qū)數(shù)據(jù)進(jìn)行分離*/
{memcpy ((void*)oobtemp,(void*)(buf+datasize* (i+1)),oobsize);
memmove((void*)(buf+datasize* (i+1)),(void*)(buf+datasize* (i+1)+oobsize), (datapages- (i+1))* (datasize)+ (datapages-1)*oobsize);
…….. }}
(2)/*設(shè)置模式為MTD_OOB_RAW,使寫(xiě)頁(yè)時(shí)不再進(jìn)行ECC值的計(jì)算*/
chip->ops.mode=MTD_OOB_RAW/*模式設(shè)置*/
上述對(duì)U-Boot代碼的修改其實(shí)主要是通過(guò)修改U-Boot的NAND Flash讀寫(xiě)命令,添加讀寫(xiě)Yaffs2文件系統(tǒng)的命令,并對(duì)支持該命令的函數(shù)和被調(diào)用過(guò)的函數(shù)進(jìn)行相應(yīng)修改,針對(duì)大頁(yè)NAND Flash和Yaffs2文件系統(tǒng)的特點(diǎn)增加處理OOB區(qū)數(shù)據(jù)的功能,至此U-Boot已經(jīng)實(shí)現(xiàn)了對(duì)Yaffs2文件系統(tǒng)的支持。
對(duì)U-Boot重新編譯,生成新的U-Boot.bin文件并用JLink工具將其燒入NAND Flash后啟動(dòng)本系統(tǒng),在串口工具中能夠看到提示信息,輸入nand info命令可查看到NAND Flash的信息,說(shuō)明U-Boot識(shí)別出了NAND Flash。在U-Boot的命令行中輸入nand help命令,可以看到剛添加的命令nand write[.Yaffs2]addr off size,這樣就可以用它來(lái)下載Yaffs2文件系統(tǒng)了。
使用mkyaffs2image工具制作Yaffs2文件系統(tǒng),手工輸入燒寫(xiě)命令 Key2440>nand write.Yaffs2 0x30000000 0x50000 0x3625170,燒寫(xiě)完畢后會(huì)提示:
NAND write:device 0offset 0x50000,size 0x3625170 skip the first good block 0x3838600
Bad block at 0x1040000in erase block from 0x1040000 will be skipped
Bad block at 0x1060000in erase block from 0x1060000 will be skipped
……..
Writing data at 0x0x3838600-100%complete
52348128bytes written:OK
說(shuō)明Yaffs2文件系統(tǒng)已成功下載到NAND Flash中。
Yaffs2文件系統(tǒng)與大容量NAND Flash的結(jié)合,能夠加快文件系統(tǒng)的加載速度,實(shí)現(xiàn)錯(cuò)誤檢測(cè)、壞塊處理以及可靠地掉電保護(hù)。編譯和測(cè)試后的結(jié)果表明改進(jìn)后的UBoot可以將Yaffs2文件系統(tǒng)寫(xiě)入到大容量NAND Flash中,完善了U-Boot的文件燒寫(xiě)功能。改進(jìn)后的U-Boot已經(jīng)成功移植到正在開(kāi)發(fā)的工業(yè)用嵌入式手持設(shè)備中,這樣可以在大容量NAND Flash中使用Yaffs2文件系統(tǒng),為設(shè)計(jì)開(kāi)發(fā)人員帶來(lái)了方便,同時(shí)產(chǎn)品的性能也得到了提升,在嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程中具有實(shí)用價(jià)值。
[1]WU Yuxiang,ZHOU Jianxiang,GUO Jianxun.Porting and function expansion of U-boot based on S3C2410 [J].Computer Engineering and Design,2010,31 (14):729-732 (in Chinese). [吳玉香,周建香,郭建勛.U-Boot在S3C2410上的移植及功能擴(kuò)展 [J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31 (14):729-732.]
[2]Lech Józwiak,Nadia Nedjah,Miguel Figueroa.Modern development methods and tools for embedded reconfigurable systems:a survey[J].Integration the VLSI Journal,2010,43 (1):1-33.
[3]LI Qingcheng,SUN Mingda.Design of NAND flash memorybased embedded file system [J].Application Research of Computers,2006,23 (4):231-233.(in Chinese).[李慶誠(chéng),孫明達(dá).基于NAND型閃存的嵌入式文件系統(tǒng)設(shè)計(jì) [J].計(jì)算機(jī)應(yīng)用研究,2006,23 (4):231-233.]
[4]WEI Dongshan.Complete guide to embedded Linux application development[M].Beijing:Posts & Telecom Press,2008:283-287 (in Chinese).[韋東山.嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè) [M].北京:人民郵電出版社,2008:283-287.]
[5]Micron Company.Small block vs.large block NAND flash devices[EB/OL].[2007-01-20].http://www.micron.com.
[6]LI Jun.Detailed embedded Linux device driver development[M].Beijing:Posts & Telecom Press,2008:308-310 (in Chinese).[李俊.嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解 [M].北京:人民郵電出版社,2008:308-310.]
[7]CHUNG Taesun,PARK Dong joo,PARK Sangwon,et al.A survey of flash translation layer [J].Journal of Systems Architecture,2009,55 (5-6):332-343.
[8]ZHANG Jian,WANG Jin.Approach to protect data on taxcontrolled system with ucLinux [J].Computer Engineering and Design,2006,27 (16):3055-3057 (in Chinese). [張健,王錦.基于ucLinux稅控系統(tǒng)的數(shù)據(jù)保護(hù)方案設(shè)計(jì) [J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27 (16):3055-3057.]
[9]SUN Feng,ZHANG Fuxing.Resarch and improvement of YAFFS file system [J].Computer Engineering,2008,34(5):257-259 (in Chinese). [孫豐,張福新.YAFFS文件系統(tǒng)的 研 究 與 改 進(jìn) [J].計(jì) 算 機(jī) 工 程,2008,34 (5):257-259.]
[10]WEI Feng,LU Zaiqi,LIU Wei.Realization of YAFFS2in the embedded system [J].Modem Electronics Technique,2010,33 (8):30-34 (in Chinese). [韋峰,盧再奇,劉偉.YAFFS2在嵌入式系統(tǒng)中的實(shí)現(xiàn) [J].現(xiàn)代電子技術(shù),2010,33 (8):30-34.]
[11]LONG Yachun,HUANG Pu,WU Sheng.Create a YAFFS2 bases on super-large NAND flash in Linux [J].Journal of Beijing Electronic Science and Technology Institute,2007,15(2):80-84 (in Chinese).[龍亞春,黃璞,吳勝.超大容量NAND Flash文件系統(tǒng)—YAFFS2在Linux下的實(shí)現(xiàn) [J].北京電子科技學(xué)院學(xué)報(bào),2007,15 (2):80-84.]
[12]Wookey.YAFFS2specification and development notes [EB/OL].[2005-05-23].http://www.aleph1.co.uk/node/38.
[13]CAI Yong,PENG Fushi.Research on NAND flash system YAFFS [J].Journal of Zhengzhou University of Light Industry(Natural Science),2007,22 (6):54-58 (in Chinese).[蔡勇,彭福石.NAND閃存文件系統(tǒng)YAFFS的研究 [J].鄭州輕工業(yè)學(xué)院學(xué)報(bào) (自然科學(xué)版),2007,22 (6):54-58.]
[14]LEE Kiyong,KIM Hyojun,WOO Kyounggu,et al.Design and implementation of MLC NAND flash-based DBMS for mobile devices [J].Journal of Systems and Software,2009,82(9):1447-1458.
[15]LU Chihyuan,Hsieh Kuangyeu,LIU Rich.Future challenges of flash memory technologies [J].Microelectronic Engineering,2009,86 (3):283-286.
[16]The U-boot transplantation mini2440detailed manual [R].Guangzhou:Friendly Arm Technology Co Ltd,2010:75-79(in Chinese). [mini2440之 U-boot移植詳細(xì)手冊(cè) [R].廣州:友善之臂科技有限公司,2010:75-79.]