a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

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

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

作者: 時間:2012-05-02 來源:網絡 收藏

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

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

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

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

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

這里我就不介紹USB的基本協議了,假設用戶已經熟悉了USB設備的一些基本的概念,并且對WinowsCE.NET的開發有一定的了解。

下面簡略介紹一下CE.NET中USB設備驅動開發的一些基礎知識。

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

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

主要的傳輸函數有:

AbourtTransferIssueControlTransfer

CloseTransferIssueInterrupTransfer

GetIsochResultIssueIsochTransfer

GetTransferStatusIstransferComplete

IssueBulkTransferIssueVendorTransfer

主要的用于打開和關閉USBD和USB設備之間的通信通道的函數有:

AbortPipeTransfersClosePipe

IsDefaultPipeHaltedIsPipeHalted

OpenPipeResetDefaultPipe

ResetPipe

相應的打包函數接口有:

GetFrameLengthGetFrameNumberReleaseFrameLengthControl

SetFrameLengthTakeFrameLengthControl

取得設置設備配置函數:

ClearFeatureSetDescriptor

GetDescriptorSetFeature

GetInterfaceSetInterface

GetStatusSyncFrame

與USB進行交互的實現方法相關的多任務函數:

FindInterfaceRegisterClientDeviceId

GetDeviceInfoRegisterClientSettings

GetUSBDVersionRegisterNotificationRoutine

LoadGenericInterfaceDriverTranslateStringDescr

OpenClientRegisterKeyUnRegisterNotificationRoutine

常見的WindowsCE.NET下USB的設備驅動程序的有以下幾種方法:

●流式接口函數

這種驅動程序主要呈現流式函數接口,主要輸出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必須為三個字符,否則會出錯。但是此類的驅動程序不是通過設備管理接口來加載的,所以必須手工的調用RegisterDevice()和DeregisterDevice()函數來加載和卸載驅動程序。用戶可以將此類的設備作為標準的文件來操作,只要調用相應的文件操作就可以和驅動程序打交道。

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

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

●創建指定到特定的USBD的用戶指定的API

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

USB設備驅動程序必須輸出的函數有:

●USBDeviecAttach

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

●USBInstallDriver

主要用于創建一個驅動程序加載所需的注冊表信息,例如讀寫超時,設備名稱等。

●USBUninstallDriver

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

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

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

具體的配置舉個例子:

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

[HKEY_LOCAL_MACHINEDriversUSBLoadClients2184_2457DefaultDefaultPDA]DLL=pda.dll

需要注意的是注冊表構成都是十進制數值來標識的,注意一下十進制和十六進制的轉換。

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

[HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_2USBMouse]DLL=mouse.dll

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



評論


相關推薦

技術專區

關閉