基于INTEL StrataFlash在VxWorks上構(gòu)建TrueFFS文件系統(tǒng)
修改tffsConfig.c文件,此文件一般存放在srcdrvtffs文件夾中,可以拷貝到BSP文件夾中,在 MTDidentifyRoutine mtdTable[]中把定義的宏INCLUDE_MTD_I28FJ3A和MTD識別函數(shù)關(guān)聯(lián)起來:
#ifdef INCLUDE_MTD_I28FJ3A
i28fj3aMtdIdentify,
#endif
系統(tǒng)在調(diào)用tffsdev()函數(shù)安裝flash的MTD驅(qū)動時會調(diào)用這個表項來查找并識別flash設(shè)備。
2 MTD驅(qū)動程序組成
在MTD驅(qū)動中,最重要的函數(shù)是i28fj3aMtdIdentify()函數(shù),可以把它看作是MTD的初始化函數(shù)。它負責(zé)讀取芯片制造商和設(shè)備的ID 號,INTEL公司的代碼是0x0089,28F320J3A的設(shè)備代碼是0x0016。然后對FLFlash結(jié)構(gòu)的成員進行初始化。FLFlash結(jié)構(gòu)定義在targethtffsFLFlash.h中:
typedef struct tFlash FLFlash;
struct tFlash {
FlashType type;
long erasableBlockSize;
long chipSize;
int noOfChips;
int interleaving;
int flags;
void *mtdVars;
FLSocket *socket;
void FAR0 *(*map)(FLFlash *, CardAddress, int);
FLStatus (*read)(FLFlash *, CardAddress, void FAR1 *, int, int);
FLStatus (*write)(FLFlash *, CardAddress, const void FAR1 *, int, int);
FLStatus (*erase)(FLFlash *, int, int);
void (*setPowerOnCallback)(FLFlash *);
};
其中,type指flash的設(shè)備類型;erasableBlockSize指flash可擦除塊的大小,單位為字節(jié);chipsize指flash存儲容量,單位為字節(jié);noOfChips指構(gòu)成flash存儲陣列的存儲器的片數(shù);interleaving指存儲陣列的交叉存取參數(shù),必須為2的整數(shù)冪,用于定義在一個存儲芯片上,兩個字節(jié)連續(xù)媒體的地址差異;socket是指向FLSocket結(jié)構(gòu)的指針,這個FLSocket結(jié)構(gòu)含有指向socket 層函數(shù)的指針和數(shù)據(jù)。當(dāng)注冊socket驅(qū)動時,該FLSocket結(jié)構(gòu)中涉及的函數(shù)將被安裝。
map是指向flash映射函數(shù)的指針,該函數(shù)將flash映射到內(nèi)存的一個區(qū)域。read是指向flash讀函數(shù)的指針。write是指向 flash寫函數(shù)的指針。erase是指向flash擦除函數(shù)的指針。setPowerOnCallback是指TFFS在flash設(shè)備上電后應(yīng)當(dāng)執(zhí)行一個函數(shù)以便掛接該設(shè)備,setPowerOnCallback成員就是指向這個函數(shù)的指針,許多flash存儲設(shè)備不需要此函數(shù)。
在MTD驅(qū)動中最重要的兩個函數(shù)是write和erase。write的過程一般是這樣的,寫入前首先要對扇區(qū)解鎖,如果是進行改寫,需要把待改寫扇區(qū)的數(shù)據(jù)讀出來,修改相應(yīng)的部分,然后擦除扇區(qū),接著再寫入寫命令,寫入數(shù)據(jù);如果是寫入空扇區(qū),直接寫命令、寫數(shù)據(jù)就可以了,最后判斷數(shù)據(jù)是否寫完。為了確保寫入成功,寫完數(shù)據(jù)后要進行數(shù)據(jù)的比較。對flash的erase操作是按照扇區(qū)進行的,擦除前首先要對扇區(qū)解鎖,然后寫入擦除建立和扇區(qū)擦除命令,擦除成功后,內(nèi)容應(yīng)為0xFFFF。為了確保擦除成功,擦完后也要進行數(shù)據(jù)比較。
當(dāng)VxWorks內(nèi)核支持TFFS文件系統(tǒng),在啟動時,usrRoot()函數(shù)將會調(diào)用tffsdev()進行TFFS設(shè)備初始化,調(diào)用tffsdev()的目的是注冊套接組件驅(qū)動程序。
在使用TFFS之前首先要調(diào)用tffsdevcreate()創(chuàng)建此設(shè)備,經(jīng)過一系列的調(diào)用,最后運行flidentifyflash(),這個函數(shù)按照 sysTffs.c中宏所指定的flash,調(diào)用識別函數(shù)i28fj3aMtdIdentify()進行識別,來確認究竟是那種flash接入了系統(tǒng),并向FLFLash數(shù)據(jù)結(jié)構(gòu)注冊MTD驅(qū)動中的讀、寫、擦除、映射等flash操作函數(shù)。
3 TFFS操作方法
在使用TFFS前,要用shell命令tffsDevFormat對flash設(shè)備進行格式化,并用usrTffsConfig命令把flash設(shè)備掛接上DOS設(shè)備名,接著就可以用此設(shè)備名對flash設(shè)備進行操作了。支持的命令包括:ls,copy,remove等常用命令。
還可以通過修改DEFAULT_BOOT_LINE中的參數(shù),將TFFS作為一個啟動設(shè)備。將boot device改為tffs=0,0 ,將file name 改為/tffs0/VxWroks,就可以把系統(tǒng)啟動起來了。
四 結(jié)論
在基于VxWorks的嵌入式系統(tǒng)中支持TrueFFS文件系統(tǒng),可以將VxWorks操作系統(tǒng)映像、應(yīng)用程序、系統(tǒng)配置等以文件的形式存放到flash 上,與系統(tǒng)的引導(dǎo)程序bootrom分開。這樣可以支持用戶的在線升級,當(dāng)應(yīng)用程序和系統(tǒng)配置需要更新時,直接以文件的形式拷貝到flash中就可以了,非常方便。當(dāng)然,支持TrueFFS文件系統(tǒng)是有少量存儲空間的開銷,但這和使用TrueFFS文件系統(tǒng)所獲得的好處相比是微乎其微的。本文作者的創(chuàng)新點是為新推出的Intel StrataFlash系列flash編寫了驅(qū)動程序,并在其上構(gòu)建了TrueFFS文件系統(tǒng)。
參考文獻
[1] VxWorks5.5Programmer’sGuide. WindRiver Systems,Inc
[2] Intel StrataFlash Memory(J3) Datasheet. Intel Corporation
[3] 王明飛,張效義,李鷗,邢明. VxWorks下MPC860的中斷處理機制及其應(yīng)用. 微計算機信息,2005,3:1~2頁
[4] 李方敏. 《VxWorks高級程序設(shè)計》. 清華大學(xué)出版社. 2004.5
[5] 陳智育,溫彥軍,陳琪. 《VxWorks程序開發(fā)實踐》. 人民郵電出版社. 2004.5
評論