• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

    上述講了堆理論,可能讀者腦袋都已經大了,為此,我們舉個簡單的例子來詳細說明一下的開發過程。

    本文引用地址:http://www.czjhyjcfj.com/article/149162.htm

    例如我們有個USBMouse設備,設備信息描述如下:

    DeviceDescriptor:

    bcdUSB:0x0100

    bDeviceClass:0x00

    bDeviceSubClass:0x00

    bDeviceProtocol:0x00

    bMaxPacketSize0:0x08(8)

    idVendor:0x05E3(GenesysLogicInc.)

    idProduct:0x0001

    bcdDevice:0x0101

    iManufacturer:0x00

    iProduct:0x01

    iSerialNumber:0x00

    bNumConfigurations:0x01

    ConnectionStatus:DeviceConnected

    CurrentConfigValue:0x01

    DeviceBusSpeed:Low

    DeviceAddress:0x02

    OpenPipes:1

    EndpointDescriptor:

    bEndpointAddress:0x81

    TransferType:Interrupt

    wMaxPacketSize:0x0003(3)

    bInterval:0x0A

    可以看出上述設備有一個中斷PIPE,包的最大值為3??赡苡腥藛柹鲜龅闹翟趺吹玫降模瑆in2k的DDK中有個view的例程,編譯一下,將你的USB設備插到PC機的USB口中,運行view.exe即可看得相應的設備信息。

    有了這些基本信息,就可以USB設備了,首先聲明一下,下面的代碼取自微軟的USB鼠標樣本程序,版權歸微軟所有,此處僅僅借用來描述一下USB鼠標驅動的開發過程,讀者如需要引用此代碼,需要得到微軟的同意。

    首先,必須輸出USBD要求調用的三個函數,首先到設備插入到USB端口時,USBD會調用USBDeviceAttach()函數,相應的代碼如下:

    externCBOOL

    USBDeviceAttach(

    USB_HANDLEhDevice,//USB設備句柄

    LPCUSB_FUNCSlpUsbFuncs,//USBDI的函數集合

    LPCUSB_INTERFACElpInterface,//設備接口描述信息

    LPCWSTRszUniqueDriverId,//設備ID描述字符串。

    LPBOOLfAcceptControl,//返回TRUE,標識我們可以控制此設備,反之表示不能控制

    DWORDdwUnused)

    {

    *fAcceptControl=FALSE;

    //我們的鼠標設備有特定的描述信息,要檢測是否是我們的設備。

    if(lpInterface==NULL)

    returnFALSE;

    //打印相關的USB設備接口描述信息。

    DEBUGMSG(ZONE_INIT,(TEXT(USBMouse:DeviceAttach,IF%u,#EP:%u,Class:%u,Sub:%u,Prot:%urn),lpInterface->Descriptor.bInterfaceNumber,lpInterface->Descriptor.bNumEndpoints,lpInterface->Descriptor.bInterfaceClass,lpInterface->Descriptor.bInterfaceSubClass,lpInterface->Descriptor.bInterfaceProtocol));

    //初試數據USB鼠標類,產生一個接受USB鼠標數據的線程

    CMouse*pMouse=newCMouse(hDevice,lpUsbFuncs,lpInterface);

    if(pMouse==NULL)

    returnFALSE;

    if(!pMouse->Initialize())

    {

    deletepMouse;

    returnFALSE;

    }

    //注冊一個監控USB設備事件的回調函數,用于監控USB設備是否已經拔掉。

    (*lpUsbFuncs->lpRegisterNotificationRoutine)(hDevice,

    USBDeviceNotifications,pMouse);

    *fAcceptControl=TRUE;

    returnTRUE;

    }

    第二個函數是USBInstallDriver()函數,

    一些基本定義如下:

    constWCHARgcszRegisterClientDriverId[]=LRegisterClientDriverID;

    constWCHARgcszRegisterClientSettings[]=LRegisterClientSettings;

    constWCHARgcszUnRegisterClientDriverId[]=LUnRegisterClientDriverID;

    constWCHARgcszUnRegisterClientSettings[]=LUnRegisterClientSettings;

    constWCHARgcszMouseDriverId[]=LGeneric_Sample_Mouse_Driver;

    函數接口如下:

    externCBOOL

    USBInstallDriver(

    LPCWSTRszDriverLibFile)//@parm[IN]-ContainsclientdriverDLLname

    {

    BOOLfRet=FALSE;

    HINSTANCEhInst=LoadLibrary(LUSBD.DLL);

    //注冊USB設備信息

    if(hInst)

    {

    LPREGISTER_CLIENT_DRIVER_IDpRegisterId=(LPREGISTER_CLIENT_DRIVER_ID)

    GetProcAddress(hInst,gcszRegisterClientDriverId);

    LPREGISTER_CLIENT_SETTINGSpRegisterSettings=

    (LPREGISTER_CLIENT_SETTINGS)GetProcAddress(hInst,

    gcszRegisterClientSettings);

    if(pRegisterIdpRegisterSettings)

    {

    USB_DRIVER_SETTINGSDriverSettings;

    DriverSettings.dwCount=sizeof(DriverSettings);

    //設置我們的特定的信息。

    DriverSettings.dwVendorId=USB_NO_INFO;

    DriverSettings.dwProductId=USB_NO_INFO;

    DriverSettings.dwReleaseNumber=USB_NO_INFO;

    DriverSettings.dwDeviceClass=USB_NO_INFO;

    DriverSettings.dwDeviceSubClass=USB_NO_INFO;

    DriverSettings.dwDeviceProtocol=USB_NO_INFO;

    DriverSettings.dwInterfaceClass=0x03;//HID

    DriverSettings.dwInterfaceSubClass=0x01;//bootdevice

    DriverSettings.dwInterfaceProtocol=0x02;//mouse

    fRet=(*pRegisterId)(gcszMouseDriverId);

    if(fRet)

    {

    fRet=(*pRegisterSettings)(szDriverLibFile,

    gcszMouseDriverId,NULL,DriverSettings);

    if(!fRet)

    {

    //BUGBUGunregistertheClientDriver’sID

    }

    }

    }

    else

    {

    RETAILMSG(1,(TEXT(!USBMouse:ErrorgettingUSBDfunctionpointersrn)));

    }

    FreeLibrary(hInst);

    }

    returnfRet;

    }

    上述代碼主要用于產生USB設備需要的注冊表信息,需要注意的是:USB設備不使用標準的注冊表函數,而是使用RegisterClientDriverID()和RegisterClientSettings來注冊相應的設備信息。


    上一頁 1 2 3 4 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 宜宾县| 金山区| 曲阜市| 宜宾县| 乌什县| 如东县| 西昌市| 岳普湖县| 张家港市| 珠海市| 北安市| 赤水市| 临安市| 杭州市| 宝鸡市| 聊城市| 五指山市| 淮安市| 南昌县| 白朗县| 密山市| 新郑市| 治县。| 酒泉市| 紫云| 沙湾县| 阿克陶县| 大城县| 项城市| 忻州市| 昭苏县| 盐边县| 玉龙| 茂名市| SHOW| 长兴县| 扶绥县| 通州区| 师宗县| 辽中县| 福海县|