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