新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > YAFFS2在嵌入式系統(tǒng)中的實現

YAFFS2在嵌入式系統(tǒng)中的實現

作者: 時間:2010-06-01 來源:網絡 收藏


表1說明了文件數據在NANDFLASH的備用空間內的存儲布局。


blockState:描述該塊的狀態(tài)。如果不是OxFF,就說明是壞塊。相對應的是,所有正常的塊,里面所有數據都是OxFF的。
chunkld:描述該頁在一個文件內的索引,所以文件大小被限制在232×2 KB。chunkld為O,說明此頁面保存的是文件頭。不為O,說明是數據頁面。文件內偏移量為0,即放在第一個頁面的文件,其chunkId為1,后面的以此類推。
ObjectID:描述對象ID號,用來惟一標示一個文件。所以文件支持的文件總數限制在232個。
nBytes:記錄該頁面內的有效字節(jié)數。
blockSequence:記錄著各塊被分配出去的先后順序,每分配出去一塊,就加1。在文件建立的時候,塊的掃描順序就是由它決定的,而不是FLASH的物理介質順序。在垃圾收集的時候也會以此作為參考之一,判斷該塊是否適合回收。
tagsEcc:Ecc,YAFFS Tags區(qū)域的ECC校驗數據。
ECC:數據區(qū)的ECC校驗數據。讀/寫數據區(qū)的數據時,每256 B生成3 B ECC校驗和,一頁面2 KB數據就會生成24 B的校驗數據。

3 系統(tǒng)移植
此次開發(fā)采用宿主機+目標系統(tǒng)的開發(fā)模式。宿主機為PC+Fedora9,Fedora9安裝在PC的虛擬機內。目標系統(tǒng)軟硬件組成為目標板(CPU為S3C2440A)+U-Boot+Linux,Linux版本為2.6.29.4。交叉編譯工具為arm-linux-gcc-4.3.2。
選用Linux系統(tǒng)是因為它有著技術上先進,健壯、安全;是多任務系統(tǒng),支持ARM體系結構;源碼開放,驅動程序及其他資源非常豐富,良好的可移植性等優(yōu)點。系統(tǒng)的移植從軟件角度可以分為以下四個步驟。如圖3所示。


(1)引導加載程序的移植,包括固化在固件(Fireware)中的boot代碼和Bootloader兩大部分。大多數嵌入式系統(tǒng)中并沒有固件,Bootlo-ader是上電后執(zhí)行的第一個程序。它主要用來初始化處理器及外設,然后調用Linux內核。
(2)嵌入式Linux內核移植。特定于嵌入式處理系統(tǒng)的定制內核以及內核的啟動參數。內核的啟動參數可以是內核默認的,或是由Bootlo-ader傳遞給它的。
(3)文件系統(tǒng)制作。包括根文件系統(tǒng)和建立于FLASH內存設備之上的文件系統(tǒng)。里面包含了Linux系統(tǒng)配置文件和運行應用軟件所需要的庫等。
(4)用戶應用程序編寫。特定于用戶的應用程序,它所的功能通常就是設計該嵌入式系統(tǒng)所要達到的目標,它們也存儲在文件系統(tǒng)內。
3.1 Bootloader移植
對于支持ARM架構的Bootloader有U-Boot,Vivi等。U-Boot(Universal Boot Loader)即通用Bootloader,是遵循GPL條款的開放源代碼項目。它可以引導Linux,VxWorks,LynxOS等多種操作系統(tǒng)。支持PowerPC,x86,ARM等多種架構的CPU,具有豐富的設備驅動源碼,如串口、以太網、SDRAM,FLASH等。系統(tǒng)采用U-Boot的版本為1.1.6,它已支持SMDK2410開發(fā)板,在其基礎上進行修改。U-Boot 1.1.6中對NAND FLASH的支持有新舊兩套代碼,新代碼在drivers/nand目錄下,舊代碼在driver/nand_legacy目錄下。本次移植選用新代碼,它移植自Lin-ux2.6.12,更加智能。移植過程分以下幾步。
(1)根據具體輸入時鐘,修改時鐘定義參數。SMDK2410開發(fā)板的默認時鐘為12 MHz。
(2)依照實際開發(fā)板的內存地址分配情況修改lowlevel init.S文件。
(3)針對S3C2410,S3C2440 NAND FLASH控制器的不同,修改接口參數。
(4)仿照內核支持NAND FLASH的文件來編寫片選函數。命令和控制函數,查詢狀態(tài)函數。
(5)根據具體NAND FLASH芯片設置時序參數。
(6)增加從NAND FLASH燒寫,讀取YAFFS2文件系統(tǒng)映像功能。
(7)修改Makefile文件,將新建文件編入U-Boot中。
在編寫燒寫YAFFS2文件系統(tǒng)映像的命令時,要注意YAFFS2文件系統(tǒng)映像里除了2 KB的數據外,后面還包括了64 B的OOB數據,所以映像文件大小是以2 112 B為單位。OOB中已經包含了ECC,在燒寫時不需要再計算ECC校驗碼。燒寫時,首先檢查是否為壞塊,是就跳過,然后寫入2 KB的數據,最后寫入64 B的OOB數據。還要增加對skipfirstblk參數的支持。使燒寫YAFFS2文件系統(tǒng)映像時,跳過分區(qū)上第一個塊,這是由YAFFS2文件系統(tǒng)特性決定的。
由于不使用ECC校驗碼,燒寫過程中會不斷提示以下信息:
Writing data without ECC to NAND-FLASH is not reeom-mended
可以修改driver/mtd/nand/nand base.C文件的nand_write_page函數,將輸出這條信息的命令去掉。
最后執(zhí)行make XX_config和make all命令,生成的U-Boot.bin文件即可以運行與目標板上了。將它燒入NOR FLASH后啟動,在串口工具中能夠看到提示信息。輸入nand info命令即可查看到NAND FLASH的信息,說明U-Boot識別出了NAND FLASH。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評論


相關推薦

技術專區(qū)

關閉