摘 要:PCM高速遙測數(shù)據(jù)發(fā)送卡是一款基于PCI接口芯片9054的PCM信號源,工作碼速率可達(dá)10 Mb/s。以在Windows 2000操作系統(tǒng)下設(shè)計(jì)PCM高速遙測數(shù)據(jù)發(fā)送卡的WDM驅(qū)動程序?yàn)槔?,介紹WDM驅(qū)動程序的基本特點(diǎn)和遙測數(shù)據(jù)發(fā)送卡的基本結(jié)構(gòu),詳細(xì)討論利用Driver Studio開發(fā)WDM驅(qū)動程序設(shè)計(jì)的關(guān)鍵技術(shù),如設(shè)備初始化、軟件FIFO、中斷處理和DMA操作等。
關(guān)鍵詞:PCI;WDM;I/O請求包(IRP);軟件FIFO
中圖分類號:TP311.52
文獻(xiàn)標(biāo)識碼:B
文章編號:1004—373X(2008)04—063—03
開發(fā)驅(qū)動程序的軟件主要有:MicroSoft公司的DDK,Jungo公司的Windriver和Compuware NuMega公司的Driver Studio三種。DDK是最基本的驅(qū)動程序開發(fā)工具,比較復(fù)雜,適于專業(yè)的驅(qū)動程序開發(fā)人員,不適于硬件開發(fā)人員開發(fā)驅(qū)動程序。Windriver開發(fā)驅(qū)動程序不需要熟悉操作系統(tǒng)內(nèi)核知識,針對硬件PCI/ISA/PCM—CIA/USB開發(fā)驅(qū)動程序比較方便,但驅(qū)動程序的效率不高、缺乏靈活性。Driver Studio把DDK用類的形式進(jìn)行封裝,簡化設(shè)備驅(qū)動程序的開發(fā),方便又不失靈活性。所以這里選擇Driver Studio作為驅(qū)動程序的開發(fā)工具。
在結(jié)合PCM高速遙測數(shù)據(jù)發(fā)送卡的基礎(chǔ)上,本文介紹WDM驅(qū)動程序的結(jié)構(gòu)特點(diǎn)和PCM高速遙測數(shù)據(jù)發(fā)送卡的硬件結(jié)構(gòu),并闡述針對數(shù)據(jù)發(fā)送卡的特點(diǎn),詳細(xì)地討論驅(qū)動程序關(guān)鍵部分的設(shè)計(jì)。
1 PCM遙測數(shù)據(jù)發(fā)送卡的硬件結(jié)構(gòu)
圖1為遙測數(shù)據(jù)發(fā)送卡的原理框圖。碼型變換器的功能是根據(jù)原始PCM數(shù)據(jù)產(chǎn)生3種輸出碼型:NRZ—L,NRZ—M及NRZ—S之一,以適應(yīng)更加廣泛的測試目的。多電平驅(qū)動器將來自FPGA的LV TTL電平的PCM數(shù)據(jù)和時(shí)鐘信號轉(zhuǎn)換為3種電平接口輸出,分別是TTL,EIA422及MLVDS。同步FIFO作為硬件數(shù)據(jù)幀緩存存儲由PCI總線寫入的數(shù)據(jù)幀,然后由序列生成器讀出。序列生成器根據(jù)PCM時(shí)鐘速率產(chǎn)生串行移出的PCM原始數(shù)據(jù)將來自FIFO的32位并行數(shù)據(jù)轉(zhuǎn)換為串行輸出,同時(shí)根據(jù)移位寄存器的狀態(tài)產(chǎn)生發(fā)向FIFO的讀數(shù)請求:
2 WDM驅(qū)動程序的結(jié)構(gòu)及特點(diǎn)
WDM(Windows Driver Model)是在原有的NT內(nèi)核模式驅(qū)動程序的基礎(chǔ)上發(fā)展來的,他增加了PnP(Plugand Play)、電源管理、WMI(Windows Management Instru—mentation)等功能。WDM模型的層次結(jié)構(gòu)如圖2所示。
層次結(jié)構(gòu)可以使I/O請求過程更加清晰。影響設(shè)備的每一個(gè)操作都使用I/O請求包(IRP),通常IRP被送到設(shè)備堆棧的最上層,然后逐漸過濾到下層驅(qū)動程序。每處理1個(gè)IRP,I/O管理器就調(diào)用1次StartIO例程,從而著手IRP處理工作;如何處理完全取決于具體的設(shè)備,調(diào)用驅(qū)動程序中相應(yīng)的例程。驅(qū)動程序處理完IRP后,會將結(jié)果返回給I/O管理器,再由I/O管理器返回給用戶應(yīng)用程序。
3 PCM遙測數(shù)據(jù)發(fā)送卡WDM驅(qū)動程序的設(shè)計(jì)
在設(shè)備的驅(qū)動程序設(shè)計(jì)中,需要處理PCI設(shè)備的硬件讀寫、中斷處理、DMA等功能??梢园羊?qū)動程序視為一個(gè)框架和若干例程的結(jié)合體,各個(gè)例程處理不同的IRP,而框架負(fù)責(zé)在IRP到來時(shí)調(diào)用相應(yīng)的例程。利用Driver—Works的驅(qū)動程序向?qū)?Driver Wizard)新建一個(gè)PCI設(shè)備驅(qū)動程序框架,然后在這個(gè)框架基礎(chǔ)上添加必要的實(shí)現(xiàn)功能的處理代碼,就可以完成整個(gè)驅(qū)動程序的設(shè)計(jì)。下面以PCM遙測數(shù)據(jù)發(fā)送卡為例討論其主要的功能驅(qū)動程序例程的實(shí)現(xiàn)。
3.1硬件初始化例程
OnStartDevice(KIrp I)參數(shù)例程中包含2種系統(tǒng)分配的資源配置信息:原始的資源配置信息(AllocatedRe—sources);轉(zhuǎn)換后的資源配置信息(AllocatedResourcesTranslated)。因?yàn)镮/O總線和CPU在尋址物理硬件的方式不同,所以存在2種資源列表。從注冊表、PCI配置空間和其他地方獲取原始的資源值和轉(zhuǎn)換這些值的操作全部由PnP管理器完成,WDM驅(qū)動程序需要做的僅是從設(shè)備啟動IRP中獲取這些資源。
3.2 中斷服務(wù)例程
中斷服務(wù)例程運(yùn)行在DIRQL級別上,需要盡可能快地運(yùn)行。本設(shè)計(jì)在中斷服務(wù)例程中,首先判斷中斷是否自己設(shè)備產(chǎn)生的,如果是,則調(diào)用一個(gè)在DISPATCH_LEV—EL級別上運(yùn)行的延遲過程調(diào)用(DPC)。當(dāng)中斷服務(wù)例程完成后,一旦處理器獲得DISPATH_LEVEI。運(yùn)行權(quán),就會運(yùn)行DPC。中斷服務(wù)例程流程圖如3所示。
3.3 中斷延遲調(diào)用例程
在延遲調(diào)用例程中,判斷中斷原因如果是DMA中斷就啟動DMA繼續(xù)發(fā)送。如果是發(fā)送通道中斷,則判斷通道號,并把相應(yīng)軟件FIFO里面的待發(fā)送數(shù)據(jù)傳送到硬件FIFO里。在此過程中需要檢查在將軟件FIFO中的數(shù)據(jù)寫入硬件FIFO中后,如果軟件FIFO已被讀空,則應(yīng)禁止通道中斷,否則通道中斷因?yàn)閮?yōu)先級高,會一直于有效狀態(tài),導(dǎo)致系統(tǒng)死鎖。而在用戶程序?qū)戃浖﨔IFO的處理函數(shù)中,檢查通道中斷,如果被禁止,則應(yīng)將新寫入軟件FIFO的數(shù)據(jù)讀取一部分寫入硬件FIFO中,然后開啟通道中斷。
3.4應(yīng)用程序與驅(qū)動程序的通信例程
DeviceControl(KIrp I)主要用于應(yīng)用程序與驅(qū)動程序之間的通信,如向硬件讀寫數(shù)據(jù)以及軟件FIFO的操作等。DevcieControl響應(yīng)用戶應(yīng)用程序DeviceloControl()發(fā)送的IRP,根據(jù)IOCTL代碼來判斷調(diào)用子處理函數(shù)PCI_9054_IOCTL_READ_Handler(I),PCI_9054_IOCTL_WRITE_Handler(I).DEV_IOCTL_TXI_FIFO_WRITE_Handler(I)分別完成對硬件的讀寫和軟件FIFO的寫操作。
3.5 DMA傳輸操作
硬件FIFO半滿時(shí)產(chǎn)生通道中斷,在DPC里,判斷是通道中斷,則初始化KDmaTransfer,然后調(diào)用OnD-maReady();在OnDmaReady()中啟動首次DMA傳輸,傳輸時(shí)發(fā)生中斷,在DPC中判斷是否DMA中斷,如果是,則調(diào)用Continue()再次啟動下次傳輸,至此全總數(shù)據(jù)傳輸完成。其流程圖如圖4所示。
4 驅(qū)動程序編譯、調(diào)試和安裝
當(dāng)驅(qū)動程序編寫完成后,必須在DDK環(huán)境下進(jìn)行編譯,執(zhí)行Rebuild aIl命令,編譯完成后生成*.sys文件和*.inf文件。調(diào)試工具使用Softlce,基本過程如下:
(1)使用Symbol Loader加載驅(qū)動程序*.nms文件,然后激活Softlee,設(shè)置斷點(diǎn)跟蹤調(diào)試;
(2)用Genint命令產(chǎn)生虛擬中斷測試,中斷服務(wù)例程;
(3)根據(jù)需要測試其他功能。驅(qū)動程序的安裝需要對DriverWizard生成的.INF文件進(jìn)行修改,安裝就是根據(jù)INF文件的信息,把編譯好的驅(qū)動程序拷貝到特定的目錄,并修改注冊表來注冊該驅(qū)動程序的參數(shù)。
5 結(jié) 語
本文編寫的驅(qū)動程序在以前的驅(qū)動程序基礎(chǔ)上,在驅(qū)動程序里增加一個(gè)相當(dāng)于二級緩存的軟件FIFO;有效地提高了數(shù)據(jù)的響應(yīng)速度,從而實(shí)現(xiàn)更高的數(shù)據(jù)發(fā)送速率;解決了以前在遙測數(shù)據(jù)發(fā)送碼速率較高情況下,出現(xiàn)數(shù)據(jù)幀不連續(xù)導(dǎo)致數(shù)據(jù)接收碼同步死鎖的現(xiàn)象。本文的驅(qū)動程序已成功的應(yīng)用于所開發(fā)的PCM高速遙測數(shù)據(jù)發(fā)送卡,與同期開發(fā)的PCM遙測數(shù)據(jù)接收卡進(jìn)行長時(shí)間的聯(lián)接調(diào)試。實(shí)踐證明他們可以在10 Mb/s的碼速率上可靠工作,而無死鎖或數(shù)據(jù)幀丟失現(xiàn)象。