HID 报告请求

问题描述

我很难使用嵌入式控制器作为主机与 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 作为 init 消息,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
bmAttributes 0x80
(总线供电)
最大功率 500mA\

接口描述符:
b长度9
bDescriptorType 4
b接口编号 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 人机接口设备
bInterfaceSubClass 0
b接口协议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
bmAttributes 3
传输类型中断
同步类型 无
使用类型数据
wMaxPacketSize 0x0040 1x 64 字节
b间隔46

非常感谢任何指导或帮助,
-贾斯汀

解决方法

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

req.wValue = (USB_DT_STRING