<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > PCI設(shè)備Windows通用驅(qū)動(dòng)程序設(shè)計(jì)

          PCI設(shè)備Windows通用驅(qū)動(dòng)程序設(shè)計(jì)

          作者: 時(shí)間:2009-05-13 來(lái)源:網(wǎng)絡(luò) 收藏

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


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();