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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 如何編寫Windows CE.net的usb驅(qū)動程序(1)

          如何編寫Windows CE.net的usb驅(qū)動程序(1)

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

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

          本文引用地址:http://www.ex-cimer.com/article/149163.htm

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

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

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

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

          下面簡略介紹一下CE.NET中USB設(shè)備驅(qū)動開發(fā)的一些基礎(chǔ)知識。

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

          USB設(shè)備驅(qū)動程序主要和USBD打交道,所以我們必須詳細(xì)的了解USBD提供的函數(shù)。

          主要的傳輸函數(shù)有:

          AbourtTransferIssueControlTransfer

          CloseTransferIssueInterrupTransfer

          GetIsochResultIssueIsochTransfer

          GetTransferStatusIstransferComplete

          IssueBulkTransferIssueVendorTransfer

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

          AbortPipeTransfersClosePipe

          IsDefaultPipeHaltedIsPipeHalted

          OpenPipeResetDefaultPipe

          ResetPipe

          相應(yīng)的打包函數(shù)接口有:

          GetFrameLengthGetFrameNumberReleaseFrameLengthControl

          SetFrameLengthTakeFrameLengthControl

          取得設(shè)置設(shè)備配置函數(shù):

          ClearFeatureSetDescriptor

          GetDescriptorSetFeature

          GetInterfaceSetInterface

          GetStatusSyncFrame

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

          FindInterfaceRegisterClientDeviceId

          GetDeviceInfoRegisterClientSettings

          GetUSBDVersionRegisterNotificationRoutine

          LoadGenericInterfaceDriverTranslateStringDescr

          OpenClientRegisterKeyUnRegisterNotificationRoutine

          常見的WindowsCE.NET下USB的設(shè)備驅(qū)動程序的有以下幾種方法:

          ●流式接口函數(shù)

          這種驅(qū)動程序主要呈現(xiàn)流式函數(shù)接口,主要輸出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close,XXX_Read,XXX_Write,

          XXX_Seek,XXX_IOControl,XXX_PowerUp,XXX_PowerDown等流式接口,注意上述的幾個接口一定都要輸出,另外XXX必須為三個字符,否則會出錯。但是此類的驅(qū)動程序不是通過設(shè)備管理接口來加載的,所以必須手工的調(diào)用RegisterDevice()和DeregisterDevice()函數(shù)來加載和卸載驅(qū)動程序。用戶可以將此類的設(shè)備作為標(biāo)準(zhǔn)的文件來操作,只要調(diào)用相應(yīng)的文件操作就可以和驅(qū)動程序打交道。

          ●使用現(xiàn)有的WindowCE.NET的應(yīng)用程序接口

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

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

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

          USB設(shè)備驅(qū)動程序必須輸出的函數(shù)有:

          ●USBDeviecAttach

          當(dāng)USB設(shè)備連接到計算機(jī)上時,USBD模塊就會調(diào)用此函數(shù),這個函數(shù)主要用于初始化USB設(shè)備,取得USB設(shè)備信息,配置USB設(shè)備,并且申請必需的資源。

          ●USBInstallDriver

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

          ●USBUninstallDriver

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

          上述的三個函數(shù)接口是所有的USB驅(qū)動程序必須提供的,缺一不可。

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

          具體的配置舉個例子:

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

          [HKEY_LOCAL_MACHINEDriversUSBLoadClients2184_2457DefaultDefaultPDA]DLL=pda.dll

          需要注意的是注冊表構(gòu)成都是十進(jìn)制數(shù)值來標(biāo)識的,注意一下十進(jìn)制和十六進(jìn)制的轉(zhuǎn)換。

          再舉個USB鼠標(biāo)的例子,USB鼠標(biāo)是標(biāo)準(zhǔn)的HID設(shè)備,它的協(xié)議為:InterfaceClassCode為3(HID類),InterfaceSubclassCode為1(引導(dǎo)接口類),InterfaceProtocolCode為2(鼠標(biāo)協(xié)議類),所以它的注冊如下:

          [HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_2USBMouse]DLL=mouse.dll

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



          評論


          相關(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); })();