基于PCI總線的數字衛星解調卡驅動程序開發
KconnonDmaBuffer是DMA通用緩沖區對象。驅動中,此類可在On Start Device中由成員函數Initialize初始化。通用緩沖區是外部設備和驅動程序之間的一段物理上連續的虛擬內存,這個內存是從系統中分配出來的,是非常珍貴的資源,任何時候都可以被他的設備和驅動程序存取。通用緩沖區包括緩沖區空間大小、虛擬地址、邏輯地址等信息。由于通用緩沖區是非常珍貴的資源,所以它的大小也受到限制。為此,驅動時應對每個DMA請求進行分段,并為每個段提供一個傳輸段描述符數組。而且,當設備不支持分散/集中時,這個數組中的描述符只能有一個。每個描述符包含一個物理地址和相應的字節數,其結構如下:
其中的物理地址即邏輯地址,字節數則是相應的邏輯地址范圍的長度。
KdmaTransfer為DMA傳輸對象,用來管理內存和設備之間的數據傳輸,但此時的DMA適配器必須可用。適配器對象可用來通知傳輸數據的類型和使用的DMA通道等。驅動中,此類可在OnStart Device中由成員函數Initialize初始化。在DMA傳輸中,數據可直接傳輸到系統物理內存中。管理這些內存的方式有Common Buffer和Packet兩種。第一種方式是在物理內存中預先開辟一段連續的內存空間,CPU和PCI都可以對其進行訪問,且在一次DMA傳輸過程中,物理地址保持不變,該方式適合傳輸大量數據和連續的DMA傳輸;而在Packet方式中,由于其內存物理地址不確定,因此適合間斷性的DMA傳輸。
(2)回調函數
由于DMA傳輸采用分段傳輸,所以,每當準備傳輸一個新段時,KDmaTransfer的對象將通知驅動程序調用回調例程。回調函數的原型由typedef DMAREADY_CALLBACK指定,使用宏DEVMEMBER_DMAREADY可聲明回調函數基類的成員函數。通過判斷成員函數Bytes Remaining可判斷傳輸是否完成。若返回值為0,則調用成員函數Terminate以完成相應的IRP,否則,回調函數繼續傳輸。
(3)中斷服務
本驅動需要處理兩種中斷,第一種是本地中斷,它是當FIFO輸出半滿信號時由FPGA通過LINT#信號發給PCI9054的中斷信號;第二種中斷是DMA傳輸結束時由DMA中斷控制器產生的。這兩種中斷可以通過對DMA的中斷控制寄存器的特定位處理來區分。判斷是否是本地中斷時,可以通過判斷DMA中斷控制寄存器的第15位是否為1來確定,如果INTCSR[15]=1,則為本地中斷;判斷是否是DMA中斷則可通過判斷DMA中斷控制寄存器的第23位是否為1來確定,如果INTCSR[23]=1,則為DMA中斷。不同的中斷,其處理方式不同。
3.3 驅動程序的創建及安裝文件的修改
為了正確的創建WDM驅動程序,首先要建立WDM編程環境,并創建自己的庫文件。參考文件中提供了一種WDM編程環境的建立方法,但是,按照書中的方法經常不能成功的建立編程環境,為此,筆者根據自己的經驗介紹一種簡單易行的方法:
(1)首先安裝DDK;
(2)在開始菜單中選擇Compuware Driver Studio\Develop下的DDK Build Setting;
(3)在打開的對話框中的DDK Root Directory中設置DDK的根目錄(如E:\WINDDK\2600),然后點擊Launch Program,并打開Compuware DriverStudio的Driver Works文件夾中Source里的VdwLibs.dsw文件。
(4)選擇Build菜單中的Set Active Project Configuration,并在彈出的對話框中選擇合適的Project configurations。而對于現行的32位機,它不需要像Win32 AMD64 Free等這樣的工程;
(5)選好一個工程后,點擊OK,然后點擊Build with BUILD.EXE即可生成所需的庫。然后再根據自己的需要重新選擇新的Project configurations,以進行庫的創建。
筆者的這種方法在于使用DDK Build Setting的Launch Program打開VdwILibs.dsw,編譯沒有出現錯誤,書中的方法則是先打開VC++,然后打開VdwLibs.dsw,選擇Batch Build下的Rebuild All創建庫,但是筆者試了幾次均不成功。
庫文件生成之后,即可打開創建好的驅動程序,并在VC++的菜單中打開DDK Build Setting,再在DDK Root Directory中設置DDK的路徑為實際安裝的路徑,之后點擊Build圖標,就可以生成BPSKDRIVER.sys文件了。另外,驅動的類型可以自己設定,Windows系統定義了一系列的設備類名和GUID,找到驅動工程文件中后綴名為.inf的安裝文件,將其內容修改成與硬件信息一致就可以了。然后將此文件拷貝到工程中的i386文件夾中。至此,一個完整的驅動就創建成功了。
4 結束語
本驅動現在已經經過測試,工作正常。并已經應用于數字衛星解調卡中。WDM編程環境的創建具有筆者自己的見解,并且可以實現一次創建即成功,希望對同類驅動程序的開發具有借鑒作用。
評論