PCI驅動(dòng)程序開(kāi)發(fā)實(shí)例
3.1 打開(kāi)設備
在應用程序中調用系統提供的函數CreateFile()。如果系統根據設備名確實(shí)檢測到設備并成功打開(kāi)了這個(gè)設備,則返回一個(gè)指向這個(gè)設備的有效句柄;如果調用失敗,則返回一個(gè)錯誤信息。
3.2 讀/寫(xiě)設備
讀/寫(xiě)設備包括讀/寫(xiě)設備的配置空間、讀/寫(xiě)設備的非配置空間,其中,非配置空間包括I/O空間、存儲空間。
設備被打開(kāi)以后,應用程序就調用DeviceloCon-trol()函數來(lái)達到訪(fǎng)問(wèn)設備的目的。DeviceIoControl()函數有8個(gè)參數,其中第3個(gè)參數是應用程序傳遞給驅動(dòng)程序的數據緩沖區地址,在這個(gè)數據緩沖區存放的是應用程序要讀寫(xiě)的設備的空間、偏移量、長(cháng)度,這些都需要在應用程序中配置好。
這個(gè)調用由I/O系統服務(wù)接收。I/O管理器從這個(gè)請求構造一個(gè)合適的I/O請求包(IRP)。在最簡(jiǎn)單的情況下,I/O管理器只是把IRP傳遞給一個(gè)設備驅動(dòng)程序,這個(gè)驅動(dòng)程序調用硬件,并完成IRP的處理。I/O管理器把數據和結果返回給Win 32和用戶(hù)應用程序?,F在一個(gè)分層的設備驅動(dòng)程序棧是很常見(jiàn)的。每個(gè)驅動(dòng)程序把該請求劃分為更簡(jiǎn)單的請求。高層次的驅動(dòng)程序調用低層次的驅動(dòng)程序,最后,最低層的驅動(dòng)程序與硬件直接打交道完成用戶(hù)的請求。I/O管理器把數據和結果返回給Win 32和用戶(hù)應用程序。設備程序調用如圖3所示。
當應用程序讀/寫(xiě)設備時(shí),驅動(dòng)程序工作的流程圖如圖4所示。
首先,獲取當前IRP棧單元的指針;然后再讀取I/O控制代碼,判斷應用程序想達到什么樣的目的:是讀/寫(xiě)配置空間,還是讀/寫(xiě)非配置空間,然后再調用相應的處理程序。
4 結 語(yǔ)
這里采用微軟的驅動(dòng)程序開(kāi)發(fā)包Device Driver Kit(DDK)是因為它是其他幾種工具的基礎,它要求開(kāi)發(fā)人員深刻了解驅動(dòng)底層,雖然不易掌握,但開(kāi)發(fā)出來(lái)的驅動(dòng)程序通用性好,兼容性強。板卡與PC機的通信速度得到了很大的提高。
評論