<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 如何編寫(xiě)Windows CE.net的usb驅動(dòng)程序(1)

如何編寫(xiě)Windows CE.net的usb驅動(dòng)程序(1)

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

隨著(zhù)USB設備的普及,擺在開(kāi)發(fā)人員面前的驅動(dòng)開(kāi)發(fā)任務(wù)也是越來(lái)越繁重了,特別是對于一些嵌入式開(kāi)發(fā)廠(chǎng)商來(lái)講,由于設備所采用的操作系統不同,相應的硬件接口也是不一樣的,開(kāi)發(fā)相關(guān)的USB更是難上加難。CE.NET是微軟推出的功能強大的嵌入式操作系統,國內采用此操作系統的廠(chǎng)商已經(jīng)很多了,本文就以windowsce.net為例,簡(jiǎn)單介紹一下開(kāi)發(fā)windowsce.net下的USB。

本文引用地址:http://dyxdggzs.com/article/149163.htm

首先要熟悉一些USB的基本概念,當然最好把USB1.1的協(xié)議看一遍,(當然現在2。0的協(xié)議都已經(jīng)有了)http://www..org

上可以下載,我記得好像有個(gè)中文版的,翻譯的還可以,http://www.driverdevolep.com

上有的,具體位置記不太清楚了,中文版的協(xié)議可以快速翻一邊,了解一些基本的概念,但是設計到一些關(guān)鍵性的東西最好還是看英文版的心里比較清楚些。

這里我就不介紹USB的基本協(xié)議了,假設用戶(hù)已經(jīng)熟悉了USB設備的一些基本的概念,并且對WinowsCE.NET的開(kāi)發(fā)有一定的了解。

下面簡(jiǎn)略介紹一下CE.NET中USB設備驅動(dòng)開(kāi)發(fā)的一些基礎知識。

CE.NET的USB系統軟件分為兩層:USBClient設備和底層的WindowsCE實(shí)現的函數層。USB設備驅動(dòng)程序主要負責利用系統提供的底層接口配置設備,和設備進(jìn)行通訊。底層的函數提本身又由兩部分組成,通用串行總線(xiàn)驅動(dòng)程序(USBD)模塊和較低的主控制器驅動(dòng)程序(HCD)模塊。HCD負責最最底層的處理,USBD模塊實(shí)現較高的USBD函數接口。USB設備驅動(dòng)主要利用USBD接口函數和他們的外圍設備打交道。

USB設備驅動(dòng)程序主要和USBD打交道,所以我們必須詳細的了解USBD提供的函數。

主要的傳輸函數有:

AbourtTransferIssueControlTransfer

CloseTransferIssueInterrupTransfer

GetIsochResultIssueIsochTransfer

GetTransferStatusIstransferComplete

IssueBulkTransferIssueVendorTransfer

主要的用于打開(kāi)和關(guān)閉USBD和USB設備之間的通信通道的函數有:

AbortPipeTransfersClosePipe

IsDefaultPipeHaltedIsPipeHalted

OpenPipeResetDefaultPipe

ResetPipe

相應的打包函數接口有:

GetFrameLengthGetFrameNumberReleaseFrameLengthControl

SetFrameLengthTakeFrameLengthControl

取得設置設備配置函數:

ClearFeatureSetDescriptor

GetDescriptorSetFeature

GetInterfaceSetInterface

GetStatusSyncFrame

與USB進(jìn)行交互的實(shí)現方法相關(guān)的多任務(wù)函數:

FindInterfaceRegisterClientDeviceId

GetDeviceInfoRegisterClientSettings

GetUSBDVersionRegisterNotificationRoutine

LoadGenericInterfaceDriverTranslateStringDescr

OpenClientRegisterKeyUnRegisterNotificationRoutine

常見(jiàn)的WindowsCE.NET下USB的設備驅動(dòng)程序的有以下幾種方法:

●流式接口函數

這種驅動(dòng)程序主要呈現流式函數接口,主要輸出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close,XXX_Read,XXX_Write,

XXX_Seek,XXX_IOControl,XXX_PowerUp,XXX_PowerDown等流式接口,注意上述的幾個(gè)接口一定都要輸出,另外XXX必須為三個(gè)字符,否則會(huì )出錯。但是此類(lèi)的驅動(dòng)程序不是通過(guò)設備管理接口來(lái)加載的,所以必須手工的調用RegisterDevice()和DeregisterDevice()函數來(lái)加載和卸載驅動(dòng)程序。用戶(hù)可以將此類(lèi)的設備作為標準的文件來(lái)操作,只要調用相應的文件操作就可以和驅動(dòng)程序打交道。

●使用現有的WindowCE.NET的應用程序接口

此類(lèi)設備主要是利用WindowsCE.NET中已經(jīng)有了現成的函數接口,例如USBMassStorageDisk,它主要利用現有的WindowsCE.Net中已經(jīng)有的可安裝文件系統接口,呈現給系統可用的文件系統,對于用戶(hù)來(lái)講,它是透明的,用戶(hù)僅僅感覺(jué)在操作一個(gè)文件夾。

●創(chuàng )建指定到特定的USBD的用戶(hù)指定的API

這種方法在USBD呈現設備時(shí)不需要任何限制,主要是特制的提供API給用戶(hù),一般不太常見(jiàn)。

USB設備驅動(dòng)程序必須輸出的函數有:

●USBDeviecAttach

當USB設備連接到計算機上時(shí),USBD模塊就會(huì )調用此函數,這個(gè)函數主要用于初始化USB設備,取得USB設備信息,配置USB設備,并且申請必需的資源。

●USBInstallDriver

主要用于創(chuàng )建一個(gè)驅動(dòng)程序加載所需的注冊表信息,例如讀寫(xiě)超時(shí),設備名稱(chēng)等。

●USBUninstallDriver

主要用于釋放驅動(dòng)程序所占用的資源,以及刪除USBInstallDriver函數創(chuàng )建的注冊表等。

上述的三個(gè)函數接口是所有的USB驅動(dòng)程序必須提供的,缺一不可。

另外比較重要的是USB設備驅動(dòng)程序的注冊表配置,一般的USB設備驅動(dòng)程序的注冊表配置在HKEY_LOCAL_MACHINEDriversUSBLoadClients下,每個(gè)驅動(dòng)程序的子鍵都有Group1_IDGroup2_IDGroup3_IDDriverName格式,如果注冊表信息與USB設備信息符合,USBD就會(huì )加載此驅動(dòng)程序。否則設備的子鍵應該由供應商,設備類(lèi)和協(xié)議信息通過(guò)下劃線(xiàn)組成。

具體的配置舉個(gè)例子:

例如你有個(gè)PDA設備,它具有一個(gè)USB接口,它的供應廠(chǎng)商ID假設為0x0888,設備ID為0x0999,沒(méi)有使用特殊的協(xié)議,那么它的加載注冊表應該寫(xiě)為:

[HKEY_LOCAL_MACHINEDriversUSBLoadClients2184_2457DefaultDefaultPDA]DLL=pda.dll

需要注意的是注冊表構成都是十進(jìn)制數值來(lái)標識的,注意一下十進(jìn)制和十六進(jìn)制的轉換。

再舉個(gè)USB鼠標的例子,USB鼠標是標準的HID設備,它的協(xié)議為:InterfaceClassCode為3(HID類(lèi)),InterfaceSubclassCode為1(引導接口類(lèi)),InterfaceProtocolCode為2(鼠標協(xié)議類(lèi)),所以它的注冊如下:

[HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_2USBMouse]DLL=mouse.dll

到此為止,我們可以看出,其實(shí)驅動(dòng)開(kāi)發(fā)無(wú)非做兩件事情,一件是和硬件打交道,另外一件是和操作系統打交道。舉個(gè)簡(jiǎn)單的例子,例如:我們需要開(kāi)發(fā)一個(gè)USB鼠標驅動(dòng)程序,我們就需要了解USB鼠標硬件上是怎么發(fā)送數據的?操作系統怎么才能得到鼠標的控制事件?其實(shí)USB鼠標是有一個(gè)中斷PIPE的,用于傳送鼠標產(chǎn)生的數據,WindwosCE.NET中有個(gè)接口函數叫做mouse_event(),專(zhuān)門(mén)用于產(chǎn)生鼠標事件,但是它是不關(guān)心具體什么硬件的,甚至我們自己在應用程序中調用這個(gè)函數都可以實(shí)現模擬鼠標,對應的有個(gè)keybd_event(),用于產(chǎn)生鍵盤(pán)事件,知道了這個(gè)就好辦多了,只要將相應的數據轉換一下,調用一下mouse_event()即可



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>