0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在WINDOWS操作系統(tǒng)下基于PCI總線開(kāi)發(fā)WDM驅(qū)動(dòng)程序

電子設(shè)計(jì) ? 來(lái)源:INTERNET ? 作者:王磊,朱齊丹,王 ? 2020-03-20 08:05 ? 次閱讀

1、引言

微型計(jì)算機(jī)界以INTEL公司為主推出了PCI總線規(guī)范。采用PCI總線設(shè)備所具有的配置空間以及PCI總線通過(guò)橋接電路與CPU相連的技術(shù)使PCI總線具有廣泛的適應(yīng)性,并且PCI總線采用寬字節(jié)和高達(dá)33Mb的時(shí)鐘頻率的猝發(fā)和主控方式傳輸能滿足高速設(shè)備的要求。

在WINDOWS操作系統(tǒng)下,開(kāi)發(fā)PCI設(shè)備的驅(qū)動(dòng)程序最好的方案是WDM驅(qū)動(dòng)程序。在一個(gè)系統(tǒng)中開(kāi)發(fā)出WDM驅(qū)動(dòng)程序,稍加修改即可在其他系統(tǒng)中編譯運(yùn)行。

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

WDM(WINDOWSDriverProgramModel)是一個(gè)模塊化的、分層次類型的微型驅(qū)動(dòng)程序結(jié)構(gòu),它是編寫設(shè)備驅(qū)動(dòng)程序的主要模型。設(shè)備驅(qū)動(dòng)程序是提供連接到計(jì)算機(jī)的硬件的軟件接口,它是操作系統(tǒng)的一部分,用戶應(yīng)用程序以一種規(guī)范的方式訪問(wèn)硬件,而不必考慮必須如何控制硬件。在WINDOWS中,驅(qū)動(dòng)程序總是使設(shè)備看起來(lái)像是一個(gè)文件,可以打開(kāi)設(shè)備的一個(gè)句柄,然后應(yīng)用程序可以在設(shè)備句柄最后關(guān)閉之前向驅(qū)動(dòng)程序發(fā)出讀寫請(qǐng)求。WDM是在WindowsNT驅(qū)動(dòng)程序體系的基礎(chǔ)上發(fā)展而來(lái)的,修改或增加了即插即用、電源管理等功能,使之適應(yīng)硬件和用戶的要求。

PCI總線是一種高性能、與CPU無(wú)關(guān)的32/64位地址數(shù)據(jù)復(fù)用的總線,它支持突發(fā)傳輸、即插即用、電源管理等功能,不但能滿足現(xiàn)在的應(yīng)用需要,而且能夠適應(yīng)未來(lái)的需求。PCI總線支持硬件資源動(dòng)態(tài)自動(dòng)配置,以支持即插即用。在PCI設(shè)備插入PCI插槽或上電后,PCI總線配置機(jī)構(gòu)自動(dòng)根據(jù)PCI設(shè)備的要求實(shí)現(xiàn)配置。PCI總線支持內(nèi)存讀寫、I/O端口讀寫、中斷機(jī)制和DMA功能。由于這些硬件特點(diǎn)使PCI設(shè)備的WDM驅(qū)動(dòng)程序的設(shè)計(jì)變得很復(fù)雜。在開(kāi)發(fā)WDM驅(qū)動(dòng)程序之前,還有必須掌握PCI設(shè)備的需要分配的資源等配置信息以及PCI設(shè)備的功能和操作方法。

在WDM中,采用了分層的驅(qū)動(dòng)程序體系結(jié)構(gòu),總線驅(qū)動(dòng)程序或類驅(qū)動(dòng)程序在最底層直接與設(shè)備打交道,設(shè)備功能驅(qū)動(dòng)程序在上層通過(guò)與低層驅(qū)動(dòng)程序打交道,實(shí)現(xiàn)設(shè)備的功能,中間還可以有類過(guò)濾驅(qū)動(dòng)程序或設(shè)備過(guò)濾驅(qū)動(dòng)程序用于數(shù)據(jù)的過(guò)濾或轉(zhuǎn)換。在PCI總線的驅(qū)動(dòng)程序?qū)又?,其層次圖如圖1所示:

在WINDOWS操作系統(tǒng)下基于PCI總線開(kāi)發(fā)WDM驅(qū)動(dòng)程序

在PCI設(shè)備的WDM驅(qū)動(dòng)程序中,一般是編寫功能驅(qū)動(dòng)程序。PCI總線驅(qū)動(dòng)程序由操作系統(tǒng)實(shí)現(xiàn),過(guò)濾驅(qū)動(dòng)程序一般在特殊的情況下需要編寫。因此本文只討論P(yáng)CI設(shè)備功能驅(qū)動(dòng)程序的設(shè)計(jì)。在PCI設(shè)備功能驅(qū)動(dòng)程序中,需要處理PCI設(shè)備的內(nèi)存、端口的讀寫、中斷處理和DMA數(shù)據(jù)傳輸,實(shí)現(xiàn)PCI設(shè)備的功能,因此,PCI設(shè)備功能驅(qū)動(dòng)程序是很標(biāo)準(zhǔn)的WDM設(shè)備驅(qū)動(dòng)程序。

3、PCI設(shè)備資源的獲得及內(nèi)存、I/O讀寫

PCI設(shè)備的硬件資源是由PCI配置機(jī)構(gòu)動(dòng)態(tài)分配的,由PCI設(shè)備實(shí)現(xiàn)PCI配置寄存器,提出需要分配的硬件資源,由PCI配置機(jī)構(gòu)分配資源。驅(qū)動(dòng)程序需要取得這些資源,才能操作硬件。因此,PCI設(shè)備的硬件資源分配與管理是驅(qū)動(dòng)程序中很重要的部分。硬件資源主要包括映射內(nèi)存空間、I/O空間、中斷。當(dāng)系統(tǒng)的PNP管理器在取得設(shè)備的資源后會(huì)自動(dòng)向驅(qū)動(dòng)程序發(fā)出IRP_MN_START_DEVICE的IRP,在該IRP棧中包含了設(shè)備的資源信息。好的驅(qū)動(dòng)程序都應(yīng)該使用這種方法,每個(gè)支持PNP功能的驅(qū)動(dòng)程序,都應(yīng)實(shí)現(xiàn)IRP_MN_START_DEVICE處理。在該IRP處理中應(yīng)先交給低層驅(qū)動(dòng)程序處理后,再根據(jù)IRP棧內(nèi)內(nèi)容進(jìn)行資源分配。

在PCI設(shè)備的驅(qū)動(dòng)程序中,獲得的設(shè)備內(nèi)存是一段映射物理內(nèi)存,這是無(wú)法使用的,需要將其映射成系統(tǒng)可以訪問(wèn)的非分頁(yè)內(nèi)存。函數(shù)MmMapIoSpace完成該功能。該函數(shù)的原型為:

參數(shù)PhysicalAddress為物理地址;NumberOfBytes為地址的數(shù)量;CacheEnable為內(nèi)存是否可以隱藏,取值可為MmNonCached,MmCached,MmWriteCombined,這里必須取為MmNonCached。

在PC上,I/O空間是一個(gè)64K字節(jié)的尋址空間。I/O端口的尋址方式與內(nèi)存是不一樣的。但是在WDM驅(qū)動(dòng)程序中,對(duì)其處理與內(nèi)存是一樣的,把其看作寄存器,映射為設(shè)備內(nèi)存。其映射方法和訪問(wèn)函數(shù)的用法與內(nèi)存資源一樣,只不過(guò)函數(shù)XXXREGISTERXXX改為XXXPORTXXX。

4、中斷的處理

在PCI總線中,很多設(shè)備共享一個(gè)中斷,這就需要在中斷處理函數(shù)要格外小心,處理不當(dāng),就會(huì)導(dǎo)致系統(tǒng)崩潰。驅(qū)動(dòng)程序首先要在IRPMNSTARTDEVICE中獲得中斷資源,然后需要連接到中斷處理函數(shù)中,使其當(dāng)有中斷請(qǐng)求時(shí),進(jìn)入中斷服務(wù)例程。連接中斷的函數(shù)為IoConnectInterrupt,具體用法見(jiàn)上段程序中的“中斷資源”部分。十分需要注意的是在連接中斷之前,一定要確定PCI設(shè)備不會(huì)產(chǎn)生中斷請(qǐng)求,最好在PCI設(shè)備上電后,中斷為屏蔽狀態(tài)。在連接中斷后,調(diào)用開(kāi)啟中斷請(qǐng)求的函數(shù)需要同步處理,以防在函數(shù)的執(zhí)行中,出現(xiàn)運(yùn)行時(shí)間上的錯(cuò)誤,而且在開(kāi)啟中斷時(shí),一定要在所有的硬件資源分配以后,否則如果有中斷產(chǎn)生,系統(tǒng)就會(huì)立即調(diào)用中斷處理例程,如果例程中使用了還沒(méi)有分配的資源,就會(huì)出現(xiàn)意想不到的結(jié)果。

在中斷服務(wù)例程中,相應(yīng)的處理最好簡(jiǎn)潔快速,因?yàn)橹袛嗬踢\(yùn)行的級(jí)別很高,當(dāng)有中斷請(qǐng)求時(shí),不但會(huì)打斷應(yīng)用程序的執(zhí)行,而且會(huì)打斷在硬件中斷級(jí)以下的所有運(yùn)行程序。在WDM中,提供了DPC(DeferredProcedureCall)例程,將在中斷例程中耗時(shí)的但不需要立即處理的任務(wù)延時(shí)處理。比如,驅(qū)動(dòng)程序接受應(yīng)用程序的寫PCI設(shè)備的數(shù)據(jù),當(dāng)寫完后,硬件產(chǎn)生中斷標(biāo)志執(zhí)行完畢,這時(shí)需要結(jié)束該IRP,就可以將結(jié)束IRP這個(gè)耗時(shí)的任務(wù)交給DPC完成。

在該實(shí)例中,由應(yīng)用程序調(diào)用函數(shù)WriteFile,將數(shù)據(jù)傳遞給驅(qū)動(dòng)程序,驅(qū)動(dòng)程序的DispatchWrite例程負(fù)責(zé)處理該IRP,在該例程中,由于需要中斷的配合,假定無(wú)法立即執(zhí)行完畢,必須將IRP串行化,StartIo例程如果沒(méi)有其他任務(wù),就開(kāi)始處理該IRP,處理完畢后立即返回,但不能結(jié)束IRP,當(dāng)PCI設(shè)備完成操作后,就會(huì)產(chǎn)生中斷,在中斷服務(wù)例程中把IRP交給DPC,在DPC中處理完后結(jié)束該IRP。

5、驅(qū)動(dòng)程序的安裝與應(yīng)用

Windows98和Windows2000是依靠INF文件來(lái)得到硬件設(shè)備驅(qū)動(dòng)程序的安裝信息的一個(gè)設(shè)備信息文件(INF)。只要將文件中雙引號(hào)中的提示改為相應(yīng)的內(nèi)容即可生成我們自己的設(shè)備信息文件。

[Strings]

ProviderName=“yourcompanynamehere”//公司名稱

MfgName=“NameofHWmanufacturerhere”//硬件制造商名稱

DeviceDesc=“Descriptionofdevicehere”//設(shè)備描述

DeviceClassName=“Descriptionofdeviceclasshere”//設(shè)備類的描述

當(dāng)系統(tǒng)加電時(shí),WINDOWS操作系統(tǒng)會(huì)自動(dòng)檢測(cè)所有外設(shè),當(dāng)?shù)谝淮螜z測(cè)到我們的設(shè)備時(shí)系統(tǒng)會(huì)提示用戶指定新硬件的驅(qū)動(dòng)程序。根據(jù)提示指定了我們修改過(guò)的INF文件,以及編譯后生成的.sys系統(tǒng)文件系統(tǒng)就自動(dòng)安裝好了新硬件的驅(qū)動(dòng)程序。或者可以用控制面板中的添加新硬件來(lái)搜索新硬件。

驅(qū)動(dòng)程序安裝好以后,在應(yīng)用程序中就可以像打開(kāi)其他驅(qū)動(dòng)程序(如虛擬設(shè)備驅(qū)動(dòng)程序VxD)一樣用CreateFile打開(kāi)設(shè)備。

6、基于PCI總線的電機(jī)運(yùn)動(dòng)控制卡

圖2為該系統(tǒng)硬件組成框圖,該控制卡采用PCI總線實(shí)現(xiàn)主計(jì)算機(jī)與控制卡之間的信息傳遞??刂瓶ㄉ嫌?個(gè)伺服控制專用芯片LM628,分別用于控制伺服電機(jī);來(lái)自2個(gè)伺服電機(jī)的增量式碼盤輸入信號(hào)(A相、B相和Z脈沖),經(jīng)電平變換后分別送入LM628經(jīng)四倍頻和計(jì)數(shù)后作為反饋信號(hào),由LM628根據(jù)主計(jì)算機(jī)給定的位置、速度、加速度生成梯形軌跡速度曲線作為給定值,實(shí)現(xiàn)伺服電機(jī)的反饋控制。主計(jì)算機(jī)對(duì)該控制器發(fā)送命令,伺服控制器即按給定的運(yùn)動(dòng)形式輸出相應(yīng)的數(shù)字信號(hào),本卡中LM628工作于8位工作方式,產(chǎn)生輸出到功率放大器件。

在WINDOWS操作系統(tǒng)下基于PCI總線開(kāi)發(fā)WDM驅(qū)動(dòng)程序

應(yīng)用PCI總線目標(biāo)接口芯片PCI9052完成控制卡的接口部分,專用運(yùn)動(dòng)控制處理芯片LM628完成對(duì)電機(jī)的控制,再加上相應(yīng)的電路,即實(shí)現(xiàn)了基于PCI總線的精密電機(jī)運(yùn)動(dòng)控制卡的硬件設(shè)計(jì)。

7、結(jié)束語(yǔ)

WDM用一個(gè)相對(duì)獨(dú)立的模塊來(lái)處理設(shè)備數(shù)據(jù)的傳輸,驅(qū)動(dòng)程序在這個(gè)模塊中啟動(dòng)或停止設(shè)備,并實(shí)現(xiàn)中斷或其他方式的輸入輸出操作。WDM使驅(qū)動(dòng)程序的結(jié)構(gòu)非常清晰、完整,也使中斷I/O方式的設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)更加方便、快捷。應(yīng)用WDM編制的設(shè)備驅(qū)動(dòng)程序在本電機(jī)控制卡得到很好的應(yīng)用。

責(zé)任編輯:gt


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122750
  • PCI
    PCI
    +關(guān)注

    關(guān)注

    4

    文章

    643

    瀏覽量

    129958
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2817

    瀏覽量

    87712
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCI設(shè)備的WINDOWS驅(qū)動(dòng)程序開(kāi)發(fā)

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開(kāi)發(fā)摘要:本文主要介紹了Windows9x
    發(fā)表于 05-03 12:10

    分享:基于PCI總線的雙DSP系統(tǒng)WDM驅(qū)動(dòng)程序設(shè)計(jì)

    如圖3所示。 2 基于WDMPCI驅(qū)動(dòng)程序設(shè)計(jì) WDM是新一代的驅(qū)動(dòng)程序構(gòu)架,它是一個(gè)跨平臺(tái)的驅(qū)動(dòng)程
    發(fā)表于 09-24 22:18

    WDM設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā),Windows 2000/XP WD

    Windows 2000/XP WDM設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)主要介紹DriverStudio開(kāi)發(fā)工具開(kāi)發(fā)
    發(fā)表于 09-13 22:58 ?0次下載
    <b class='flag-5'>WDM</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>開(kāi)發(fā)</b>,<b class='flag-5'>Windows</b> 2000/XP WD

    WINDOWSPCI接口卡WDM驅(qū)動(dòng)程序的DMA編程技術(shù)

    本文主要討論了Windows環(huán)境開(kāi)發(fā)PCI接口卡DMA應(yīng)用的WDM編程技術(shù),并給出了一個(gè)應(yīng)用
    發(fā)表于 08-07 08:37 ?28次下載

    Windows環(huán)境開(kāi)發(fā)PCI接口卡DMA應(yīng)用的WDM編程技

    本文主要討論了Windows環(huán)境開(kāi)發(fā)PCI接口卡DMA應(yīng)用的WDM編程技術(shù),并給出了一個(gè)應(yīng)用
    發(fā)表于 10-06 10:14 ?24次下載

    VxWorksPCI總線設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)

    隨著VxWorks操作系統(tǒng)嵌入式系統(tǒng)中的應(yīng)用,VxWorks產(chǎn)品的開(kāi)發(fā)和應(yīng)用也越來(lái)越廣泛.本文描述了VxWorks
    發(fā)表于 11-28 16:36 ?17次下載

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開(kāi)發(fā)

    PCI設(shè)備WINDOWS驅(qū)動(dòng)程序開(kāi)發(fā) 本文主要介紹了Windows9x
    發(fā)表于 05-03 11:54 ?3287次閱讀

    PCI傳輸卡的WDM驅(qū)動(dòng)程序設(shè)計(jì)

    PCI傳輸卡的WDM驅(qū)動(dòng)程序設(shè)計(jì) PCI總線規(guī)范是為提高微機(jī)總線的數(shù)據(jù)傳輸速度而制定的一種局部
    發(fā)表于 10-27 11:04 ?973次閱讀

    PCI設(shè)備的WDM驅(qū)動(dòng)程序開(kāi)發(fā)

    本文簡(jiǎn)要介紹了WDM驅(qū)動(dòng)程序的結(jié)構(gòu)體系,之后結(jié)合PCI設(shè)備的結(jié)構(gòu)特點(diǎn),通過(guò)實(shí)例說(shuō)明如何利用驅(qū)動(dòng)程序開(kāi)發(fā)工具DriverWorks
    發(fā)表于 05-19 18:11 ?0次下載

    Windows WDM設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)指南

    書主要介紹Windows 98和Windows 2000新的驅(qū)動(dòng)程序模型(WDM)。描述了WDM設(shè)備驅(qū)動(dòng)
    發(fā)表于 12-12 15:31 ?0次下載
    <b class='flag-5'>Windows</b> <b class='flag-5'>WDM</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b><b class='flag-5'>開(kāi)發(fā)</b>指南

    Windows 2000WDM驅(qū)動(dòng)程序的研究與開(kāi)發(fā)

    本文分析研究了 Windows 2000 WDM 驅(qū)動(dòng)程序的基本原理。以 Microsoft 的 DDK 為開(kāi)發(fā)工具,
    發(fā)表于 04-18 10:02 ?0次下載

    基于操作系統(tǒng)PCI程序開(kāi)發(fā)

    Vxworks是WindRiver公司開(kāi)發(fā)的嵌入式實(shí)時(shí)操作系統(tǒng),廣泛地應(yīng)用于航空航天、工業(yè)控制、通信等領(lǐng)域;分析了VxWorksPCI設(shè)備驅(qū)動(dòng)程序
    發(fā)表于 09-22 16:31 ?9次下載
    基于<b class='flag-5'>操作系統(tǒng)</b>的<b class='flag-5'>PCI</b><b class='flag-5'>程序</b><b class='flag-5'>開(kāi)發(fā)</b>

    基于WDM驅(qū)動(dòng)程序模型實(shí)現(xiàn)過(guò)濾器驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)計(jì)

    的升級(jí),WDM已經(jīng)成為Windows 2000系統(tǒng)驅(qū)動(dòng)程序開(kāi)發(fā)的主流。作為
    的頭像 發(fā)表于 09-19 15:54 ?3034次閱讀
    基于<b class='flag-5'>WDM</b><b class='flag-5'>驅(qū)動(dòng)程序</b>模型實(shí)現(xiàn)過(guò)濾器<b class='flag-5'>驅(qū)動(dòng)程序</b>的<b class='flag-5'>開(kāi)發(fā)</b>設(shè)計(jì)

    VxWorks操作系統(tǒng)CompactPCI總線驅(qū)動(dòng)程序的設(shè)計(jì)

    VxWorks操作系統(tǒng)CompactPCI總線驅(qū)動(dòng)程序的設(shè)計(jì)(電源技術(shù)應(yīng)用 期刊)-該文檔為VxWorks操作系統(tǒng)
    發(fā)表于 08-31 16:09 ?17次下載
    VxWorks<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>下</b>CompactPCI<b class='flag-5'>總線</b><b class='flag-5'>驅(qū)動(dòng)程序</b>的設(shè)計(jì)

    VxWorks操作系統(tǒng)CompactPCI總線驅(qū)動(dòng)程序設(shè)計(jì)

    VxWorks操作系統(tǒng)CompactPCI總線驅(qū)動(dòng)程序設(shè)計(jì)(高頻開(kāi)關(guān)電源技術(shù)指標(biāo))-該文檔為VxWorks操作系統(tǒng)
    發(fā)表于 09-27 17:24 ?8次下載
    VxWorks<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>下</b>CompactPCI<b class='flag-5'>總線</b><b class='flag-5'>驅(qū)動(dòng)程序</b>設(shè)計(jì)