HID 报告请求

Posted

技术标签:

【中文标题】HID 报告请求【英文标题】:HID report Request 【发布时间】:2021-04-26 05:58:47 【问题描述】:

我很难与使用嵌入式控制器作为主机的 USB 读卡器进行通信。以极大的耐心,我已经能够发送控制事务和操作 LED,并且当插入卡时,我能够在 IN 管道上接收状态更新。我无法做的是在控制管道上发送我认为应该是报告请求以请求卡数据。

我的问题是如何设置此报告请求以让 HID 读卡器向我发送卡数据(报告 ID = 0x65,使用 ID = 0x61C)?如果我的理解是正确的,这应该归结为对设置数据包中标志的简单操作,但对于我的一生,我无法弄清楚哪些是正确的。

以下代码用于设置在控制 EP 上发送的 set_config 事务 操纵 LED 并且众所周知:

//Format the setup transaction 
req.bmRequestType = USB_REQ_DIR_OUT         |   // 7    - Transfer is OUT   
                    USB_REQ_TYPE_CLASS      |   // 5,6  - Transfer type is Class 
                    USB_REQ_RECIP_INTERFACE;    // 4    - recipient is the device

//Set the request type to USB_REQ_SET_CONFIGURATION
req.bRequest = USB_REQ_SET_CONFIGURATION;   

//Set the descriptor type to string
req.wValue = (USB_DT_STRING << 8) | usb_dt;     //wValue type. On Linux ==> 0x302 for init msg,
                                                //                          0x35f for led on control

req.wIndex = 0;                         
req.wLength = len;  

该函数使用传入 0x302 的值作为初始化消息,使用 0x35f 进行 LED 控制。然后它开始传输,该传输移动包含所需命令的索引 0 处的报告 ID 的缓冲区,然后是一些数据(RGB 值)。

最后这里是我正在使用的设备的描述符:

设备描述符: b长度 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x6352 idProduct 0x240a bcdDevice 3.01 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 配置描述符: b长度 9 bDescriptorType 2 wTotalLength 0x0022 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 3 bm属性 0x80 (巴士供电) 最大功率 500mA\

接口描述符: b长度 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 人机接口设备 bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 4\

HID 设备描述符: b长度 9 bDescriptorType 33 bcdHID 1.11 bCountryCode 0 不支持 bNumDescriptors 1 bDescriptorType 34 报告 wDescriptorLength 730\

端点描述符: b长度 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bm属性 3 传输类型中断 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔46

任何指导或帮助将不胜感激, -贾斯汀

【问题讨论】:

【参考方案1】:

啊哈!我没有意识到 16 位 wValue 字段需要包含报告 ID。 解决方案有两个,首先将有效负载的第一个字节设置为应用程序级别的报告 ID。然后在问题中显示的低级请求描述符中设置 wValue 字段,如下所示:

req.wValue = (USB_DT_STRING

【讨论】:

以上是关于HID 报告请求的主要内容,如果未能解决你的问题,请参考以下文章

USB鼠标实现——HID 报告的返回

HID 游戏手柄报告描述符问题

Python PyUSB HID 功能报告

浅析USB HID ReportDesc (HID报告描述符)

使用 PyUSB 发送 HID 报告

USB HID多点触控串行报告