摘 要:PCM高速遙測數據發送卡是一款基于PCI接口芯片9054的PCM信號源,工作碼速率可達10 Mb/s。以在Windows 2000操作系統下設計PCM高速遙測數據發送卡的WDM驅動程序為例,介紹WDM驅動程序的基本特點和遙測數據發送卡的基本結構,詳細討論利用Driver Studio開發WDM驅動程序設計的關鍵技術,如設備初始化、軟件FIFO、中斷處理和DMA操作等。
關鍵詞:PCI;WDM;I/O請求包(IRP);軟件FIFO
中圖分類號:TP311.52
文獻標識碼:B
文章編號:1004—373X(2008)04—063—03
開發驅動程序的軟件主要有:MicroSoft公司的DDK,Jungo公司的Windriver和Compuware NuMega公司的Driver Studio三種。DDK是最基本的驅動程序開發工具,比較復雜,適于專業的驅動程序開發人員,不適于硬件開發人員開發驅動程序。Windriver開發驅動程序不需要熟悉操作系統內核知識,針對硬件PCI/ISA/PCM—CIA/USB開發驅動程序比較方便,但驅動程序的效率不高、缺乏靈活性。Driver Studio把DDK用類的形式進行封裝,簡化設備驅動程序的開發,方便又不失靈活性。所以這里選擇Driver Studio作為驅動程序的開發工具。
在結合PCM高速遙測數據發送卡的基礎上,本文介紹WDM驅動程序的結構特點和PCM高速遙測數據發送卡的硬件結構,并闡述針對數據發送卡的特點,詳細地討論驅動程序關鍵部分的設計。
1 PCM遙測數據發送卡的硬件結構
圖1為遙測數據發送卡的原理框圖。碼型變換器的功能是根據原始PCM數據產生3種輸出碼型:NRZ—L,NRZ—M及NRZ—S之一,以適應更加廣泛的測試目的。多電平驅動器將來自FPGA的LV TTL電平的PCM數據和時鐘信號轉換為3種電平接口輸出,分別是TTL,EIA422及MLVDS。同步FIFO作為硬件數據幀緩存存儲由PCI總線寫入的數據幀,然后由序列生成器讀出。序列生成器根據PCM時鐘速率產生串行移出的PCM原始數據將來自FIFO的32位并行數據轉換為串行輸出,同時根據移位寄存器的狀態產生發向FIFO的讀數請求:

2 WDM驅動程序的結構及特點
WDM(Windows Driver Model)是在原有的NT內核模式驅動程序的基礎上發展來的,他增加了PnP(Plugand Play)、電源管理、WMI(Windows Management Instru—mentation)等功能。WDM模型的層次結構如圖2所示。
層次結構可以使I/O請求過程更加清晰。影響設備的每一個操作都使用I/O請求包(IRP),通常IRP被送到設備堆棧的最上層,然后逐漸過濾到下層驅動程序。每處理1個IRP,I/O管理器就調用1次StartIO例程,從而著手IRP處理工作;如何處理完全取決于具體的設備,調用驅動程序中相應的例程。驅動程序處理完IRP后,會將結果返回給I/O管理器,再由I/O管理器返回給用戶應用程序。

3 PCM遙測數據發送卡WDM驅動程序的設計
在設備的驅動程序設計中,需要處理PCI設備的硬件讀寫、中斷處理、DMA等功能。可以把驅動程序視為一個框架和若干例程的結合體,各個例程處理不同的IRP,而框架負責在IRP到來時調用相應的例程。利用Driver—Works的驅動程序向導(Driver Wizard)新建一個PCI設備驅動程序框架,然后在這個框架基礎上添加必要的實現功能的處理代碼,就可以完成整個驅動程序的設計。下面以PCM遙測數據發送卡為例討論其主要的功能驅動程序例程的實現。
3.1硬件初始化例程
OnStartDevice(KIrp I)參數例程中包含2種系統分配的資源配置信息:原始的資源配置信息(AllocatedRe—sources);轉換后的資源配置信息(AllocatedResourcesTranslated)。因為I/O總線和CPU在尋址物理硬件的方式不同,所以存在2種資源列表。從注冊表、PCI配置空間和其他地方獲取原始的資源值和轉換這些值的操作全部由PnP管理器完成,WDM驅動程序需要做的僅是從設備啟動IRP中獲取這些資源。

3.2 中斷服務例程
中斷服務例程運行在DIRQL級別上,需要盡可能快地運行。本設計在中斷服務例程中,首先判斷中斷是否自己設備產生的,如果是,則調用一個在DISPATCH_LEV—EL級別上運行的延遲過程調用(DPC)。當中斷服務例程完成后,一旦處理器獲得DISPATH_LEVEI。運行權,就會運行DPC。中斷服務例程流程圖如3所示。
3.3 中斷延遲調用例程
在延遲調用例程中,判斷中斷原因如果是DMA中斷就啟動DMA繼續發送。如果是發送通道中斷,則判斷通道號,并把相應軟件FIFO里面的待發送數據傳送到硬件FIFO里。在此過程中需要檢查在將軟件FIFO中的數據寫入硬件FIFO中后,如果軟件FIFO已被讀空,則應禁止通道中斷,否則通道中斷因為優先級高,會一直于有效狀態,導致系統死鎖。而在用戶程序寫軟件FIFO的處理函數中,檢查通道中斷,如果被禁止,則應將新寫入軟件FIFO的數據讀取一部分寫入硬件FIFO中,然后開啟通道中斷。
3.4應用程序與驅動程序的通信例程
DeviceControl(KIrp I)主要用于應用程序與驅動程序之間的通信,如向硬件讀寫數據以及軟件FIFO的操作等。DevcieControl響應用戶應用程序DeviceloControl()發送的IRP,根據IOCTL代碼來判斷調用子處理函數PCI_9054_IOCTL_READ_Handler(I),PCI_9054_IOCTL_WRITE_Handler(I).DEV_IOCTL_TXI_FIFO_WRITE_Handler(I)分別完成對硬件的讀寫和軟件FIFO的寫操作。
3.5 DMA傳輸操作
硬件FIFO半滿時產生通道中斷,在DPC里,判斷是通道中斷,則初始化KDmaTransfer,然后調用OnD-maReady();在OnDmaReady()中啟動首次DMA傳輸,傳輸時發生中斷,在DPC中判斷是否DMA中斷,如果是,則調用Continue()再次啟動下次傳輸,至此全總數據傳輸完成。其流程圖如圖4所示。

4 驅動程序編譯、調試和安裝
當驅動程序編寫完成后,必須在DDK環境下進行編譯,執行Rebuild aIl命令,編譯完成后生成*.sys文件和*.inf文件。調試工具使用Softlce,基本過程如下:
(1)使用Symbol Loader加載驅動程序*.nms文件,然后激活Softlee,設置斷點跟蹤調試;
(2)用Genint命令產生虛擬中斷測試,中斷服務例程;
(3)根據需要測試其他功能。驅動程序的安裝需要對DriverWizard生成的.INF文件進行修改,安裝就是根據INF文件的信息,把編譯好的驅動程序拷貝到特定的目錄,并修改注冊表來注冊該驅動程序的參數。
5 結 語
本文編寫的驅動程序在以前的驅動程序基礎上,在驅動程序里增加一個相當于二級緩存的軟件FIFO;有效地提高了數據的響應速度,從而實現更高的數據發送速率;解決了以前在遙測數據發送碼速率較高情況下,出現數據幀不連續導致數據接收碼同步死鎖的現象。本文的驅動程序已成功的應用于所開發的PCM高速遙測數據發送卡,與同期開發的PCM遙測數據接收卡進行長時間的聯接調試。實踐證明他們可以在10 Mb/s的碼速率上可靠工作,而無死鎖或數據幀丟失現象。