想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程

您所在的位置:网站首页 关于请教的例子 想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程

想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程

2024-04-10 12:00| 来源: 网络整理| 查看: 265

如题,想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程?

例程的usb hid类枚举过程,从代码中可发现,只支持只有一个接口的Mouse与KEYBOARD设备;

                /* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */                 cfg = ((PUSB_CFG_DESCR)U2Com_Buffer)->bConfigurationValue;                 if_cls = ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码                    if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->itf_descr.bInterfaceSubClass itf_descr.bInterfaceProtocol;                     s = CtrlSetUsb2Config(cfg); // 设置USB设备配置                     if(s == ERR_SUCCESS)                     {                         //      Set_Idle( );                         // 需保存端点信息以便主程序进行USB传输                         ThisUsb2Dev.DeviceStatus = ROOT_DEV_SUCCESS;                             if(if_cls == 1)                             {                                 ThisUsb2Dev.DeviceType = DEV_TYPE_KEYBOARD;                                 // 进一步初始化,例如设备键盘指示灯LED等                                 PRINT("U2 USB-Keyboard Ready\n");                                 SetUsb2Speed(1); // 默认为全速                                 return (ERR_SUCCESS);                             }                             else if(if_cls == 2)                             {                                 ThisUsb2Dev.DeviceType = DEV_TYPE_MOUSE;                                 // 为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息                                 PRINT("U2 USB-Mouse Ready\n");                                 SetUsb2Speed(1); // 默认为全速                                 return (ERR_SUCCESS);                             }else{                             }                         s = ERR_USB_UNSUPPORT;                     }                 }

但是我们公司开发的设备都是custom hid类设备;一般都是Joystick,mouse,keyboard多个接口的复合;

我打算先判断接口数量bNumInterfaces,然后获取各个接口的bInterfaceProtocol,如果bInterfaceProtocol=0则为复合或其他设备,然后判断各个接口下的报告描述符的Usage 部分从而判断该接口是Mouse接口,还是gamepad或其他;

Usage Page (Generic Desktop)05 01 Usage (Mouse)09 02 

请问这个解析复合设备过程是否有例程可参考,或请给我一些建议;

另外

hisUsb2Dev.DeviceType = DEV_TYPE_KEYBOARD;

里面的

#define DEV_TYPE_KEYBOARD      (USB_DEV_CLASS_HID | 0x20)

#define DEV_TYPE_MOUSE         (USB_DEV_CLASS_HID | 0x30)

typedef struct {     uint8_t  DeviceStatus;  // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功     uint8_t  DeviceAddress; // 设备被分配的USB地址     uint8_t  DeviceSpeed;   // 0为低速,非0为全速     uint8_t  DeviceType;    // 设备类型     uint16_t DeviceVID;     uint16_t DevicePID;     uint8_t  GpVar[4];     // 通用变量,存放端点     uint8_t  GpHUBPortNum; // 通用变量,如果是HUB,表示HUB端口数 } _RootHubDev;

我想问一下_RootHubDev.DeviceType 是自定义的吗?是否可以作以下定义

#define DEV_TYPE_KEYBOARD      (USB_DEV_CLASS_HID | 0x20)

#define DEV_TYPE_MOUSE         (USB_DEV_CLASS_HID | 0x30)

#define DEV_TYPE_GAMEPAD      (USB_DEV_CLASS_HID | 0x40)

#define DEV_TYPE_JOYSTICK         (USB_DEV_CLASS_HID | 0x50)

#define DEV_TYPE_OTHER         (USB_DEV_CLASS_HID | 0x60)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3