如圖1所示,DOC2000由系統(tǒng)接口單元(System Interface)、系統(tǒng)引導(dǎo)模塊(Boot Block)、錯(cuò)誤檢測(cè)與更正單元(EDC/ECC),閃存控制單元(Flash Control)以及Flash存儲(chǔ)介質(zhì)組成。其中系統(tǒng)接口單元為DOC2000提供一個(gè)類SRAM 接口,使之能通過CPU的本地總線、ISA總線、SRAM 總線、EEPROM 接口建立與操作系統(tǒng)的連接。DOC提供片選信號(hào)(CE#)、讀寫信號(hào)(WE#)、使能信號(hào)(OE#)以及13位寬的地址線(A[0:12])和8位寬的數(shù)據(jù)總線(D[0:7])。每個(gè)DOC占用系統(tǒng)8K的地址空間,通過地址窗的滑動(dòng)來訪問整個(gè)DOC空間。系統(tǒng)引導(dǎo)模塊用來響應(yīng)PC機(jī)結(jié)構(gòu)中BIOS擴(kuò)展設(shè)備的搜索。當(dāng)BIOS檢測(cè)到DOC2000為擴(kuò)展設(shè)備時(shí),它可以執(zhí)行保存在系統(tǒng)引導(dǎo)模塊中的TrueFFS的驅(qū)動(dòng)程序,通過系統(tǒng)調(diào)用TrueFFS格式轉(zhuǎn)換軟件,系統(tǒng)可以把DOC2000映射為普通的硬盤從而方便地進(jìn)行讀寫。DOC2000的錯(cuò)誤檢測(cè)和更正模塊用來提供數(shù)據(jù)錯(cuò)誤的檢測(cè)、更正以及數(shù)據(jù)保護(hù)。Flash控制模塊主要用來完成TrueFFS地址與Flash介質(zhì)地址之間的轉(zhuǎn)換、數(shù)據(jù)傳輸控制等功能。
2 電子盤設(shè)備驅(qū)動(dòng)程序的基本結(jié)構(gòu)流程
在VxWorks下,設(shè)備驅(qū)動(dòng)程序既可以嵌入內(nèi)核隨系統(tǒng)一起啟動(dòng),也可以作為可加載模塊在系統(tǒng)啟動(dòng)之后運(yùn)行。
2.1可選加載方式
可選加載方式驅(qū)動(dòng)電子盤是一種比較常用的方式。它是把驅(qū)動(dòng)程序制作成一個(gè)可獨(dú)立運(yùn)行的應(yīng)用程序,當(dāng)需要的時(shí)候可以選擇加載到用戶程序集中。利用可選加載方式驅(qū)動(dòng)電子盤的第一步是要確定電子盤所占用的系統(tǒng)地址窗的范圍。一般主機(jī)板都給出了幾個(gè)可以選擇的范圍,通過跳線可以設(shè)置電子盤的地址窗的起始、結(jié)束地址。啟動(dòng)VxWorks下TrueFFS驅(qū)動(dòng)程序,根據(jù)實(shí)際的地址將地址窗參數(shù)配置好。第二步將TrueFFS映射成DOS文件系統(tǒng)。調(diào)用tffsMakeHandle()函數(shù)得到驅(qū)動(dòng)器的描述符。將此描述符傳遞給驅(qū)動(dòng)器句柄。然后定義一個(gè)塊設(shè)備的指針用于保存一個(gè)虛擬DOS文件系統(tǒng)分區(qū)的信息。調(diào)用tffsDevCreate()函數(shù)將剛才檢測(cè)到句柄的TrueFFS驅(qū)動(dòng)器映射成DOS文件系統(tǒng)分區(qū),并將該函數(shù)的返回值傳遞給定義好的塊設(shè)備指針。至此,就完成了TrueFFS到DOSFS的映射過程。完成DOSFS設(shè)備初始化后,在Tornado的Shell環(huán)境下運(yùn)行devs命令就可以看到tffs設(shè)備已經(jīng)在系統(tǒng)設(shè)備列表中了。第三步,讀寫電子盤上的文件。設(shè)置好要讀寫的文件的文件名、路徑。利用標(biāo)準(zhǔn)C++的文件系統(tǒng)函數(shù)就可以方便的讀寫文件了。
2.2嵌入系統(tǒng)方式
嵌入系統(tǒng)方式比可選加載方式要復(fù)雜。它將驅(qū)動(dòng)程序嵌入系統(tǒng)內(nèi)核中,這樣電子盤可以在系統(tǒng)啟動(dòng)的時(shí)候被驅(qū)動(dòng)。這種方式主要應(yīng)用于系統(tǒng)引導(dǎo)文件放在電子盤上的情況。嵌入系統(tǒng)方式又分為X86機(jī)的嵌入方式和其它(如PowerPC,MIPs等)嵌入方式。這里以X86方式為例。
第一步修改目標(biāo)BSP目錄下的config.h文件,增加電子盤設(shè)備的定義,修改引導(dǎo)設(shè)備。第二步修改系統(tǒng)BSP目錄下的bootconfig.C文件,將電子盤的驅(qū)動(dòng)程序加入。第三步修改系統(tǒng)BSP目錄下的usrconfig.h文件,調(diào)用電子盤的驅(qū)動(dòng)程序。
3 設(shè)備驅(qū)動(dòng)程序示例
下面給出DOC2000的可選加載方式的驅(qū)動(dòng)程序的框架代碼,嵌入系統(tǒng)方式下的DOC2000的驅(qū)動(dòng)程序涉及VxWorks系統(tǒng)內(nèi)核,這里不作詳細(xì)敘述。
3.1定義頭文件、常量、全局變量
#include "fldrvvxw.h"
#include "dosFsLib.h"
long tfsAddresses[2]={0xd8000,0xdfff};
/*定義電子盤的地址窗范圍*/
int iSocket=0;
/*TrueFFS內(nèi)部變量*/
int iDisk=0; /*電子盤數(shù)量(1個(gè))*/
nt handle; /*驅(qū)動(dòng)器句柄*/
nt flags=0;
/*將TrueFFS仿真成DOS FAT16的格式*/
BLK_DEV * tffs_blk_dev; /*塊設(shè)備指針*/
char FilePath[50]="/tffs0/test.txt"; /*文件路徑*/
File fp; /*文件指針*/
3.2 驅(qū)動(dòng)電子盤并將TrueFFS映射為DOSFS
DOCDriver()
{
tfsSetup(1,tfsAddresses); /*TrueFFS驅(qū)動(dòng)程序*/
handle= tfsMakeHandle(iSocket,iDisk);
/{得到驅(qū)動(dòng)器的句柄{/
tfs_ blk_dev=tfsDevCreate(handle,flags);
/*得到仿真DOSFS的塊設(shè)備信息*/
dosFsInit (20);
/*初始化DOSFS的參數(shù)*/
dosFsDevInit ("/tfs0/",tffs_blk_dev,NULL); /*初始化DOSFS設(shè)備*/
taskDelay(sysClkRateGet()/2); /*系統(tǒng)延時(shí)*/
}
3.3 電子盤文件的讀寫
FileReadWrite()
{
fp=fopen(FilePath,"r+");
…… /*相關(guān)文件操作*/
fclose(fp);
}





