亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于PC/104的音頻采集壓縮卡WDM驅(qū)動(dòng)開發(fā)

        2008-04-12 00:00:00祁艷杰
        現(xiàn)代電子技術(shù) 2008年6期

        摘 要:WDM支持PNP,但在科研和工控中,最常用的數(shù)據(jù)采集卡通常都是基于PC總線的ISA設(shè)備,這類設(shè)備不支持PNP,在WDM中沒有獲得很好的支持。使用WDM開發(fā)這類設(shè)備的驅(qū)動(dòng)程序需要一些特殊處理。首先介紹PC/104規(guī)范和WDM驅(qū)動(dòng)的結(jié)構(gòu)以及通用的開發(fā)思路,然后重點(diǎn)討論基于PC/104音頻采集壓縮卡WDM驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn),并給出主體部分代碼。實(shí)踐證明該驅(qū)動(dòng)能穩(wěn)定地實(shí)現(xiàn)一般設(shè)備驅(qū)動(dòng)程序所具備的功能,且對(duì)ISA卡驅(qū)動(dòng)的開發(fā)也具有一定參考價(jià)值。

        關(guān)鍵詞:WDM;PC/104規(guī)范;音頻采集壓縮卡;PNP

        中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:B

        文章編號(hào):1004-373X(2008)06-033-03

        Development of WDM Driver for Audio Acquisition Compression Card Based on PC/104

        QI Yanjie

        (School of Electronic Engineering,Taiyuan University of Science and Technology,Taiyuan,030024,China)

        Abstract:PNP is supported by WDM.But in the field of research and industry control,the data acquisition system is ISA equipment based on PC bus.This kind of equipment can′t support PNP,so it can′t get efficient surport in WDM.Using WDM to develop this kind of driver program needs some special processing. In this paper,we first introduce the PC/104 specification and the structure of the Windows driver model,as well as the way about how to develop a WDM driver.The focuses are laid on the design and implement of a WDM driver which is developed for an image acquisition system based on PC/104 bus.The principal part of the source code for that driver is listed.The actual application proves that the system is able to perform the same as universal drivers do.It also provides a certain extent of reference value to the development of a driver based on ISA bus.

        Keywords:WDM;PC/104 specification;audio acquisition compression card;PNP

        PC/104是一種專門為嵌入式控制而定義的工業(yè)控制總線,他的兼容和機(jī)械穩(wěn)定性好,廣泛應(yīng)用于環(huán)境較為惡劣的工控領(lǐng)域。PC104實(shí)際上是基于ISA標(biāo)準(zhǔn)。

        WDM(Windows Driver Model)作為微軟為Windows 2000及以后版本準(zhǔn)備的新驅(qū)動(dòng)模型,支持PNP(即插即用),為用戶的PNP設(shè)備驅(qū)動(dòng)完成大量的底層工作。但在科研和工控中,最常用的數(shù)據(jù)采集卡通常都是基于PC總線的ISA設(shè)備(包括PC/104設(shè)備),這類設(shè)備不支持PNP,在WDM中沒有獲得很好的支持。使用WDM開發(fā)這類設(shè)備的驅(qū)動(dòng)程序需要一些特殊處理。

        1 PC/104

        PC/104是一種專門為嵌入式控制而定義的工業(yè)控制總線,近年來在國際上廣泛流行,被IEEE協(xié)會(huì)定義為IEEE-P996.1。他具有如下特點(diǎn)[1]

        (1) 小尺寸結(jié)構(gòu),標(biāo)準(zhǔn)模塊的機(jī)械尺寸為:3.6英寸×3.8英寸(90 mm×96 mm);

        (2) 堆棧式,“針”“孔”總線連接,即PC/104總線模塊之間總線的連接是通過上層的針和下層的孔互相咬和相連,有極好的抗震性;

        (3) 4 mA總線驅(qū)動(dòng)就可使模塊正常工作(為驅(qū)動(dòng)更多模塊,一般設(shè)計(jì)采用24 mA)。減少能量消耗,減少總線信號(hào)驅(qū)動(dòng)器。

        (4) 自我堆棧式連接,無需母板。

        一個(gè)單獨(dú)的PC/104模塊可以作為一個(gè)獨(dú)立的系統(tǒng)使用,也能夠作為一個(gè)成員被嵌入到一個(gè)更大的系統(tǒng)中去,各種PC/104模塊能夠被堆疊在一起組成一個(gè)系統(tǒng)。

        PC/104 被越來越多地使用于各種嵌入式系統(tǒng)中,特別是在一些可靠性要求高而工作環(huán)境又比較惡劣的地方。目前已被大量地應(yīng)用于儀器、通信、醫(yī)療設(shè)備、工業(yè)控制、航空航天、軍事設(shè)備等領(lǐng)域。

        2 WDM驅(qū)動(dòng)程序

        2.1 WDM驅(qū)動(dòng)程序模型

        在WDM驅(qū)動(dòng)程序模型中,每個(gè)硬件設(shè)備至少有2個(gè)驅(qū)動(dòng)程序[2]。其中一個(gè)稱為功能(function)驅(qū)動(dòng)程序,這就是硬件設(shè)備驅(qū)動(dòng)程序。他了解使硬件工作的所有細(xì)節(jié),負(fù)責(zé)初始化I/O操作,處理I/O操作完成時(shí)所帶來的中斷事件,為用戶提供一種設(shè)備適合的控制方式。另一個(gè)驅(qū)動(dòng)程序稱為總線驅(qū)動(dòng)程序,他負(fù)責(zé)管理硬件與計(jì)算機(jī)的連接。

        2.2 驅(qū)動(dòng)程序的結(jié)構(gòu)

        WDM驅(qū)動(dòng)程序的結(jié)構(gòu)很簡單。他的主體是一個(gè)入口函數(shù)DriverEntry。DriverEntry的第一個(gè)參數(shù)是指針,指向一個(gè)剛被初始化的驅(qū)動(dòng)程序?qū)ο螅搶?duì)象代表驅(qū)動(dòng)程序。WDM驅(qū)動(dòng)程序的DriverEntry例程完成這個(gè)對(duì)象的初始化并返回。WDM驅(qū)動(dòng)程序的DriverEntry例程的主要工作是把各種函數(shù)指針填入驅(qū)動(dòng)程序?qū)ο?。這些指針對(duì)操作系統(tǒng)指明了驅(qū)動(dòng)程序容器中各種子例程的位置。他包括下面這些指針成員:

        (1) DriverUnload指向驅(qū)動(dòng)程序的清除例程。I/O管理器會(huì)在卸載驅(qū)動(dòng)程序前調(diào)用該例程。通常WDM驅(qū)動(dòng)程序的DriverEntry例程一般不分配任何資源,所以DriverUnload例程也沒有什么清除工作要做。

        (2) DriverExtension→AddDevice指向驅(qū)動(dòng)程序的AddDevice函數(shù)。AddDevice函數(shù)是WDM驅(qū)動(dòng)程序的一個(gè)特殊函數(shù),PNP管理器為每個(gè)設(shè)備實(shí)例調(diào)用該函數(shù)。他創(chuàng)建一個(gè)設(shè)備對(duì)象并把他連接到該驅(qū)動(dòng)程序的設(shè)備堆棧中。在這個(gè)函數(shù)里,設(shè)備對(duì)象被創(chuàng)建,設(shè)備需要的中斷、DMA等資源被掛接到這個(gè)設(shè)備對(duì)象上,相應(yīng)地處理函數(shù),如中斷服務(wù)例程等也被指定。

        (3) DriverStartIo,如果驅(qū)動(dòng)程序使用標(biāo)準(zhǔn)的串行IRP,則必須使用這個(gè)函數(shù),使他指向驅(qū)動(dòng)程序的StarIo例程。

        (4) MajorFunction是一個(gè)指針數(shù)組,他主要處理各種用戶的I/O請(qǐng)求IRP。默認(rèn)情況下,用戶的所有I/O請(qǐng)求都會(huì)由I/O管理器返回失敗。驅(qū)動(dòng)程序?yàn)橐幚淼腎RP指定相應(yīng)的派遣函數(shù)。

        此外,還有一些重要的例程如用于處理中斷操作中斷服務(wù)例程,為了提高系統(tǒng)中斷處理效率的中斷服務(wù)推遲調(diào)用例程等。

        驅(qū)動(dòng)程序的其余部分就是前面所指定的那些例程的實(shí)現(xiàn)。

        2.3 WDM工作原理

        WDM驅(qū)動(dòng)程序是分層的,即不同層上的驅(qū)動(dòng)程序有著不同的優(yōu)先級(jí)。另外,WDM還引入了功能設(shè)備對(duì)象FDO(Functional Device Object)與物理設(shè)備對(duì)象PDO(Physical Device Object)兩個(gè)新類來描述硬件,一個(gè)PDO對(duì)應(yīng)一個(gè)真實(shí)硬件。另外值得注意的是,一個(gè)硬件只允許有一個(gè)PDO,卻可以擁有多個(gè)FDO,在驅(qū)動(dòng)程序中直接操作的不是硬件而是相應(yīng)的PDO與FDO。在Ring-3與Ring-0通訊方面,系統(tǒng)為每一個(gè)用戶請(qǐng)求打包形成一個(gè)IRP結(jié)構(gòu),將其發(fā)送至驅(qū)動(dòng)程序,并通過識(shí)別IRP中的PDO來區(qū)別是發(fā)送給哪一個(gè)設(shè)備的。另外,在驅(qū)動(dòng)程序的加載方面,WDM不通過驅(qū)動(dòng)程序名稱識(shí)別,而是通過1個(gè)128位的GUID來實(shí)現(xiàn)驅(qū)動(dòng)程序的識(shí)別。

        2.4 WDM驅(qū)動(dòng)程序的開發(fā)

        驅(qū)動(dòng)程序的開發(fā)是一個(gè)從粗到細(xì)逐步求精的過程。具體來說,可分為以下幾個(gè)基本步驟:

        (1) 建立WDM編程環(huán)境。安裝所需的各種工具包,如VC++,DDK,DriverStudio等。

        (2) 創(chuàng)建WDM驅(qū)動(dòng)程序。包括建立工程,編寫DriverEntry例程,創(chuàng)建一個(gè)Device對(duì)象,編寫各種服務(wù)例程等。如果選用DriverStudio作為開發(fā)工具,上述工作有很大一部分將由系統(tǒng)自動(dòng)完成。

        (3) 測試驅(qū)動(dòng)程序。首先應(yīng)安裝好驅(qū)動(dòng)程序,然后編寫一個(gè)簡單的測試程序調(diào)用Win32 API中的相應(yīng)函數(shù)進(jìn)行測試。要求在驅(qū)動(dòng)程序中必須為所需要處理的IRP_MJ_XXX寫好處理例程。

        (4) 進(jìn)一步封裝驅(qū)動(dòng)程序(可選)。某些時(shí)候?yàn)榱朔奖阌脩羰褂?,可能要?duì)驅(qū)動(dòng)程序進(jìn)一步封裝[2]。

        (5) 打包發(fā)布驅(qū)動(dòng)程序。編制好驅(qū)動(dòng)程序之后,需要將其打包發(fā)布、制作安裝盤以供客戶使用。

        3 一套PC/104音頻采集壓縮卡WDM驅(qū)動(dòng)程序的實(shí)現(xiàn)

        在Windows 2000下,使用Compuware DriverStudio3.1和Visual C++6.0,這里開發(fā)了一套PC/104音頻采集壓縮卡的驅(qū)動(dòng)。該音頻采集壓縮卡系統(tǒng)支持軟件查詢、DMA、中斷3種數(shù)據(jù)傳輸方式。

        使用Compuware DriverStudio 3.1作為開發(fā)工具可以大大簡化驅(qū)動(dòng)程序的開發(fā)過程。DriverStudio3.1開發(fā)通用內(nèi)核模式的開發(fā)包是DriverWorks。DriverWorks是一個(gè)面向?qū)ο蟮墓ぞ甙K庋b了比較底層的繁復(fù)操作,提供給開發(fā)者一個(gè)簡捷的界面。同時(shí),DriverWorks和Visual C++有很多的接口:DriverWorks為Visual C++提供了一個(gè)專門開發(fā)WDM驅(qū)動(dòng)程序的WIZARD。通過WIZARD,開發(fā)者可以很容易的生成一個(gè)驅(qū)動(dòng)程序的框架。開發(fā)者要做的工作就是根據(jù)特定硬件編寫相應(yīng)的代碼。

        3.1 框架生成和資源配置

        在使用WIZARD生成的驅(qū)動(dòng)程序框架的過程中,需要為設(shè)備配置資源如中斷、I/O端口范圍、DMA以及驅(qū)動(dòng)程序與應(yīng)用程序的接口命令及處理函數(shù)。

        由于PC/104設(shè)備本身不具備PNP功能,為了使其具有PNP特性,可以通過PNP管理器和INF文件完成自動(dòng)資源分配[3]。本例在INF文件中通過如下方式為設(shè)備配置資源:

        ClassGUID={fc4ba6a3-9e9a-4960-a427-c4ed80a94957} ;GUID

        ConfigPriority=NORMAL

        IOConfig=10@300-3ff%fff0(ffff::);IoPortRange0;

        IRQConfig=5,7,8,9,10,12,13;IRQNUM

        DMAConfig=W:5 ;DMACHANNEL

        3.2 硬件訪問

        驅(qū)動(dòng)程序根據(jù)WIZARD在框架生成過程中的配置聲明KIoRange,KMemoryRange,KInterrupt,KDefferedCall,KDmaAdapter等類的實(shí)例[2]。另外還需手動(dòng)聲明KDmaTransfer類實(shí)例和StartDMA(),OnDmaReady()函數(shù)并根據(jù)具體情況編寫函數(shù)體。

        在OnStartDevice()實(shí)例中,初始化KInterrupt,KDefferredCall,KDmaAdapter,KIoRange等類的實(shí)例,以及其他一些初始化工作。主體部分代碼如下:

        // Initialize the DMA adapter object

        m_Dma.Initialize(dd,m_Lower.PDO());

        m_Buffer.Initialize(m_Dma,1024);

        // For each I/O port mapped region,initialize the I/O port range using

        // the resources provided by NT.Once initialized,use member functions such as

        // inb/outb,or the array element operator to access the ports range.

        status = m_IoPortRange0.Initialize(

        pResListTranslated,

        pResListRaw,

        0

        );

        // Initialize and connect the interrupt

        status = m_Irq.InitializeAndConnect(

        pResListTranslated,

        LinkTo(Isr_Irq),

        this

        );

        在SerialRead()或SerialWrite()例程中,創(chuàng)建KDmaTransfer類實(shí)例并初始化,主體部分代碼如下:

        //創(chuàng)建KDmaTransfer類實(shí)例并初始化

        m_CurrentTransfer = new(NonPagedPool)KDmaTransfer(this,m_Dma);

        //下面采用應(yīng)用程序的數(shù)據(jù)緩沖區(qū)作為DMA數(shù)據(jù)區(qū)

        status = m_CurrentTransfer->Initiate(

        I.Mdl(),

        (I.MajorFunction() == IRP_MJ_READ) ? FromDeviceToMemory : FromMemoryToDevice,

        LinkTo(OnDmaReady)

        ); //此操作將使系統(tǒng)調(diào)用OnDmaReady例程

        在DpcFor_Irq()例程中,調(diào)用KDmaTransfer類的Continue()函數(shù):

        m_CurrentTransfer->Continue(UseTransferSize);

        在Isr_Irq()例程中完成清除中斷,請(qǐng)求DpcFor_Irq()例程操作。

        在StartDMA()例程中設(shè)置DMA控制寄存器,啟動(dòng)DMA傳輸。

        在OnDmaReady()例程中,判斷是否為第1次調(diào)用從而啟動(dòng)StartDMA()例程以及傳輸是否結(jié)束,并完成相關(guān)操作。

        3.3 編譯調(diào)試

        完成音頻采集壓縮卡的WDM驅(qū)動(dòng)程序的主體部分后,就可以進(jìn)行編譯和調(diào)試。

        DriverWorks在創(chuàng)建驅(qū)動(dòng)程序框架的同時(shí),也為會(huì)該驅(qū)動(dòng)程序創(chuàng)建一個(gè)DOS界面的Win32 Console應(yīng)用程序。某些情況下,開發(fā)人員可能還需要另外創(chuàng)建一個(gè)MFC程序。

        在相應(yīng)的應(yīng)用程序創(chuàng)建后進(jìn)行調(diào)試。Driver-Studio 3.1自帶的調(diào)試工具是DriverMonitor和SoftICE。DriverMonitor用于觀察Debug版本驅(qū)動(dòng)程序的調(diào)試輸出信息。SoftICE功能非常強(qiáng)大,他結(jié)合硬件調(diào)試器的強(qiáng)大功能和符號(hào)調(diào)試程序的易用性,能夠在用戶模式下顯示內(nèi)核程序的源代碼,允許通過符號(hào)名訪問數(shù)據(jù)。

        3.4 封裝、打包

        為了方便用戶程序的調(diào)用,對(duì)生成的驅(qū)動(dòng)程序進(jìn)行了進(jìn)一步的封裝。封裝后的DLL文件可以在大多數(shù)軟件環(huán)境中調(diào)用。最后用InstallShield打包。

        4 結(jié) 語

        使用DriverSutdio 3.1,結(jié)合Visual C++ 6.0,Micro[CD*4]soft Windows 2000 sp4 DDK開發(fā)的基于PC/104音頻采集壓縮卡WDM驅(qū)動(dòng),能夠完成一般設(shè)備驅(qū)動(dòng)程序所需的功能。同時(shí)由于加入PNP的支持,使得該系統(tǒng)的硬件安裝、卸載非常簡便。此外,本文的開發(fā)思路對(duì)同類設(shè)備以及ISA設(shè)備驅(qū)動(dòng)的開發(fā)也具有一定的參考價(jià)值。

        參考文獻(xiàn)

        [1]PC/104 Specification Version 2.5,2003.

        [2]李海.PCI設(shè)備Windows通用驅(qū)動(dòng)程序設(shè)計(jì)\\[J\\].電子技術(shù)應(yīng)用,2000,26(1):19-22.

        [3]張龍.ISA數(shù)據(jù)采集卡的WDM驅(qū)動(dòng)程序?qū)崿F(xiàn)\\[J\\].電子技術(shù)應(yīng)用,2001,27(11):20-23.

        [4]武安河.Windows 2000/XP WDM設(shè)備驅(qū)動(dòng)程序開發(fā)\\[M\\].北京:電子工業(yè)出版社,2005.

        [5]\\[美\\]坎特.Windows WDM設(shè)備驅(qū)動(dòng)程序開發(fā)指南\\[M\\].孫義,馬莉波,國雪飛,等譯.北京:機(jī)械工業(yè)出版社,2000.

        [6]徐杰,蘇凱雄.DVB碼流PCI接收卡的WDM設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)\\[J\\].現(xiàn)代電子技術(shù),2005,28(10):26-28.

        [7]陳大科,李軍予.PCI總線WDM驅(qū)動(dòng)程序的設(shè)計(jì)方法與實(shí)例\\[J\\].現(xiàn)代電子技術(shù),2006,29(22):99-100,103.

        亚洲欧洲日产国产AV无码| 欧美性猛交xxxx免费看蜜桃 | 国产精品一区二区韩国av| 中文精品久久久久人妻不卡 | 亚洲AV秘 无码一区二p区三区| 国产一区二区三区资源在线观看| 五月婷婷六月丁香久久综合| 国产免费艾彩sm调教视频| 亚洲av无码成人精品区天堂| 黑丝美女被内射在线观看| 日本一区二区三区光视频| 国产亚洲一本大道中文在线| 在线观看欧美精品| 日韩精品夜色二区91久久久| 国语对白福利在线观看| 国精品无码一区二区三区在线蜜臀 | 国产麻无矿码直接观看| 国产精品乱子伦一区二区三区| 少妇人妻无一区二区三区| 午夜免费福利小电影| 国产目拍亚洲精品一区二区| 亚洲国产日韩精品综合| 国产三级久久精品三级91| 激情航班h版在线观看| 精品欧美久久99久久久另类专区| 国产三级视频在线观看国产 | 国产91在线免费| 亚洲一区二区三区最新视频| 国产一区二区三区久久精品| 波多野结衣一区二区三区高清| 亚洲中文字幕日产喷水| 国产老熟女精品一区二区| 成人精品视频一区二区三区尤物| 五月婷婷激情综合| 久久精品国产亚洲不卡| 国产区精品一区二区不卡中文 | 天天做天天添av国产亚洲| 亚洲日本va午夜在线影院| 国产免费人成视频在线观看播放| 一区二区三区国产在线视频| 三级特黄60分钟在线观看|