關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > PCI設備Windows通用驅動程序設計

        PCI設備Windows通用驅動程序設計

        作者: 時間:2009-05-13 來源:網絡 收藏

        從物理地址到線性地址的轉換工作也是由程序來完成的。在 95下,使用DDK的VMMCall_MapPhysToLinear進行地址映射。程序的內存映射部分主要是調用VxD的系統服務MapPhysToLinear。在VtoolsD中這個函數的定義如下:
          PVOID MapPhysToLinear(CONST VOID * PhysAddr,DWORD nBytes,DWORD Flags);
          其中第一個參數PhysAddr就是要映射的內存的物理地址的起始位置,而nBytes是內存區域的長度,Flags必須設置為0。這個函數返回的就是這段物理地址映射的線性內存地址。如果指定的內存不能存取,函數將返回FFFFFFFFH。
          比如要映射物理內存ED000000H開始的4096個字節,可以這樣做:
          PCHAR *PointerToPage=(PCHAR)MapPhysToLinear((PVOID)OxED000000,4096,0);
          而將PointerToPage傳遞給調用的用戶程序,在用戶程序中使用
          DWORD *pFIFOBodyBase=(DWORD*)PointerToPage;
          而這個pFIFOBodyBase指針就可以象普通的指針一樣進行讀寫操作,而通過對這個指針的操作就可以實現對物理內存ED000000H進行讀寫。
          在 NT下,首先調用IoReportResourceUsage請求使用的內存。然后調用HalTranslateBusAddress轉換與總線相關的內存為系統的物理內存地址。再使用MmMapIoSpace把的內存映射到虛擬空間。在驅動卸出時,調用MmUnmapIoSpace斷開設備的內存和虛擬空間的連接。
          (4)中斷的設置、響應與調用
          對中斷的設置、響應與調用應該在驅動程序中完成。
          對中斷的調用(象前面調用BIOS的1AH中斷讀取配置寄存空間)可以由DDK的Exec_Int完成。
          設備驅動程序應當從配置寄存器的中斷寄存器(INTLN)和中斷引腳寄存器(INTPIN)中獲得有關中斷的信息。DDK還提供了響應中斷事件的服務。如在 95中,VPICD服務用來管理所有硬件中斷事件。PC機的硬件中斷需要確定硬件中斷的IRQ,對一個特定的IRQ中斷源,VPICD或者提供缺省的中斷處理函數,或者允許其它VxD重載中斷處理函數。在VtoolsD中,要處理硬件中斷應該從VHardwareInt繼承一個類。在這個類中,VtoolsD提供了編寫中斷響應程序所需的功能。
          在Windows NT中,同VPICD對應的中斷服務為中斷請求層(IRQL)。設備驅動首先使用HalGetInterrupuVector將與總線有關的中斷向量轉換為系統的中斷向量,然后利用IoConnectInterrupu指定中斷服務。
        3 設備驅動的調用
          編寫設備驅動并不是最終的目的,總是需要由用戶程序來調用驅動并實現一定的功能。一般調用設備驅動是使用CreateFile函數打開設備文件,得到一個文件句柄。具體到我們的設備驅動程序中,使用如下的語句就可以打開文件。
          hVxD=CreateFile(″\.BIOS.VXD″,0,0,0,
          CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0);
          打開設備文件后,調用DeviceIoControl函數就可以同設備驅動程序交換數據了。
          完成硬件操作之后,可以調用CloseHandle(h VxD);關閉設備驅動。
          這種調用方式也是Windows NT調用設備驅動的標準方法。對于VxD來說還有其它的調用方式,如DPMI方式,但采用DeviceIoControl的方法可以保證程序在Windows NT和Windows 9x下的兼容性,在兩個操作系統下,僅有CreateFile語句是不同的。
        4 設備驅動的進一步封裝
          至此,完成了對驅動程序的初步設計。但考慮到在上面調用設備驅動時使用的DeviceIoControl函數仍是比較復雜的,程序也不太容易具有通用性。而且,在有些開發工具中,如Visual Basic,不包括直接讀寫I/O端口的語句,所以可以考慮根據不同軟件的需要對驅動程序進行不同的封裝。目前,我們實現了以DLL、ActiveX、VCL和C++類庫進行封裝。DLL可以在大多數軟件環境中進行調用。ActiveX可以在Visual Basic等可視編程環境中使用。VCL可以在Delphi和C++ Builder中使用。考慮到許多用戶使用Visual C++,所以也提供了C++類庫方式。


        上一頁 1 2 3 下一頁

        關鍵詞: Windows PCI 設備 驅動

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜城市| 兴义市| 沈阳市| 温州市| 聂拉木县| 临海市| 喜德县| 龙州县| 三穗县| 昌邑市| 莒南县| 扎赉特旗| 阿尔山市| 南安市| 乌兰县| 兴宁市| 交口县| 江口县| 车致| 米易县| 城市| 射阳县| 新津县| 河西区| 金坛市| 钟祥市| 梧州市| 治多县| 新竹县| 朝阳县| 巴彦淖尔市| 元阳县| 甘洛县| 德昌县| 册亨县| 若尔盖县| 深圳市| 瑞丽市| 新干县| 滨海县| 通辽市|