對該對象進行初始化。在驅(qū)動的其它例程中就可以使用對象MemoryRangeForBase1調(diào)用該類的成員函數(shù)ind、inw、inb、outb、outw、outd來完成對PCI卡的Base1空間的DWORD、WORD和Byte的輸入輸出操作,在我們的設(shè)計中也就是對雙口存儲器的存取。
對于I/O端口的訪問也是相似的,只是使用KIoRange類。在設(shè)計中將Base0空間設(shè)定為端口映射的空間,這個空間實際上是對S5920操作寄存器組的映射。如S5920的輸出郵箱寄存器[5]偏移為0x0C,若要在S5920的郵箱數(shù)據(jù)線MD[0∶7]上輸出全1,則可以通過調(diào)用一個用Bsae0初始化的KIoRange對象m_IoPortRangeForBass0.outd(0x0C,0xFFFF);來實現(xiàn)。
(2)中斷處理
DriverStudio中使用KInterrupt類實現(xiàn)中斷地處理,主要調(diào)用其成員函數(shù)對中斷進行初始化,控制一個中斷服務(wù)程序和一個中斷之間連接和斷開。對于DriverWizard生成的框架,它在OnStartDevice(KIrp I)中對一個中斷對象調(diào)用了InitializeAndConnect();完成了中斷地初始化與連接,但是作為實際應(yīng)用,最好在OnStartDevice(KIrp I)中只作初始化,而在需要中斷服務(wù)的時候在PASSIVE-LEVEL級別上調(diào)用Connect()。
PCI的中斷是共享的,所以中斷服務(wù)程序必須迅速作出是否為自己板卡來的中斷地判定,如果是返回TRUE,否則返回FALSE,其處理的時間應(yīng)盡量地短,對于一些需要大量操作的工作,中斷服務(wù)程序會調(diào)用一個低于中斷服務(wù)程序DIRQL級別的延遲調(diào)用程序,在DISPATCH_LEVEL上完成處理,這個級別上限制較少,函數(shù)調(diào)用也相對比較方便。
(3)應(yīng)用程序與驅(qū)動程序之間的通信
應(yīng)用程序與驅(qū)動程序通信步驟為:應(yīng)用程序首先使用CreatFile函數(shù)打開設(shè)備,然后使用WriteFile、ReadFile、DeviceIoControl與驅(qū)動程序進行通信,最后在應(yīng)用程序退出前使用CloseHandle關(guān)閉設(shè)備。DeviceIoControl使用不同的IOCTL命令字來調(diào)用驅(qū)動中的不同程序,完成應(yīng)用程序與驅(qū)動程序的數(shù)據(jù)交換,驅(qū)動程序根據(jù)訪問方式的不同,使用不同的方式獲取應(yīng)用程序的輸入輸出緩沖區(qū)地址。
驅(qū)動程序與應(yīng)用程序的通信:當驅(qū)動程序獲取了特定事件發(fā)生時,有時需要將這一信息通知給應(yīng)用程序,主要的方法有2種:一種是使用DeviceIoControl進行異步通信,另一種是在應(yīng)用程序中創(chuàng)建一個事件,并將該句柄傳給驅(qū)動程序,然后在應(yīng)用層開啟一個線程等待這個事件,驅(qū)動程序會在事件發(fā)生的時候設(shè)置事件信號狀態(tài)來觸發(fā)應(yīng)用程序。
實際上使用IOCTL方法只是應(yīng)用程序與驅(qū)動程序共享內(nèi)存的一種方法,而且是在應(yīng)用程序中分配共享內(nèi)存空間。共享內(nèi)存另外還有2種方法[4]:其一是MmMapLockedPages方法,它是由驅(qū)動程序通過MmAllocateContiguousMemory函數(shù)分配內(nèi)存,創(chuàng)建并建立描述緩沖區(qū)MDL,再使用MmMapLockedPages把內(nèi)存映射到用戶進程地址空間中,用戶的應(yīng)用程序就可以使用MmMapLockPages返回的虛擬地址直接訪問系統(tǒng)內(nèi)存,由于要在訪問內(nèi)存的進程上下文中完成映射,所以只適用于單層結(jié)構(gòu)的驅(qū)動,同時要設(shè)定相應(yīng)的保護機制,以保證驅(qū)動與應(yīng)用程序的訪問同步;其二是共享內(nèi)存對象方法,驅(qū)動程序創(chuàng)建命名內(nèi)存對象(section),一個或多個應(yīng)用程序使用OpenFileMapping打開以上的對象,然后調(diào)用MapViewOfFile函數(shù)得到指向它的指針;相對應(yīng)的應(yīng)用程序可以使用CreateFileMapping在用戶模式下創(chuàng)建命名內(nèi)存對象,驅(qū)動程序通過ZwOpenSection函數(shù),并調(diào)用ZwMapViewOfSection得到其指針來打開內(nèi)存對象,應(yīng)當使用異常處理程序在核心模式中訪問該地址。
在實際應(yīng)用中,我們使用IOCTL方法的METHOUD_OUT_DIRECT和METHOUD_IN_DIRECT方式完成大塊數(shù)據(jù)的加載與讀取。MmMapLockedPages方法使用時相對復(fù)雜一些,我們在驅(qū)動中開辟了一塊非分頁內(nèi)存,用來存放從信號處理板上獲取的板卡工作狀態(tài)信息和目標軌跡信息,由驅(qū)動程序?qū)崟r更新,應(yīng)用程序可以通過驅(qū)動返回的虛擬地址在需要的時候訪問這塊共享內(nèi)存。
四、結(jié)束語
基于上述的硬件結(jié)構(gòu)與驅(qū)動程序設(shè)計方法,已成功開發(fā)了一塊較為通用的PCI接口卡,并在某型雷達模擬器的數(shù)據(jù)加載、命令控制和系統(tǒng)監(jiān)控中得到了很好的應(yīng)用,板卡工作正常,達到了預(yù)期的效果。隨著科學(xué)技術(shù)的發(fā)展,已經(jīng)生產(chǎn)出更多的高性能PCI專用芯片,PCI規(guī)范也有了新的發(fā)展,PCI-X 1066規(guī)范標準將允許采用1 066 Mtransfer/s(兆次轉(zhuǎn)換/秒),對于緊湊型PCI系列網(wǎng)路底板(CompactPCI Serial Mesh Backplane,簡稱CSMB)2.20版本,新的CSMB規(guī)范標準的目標著眼于增加底板的數(shù)據(jù)傳輸能力,使之能達到700 Gbit/s以上,支持多路同步傳輸議定和隧道協(xié)定(tunneling protocol)。在目前,從速率與成本的綜合考慮,PCI接口卡作為計算機與外設(shè)的傳輸橋梁是具有很強的實用價值和廣闊的應(yīng)用空間。
參考文獻
[1]李貴山.PCI局部總線開發(fā)者指南[M].西安:西安電子科技大學(xué)出版社,1997.143~144,146~154.
[2]馮博琴,等.Microsoft Corporation.windows2000驅(qū)動程序開發(fā)大全[M].北京:機械工業(yè)出版社,2001.218~236.
[3]武安河,邰銘,于洪濤.Windows2000/XP WDM設(shè)備驅(qū)動程序開發(fā)[M].北京:電子工業(yè)出版社,200375~85.
[4]Open System Resource. Sharing Memory Between Drivers and Applications(updated 2002)[Z].
[5]AMCC Applied Micro Circuits Corporation PCI Product Data book 2000[Z].





