PCI總線(xiàn)電機控制卡的WDM設備驅動(dòng)程序設計
摘要:結合基于PCI總線(xiàn)的精密電機運動(dòng)控制卡,介紹了PCI設備的WDM設備驅動(dòng)程序的設計過(guò)程,PCI設備的獲得,I/O端口的讀寫(xiě),內存的讀寫(xiě)以及中斷的處理,和設備驅動(dòng)程序的安裝。
本文引用地址:http://dyxdggzs.com/article/149064.htm1引言
微型計算機界以INTEL公司為主推出了PCI總線(xiàn)規范。采用PCI總線(xiàn)設備所具有的配置空間以及PCI總線(xiàn)通過(guò)橋接電路與CPU相連的技術(shù)使PCI總線(xiàn)具有廣泛的適應性,并且PCI總線(xiàn)采用寬字節和高達33Mb的時(shí)鐘頻率的猝發(fā)和主控方式傳輸能滿(mǎn)足高速設備的要求。
在WINDOWS操作系統下,開(kāi)發(fā)PCI設備的驅動(dòng)程序最好的方案是WDM驅動(dòng)程序。在一個(gè)系統中開(kāi)發(fā)出WDM驅動(dòng)程序,稍加修改即可在其他系統中編譯運行。お
2WINDOWS驅動(dòng)程序模型WDM
WDM(WINDOWSDriverProgramModel)是一個(gè)模塊化的、分層次類(lèi)型的微型驅動(dòng)程序結構,它是編寫(xiě)設備驅動(dòng)程序的主要模型。設備驅動(dòng)程序是提供連接到計算機的硬件的軟件接口,它是操作系統的一部分,用戶(hù)應用程序以一種規范的方式訪(fǎng)問(wèn)硬件,而不必考慮必須如何控制硬件。在WINDOWS中,驅動(dòng)程序總是使設備看起來(lái)像是一個(gè)文件,可以打開(kāi)設備的一個(gè)句柄,然后應用程序可以在設備句柄最后關(guān)閉之前向驅動(dòng)程序發(fā)出讀寫(xiě)請求。WDM是在WindowsNT驅動(dòng)程序體系的基礎上發(fā)展而來(lái)的,修改或增加了即插即用、電源管理等功能,使之適應硬件和用戶(hù)的要求。
PCI總線(xiàn)是一種高性能、與CPU無(wú)關(guān)的32/64位地址數據復用的總線(xiàn),它支持突發(fā)傳輸、即插即用、電源管理等功能,不但能滿(mǎn)足現在的應用需要,而且能夠適應未來(lái)的需求。PCI總線(xiàn)支持硬件資源動(dòng)態(tài)自動(dòng)配置,以支持即插即用。在PCI設備插入PCI插槽或上電后,PCI總線(xiàn)配置機構自動(dòng)根據PCI設備的要求實(shí)現配置。PCI總線(xiàn)支持內存讀寫(xiě)、I/O端口讀寫(xiě)、中斷機制和DMA功能。由于這些硬件特點(diǎn)使PCI設備的WDM驅動(dòng)程序的設計變得很復雜。在開(kāi)發(fā)WDM驅動(dòng)程序之前,還有必須掌握PCI設備的需要分配的資源等配置信息以及PCI設備的功能和操作方法。
在WDM中,采用了分層的驅動(dòng)程序體系結構,總線(xiàn)驅動(dòng)程序或類(lèi)驅動(dòng)程序在最底層直接與設備打交道,設備功能驅動(dòng)程序在上層通過(guò)與低層驅動(dòng)程序打交道,實(shí)現設備的功能,中間還可以有類(lèi)過(guò)濾驅動(dòng)程序或設備過(guò)濾驅動(dòng)程序用于數據的過(guò)濾或轉換。在PCI總線(xiàn)的驅動(dòng)程序層中,其層次圖如圖1所示:

在PCI設備的WDM驅動(dòng)程序中,一般是編寫(xiě)功能驅動(dòng)程序。PCI總線(xiàn)驅動(dòng)程序由操作系統實(shí)現,過(guò)濾驅動(dòng)程序一般在特殊的情況下需要編寫(xiě)。因此本文只討論PCI設備功能驅動(dòng)程序的設計。在PCI設備功能驅動(dòng)程序中,需要處理PCI設備的內存、端口的讀寫(xiě)、中斷處理和DMA數據傳輸,實(shí)現PCI設備的功能,因此,PCI設備功能驅動(dòng)程序是很標準的WDM設備驅動(dòng)程序。お
3PCI設備資源的獲得及內存、I/O讀寫(xiě)
PCI設備的硬件資源是由PCI配置機構動(dòng)態(tài)分配的,由PCI設備實(shí)現PCI配置寄存器,提出需要分配的硬件資源,由PCI配置機構分配資源。驅動(dòng)程序需要取得這些資源,才能操作硬件。因此,PCI設備的硬件資源分配與管理是驅動(dòng)程序中很重要的部分。硬件資源主要包括映射內存空間、I/O空間、中斷。當系統的PNP管理器在取得設備的資源后會(huì )自動(dòng)向驅動(dòng)程序發(fā)出IRP_MN_START_DEVICE的IRP,在該IRP棧中包含了設備的資源信息。好的驅動(dòng)程序都應該使用這種方法,每個(gè)支持PNP功能的驅動(dòng)程序,都應實(shí)現IRP_MN_START_DEVICE處理。在該IRP處理中應先交給低層驅動(dòng)程序處理后,再根據IRP棧內內容進(jìn)行資源分配。
在PCI設備的驅動(dòng)程序中,獲得的設備內存是一段映射物理內存,這是無(wú)法使用的,需要將其映射成系統可以訪(fǎng)問(wèn)的非分頁(yè)內存。函數MmMapIoSpace完成該功能。該函數的原型為:

參數PhysicalAddress為物理地址;NumberOfBytes為地址的數量;CacheEnable為內存是否可以隱藏,取值可為MmNonCached,MmCached,MmWriteCombined,這里必須取為MmNonCached。

在PC上,I/O空間是一個(gè)64K字節的尋址空間。I/O端口的尋址方式與內存是不一樣的。但是在WDM驅動(dòng)程序中,對其處理與內存是一樣的,把其看作寄存器,映射為設備內存。其映射方法和訪(fǎng)問(wèn)函數的用法與內存資源一樣,只不過(guò)函數XXXREGISTERXXX改為XXXPORTXXX。お
4中斷的處理
在PCI總線(xiàn)中,很多設備共享一個(gè)中斷,這就需要在中斷處理函數要格外小心,處理不當,就會(huì )導致系統崩潰。驅動(dòng)程序首先要在IRPMNSTARTDEVICE中獲得中斷資源,然后需要連接到中斷處理函數中,使其當有中斷請求時(shí),進(jìn)入中斷服務(wù)例程。連接中斷的函數為IoConnectInterrupt,具體用法見(jiàn)上段程序中的“中斷資源”部分。十分需要注意的是在連接中斷之前,一定要確定PCI設備不會(huì )產(chǎn)生中斷請求,最好在PCI設備上電后,中斷為屏蔽狀態(tài)。在連接中斷后,調用開(kāi)啟中斷請求的函數需要同步處理,以防在函數的執行中,出現運行時(shí)間上的錯誤,而且在開(kāi)啟中斷時(shí),一定要在所有的硬件資源分配以后,否則如果有中斷產(chǎn)生,系統就會(huì )立即調用中斷處理例程,如果例程中使用了還沒(méi)有分配的資源,就會(huì )出現意想不到的結果。
在中斷服務(wù)例程中,相應的處理最好簡(jiǎn)潔快速,因為中斷例程運行的級別很高,當有中斷請求時(shí),不但會(huì )打斷應用程序的執行,而且會(huì )打斷在硬件中斷級以下的所有運行程序。在WDM中,提供了DPC(DeferredProcedureCall)例程,將在中斷例程中耗時(shí)的但不需要立即處理的任務(wù)延時(shí)處理。比如,驅動(dòng)程序接受應用程序的寫(xiě)PCI設備的數據,當寫(xiě)完后,硬件產(chǎn)生中斷標志執行完畢,這時(shí)需要結束該IRP,就可以將結束IRP這個(gè)耗時(shí)的任務(wù)交給DPC完成。
在該實(shí)例中,由應用程序調用函數WriteFile,將數據傳遞給驅動(dòng)程序,驅動(dòng)程序的DispatchWrite例程負責處理該IRP,在該例程中,由于需要中斷的配合,假定無(wú)法立即執行完畢,必須將IRP串行化,StartIo例程如果沒(méi)有其他任務(wù),就開(kāi)始處理該IRP,處理完畢后立即返回,但不能結束IRP,當PCI設備完成操作后,就會(huì )產(chǎn)生中斷,在中斷服務(wù)例程中把IRP交給DPC,在DPC中處理完后結束該IRP。お
評論