完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,想请教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 <= 0x01) { // 是HID类设备,键盘/鼠标等 // 从描述符中分析出HID中断端点的地址 s = AnalyzeU2HidIntEndp(U2Com_Buffer, 0); // 从描述符中分析出HID中断端点的地址 PRINT("AnalyzeU2HidIntEndp %02xn", (uint16_t)s); // 保存中断端点的地址,位7用于同步标志位,清0 if_cls = ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->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 Readyn"); SetUsb2Speed(1); // 默认为全速 return (ERR_SUCCESS); } else if(if_cls == 2) { ThisUsb2Dev.DeviceType = DEV_TYPE_MOUSE; // 为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息 PRINT("U2 USB-Mouse Readyn"); 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) |
|
相关推荐
3个回答
|
|
|
|
|
|
559的USB主机例子跟ch583的完全一样,都是一个接口设备的主机枚举过程,没有复合设备的;
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
554 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2924 浏览 2 评论
2424 浏览 1 评论
907浏览 2评论
718浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
443浏览 1评论
570浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
837浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 16:25 , Processed in 1.066937 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号