我正在尝试使用UsbDeviceConnection.controlTransfer
来获取USB设备的HID报告描述符,因此我可以看到USB HID设备具有哪些按钮。
通过使用bulkTransfer
,我已经能够从HID设备获取实际的输入数据。
我已经查找了它,只能找到用于创建和解析HID报告描述符的教程。我尝试将不同的边界输入controlTransfer
,但我一直无法弄清楚。
我应该将什么值传递到controlTransfer
中以获取USB HID报告描述符,以便可以开始解析设备具有的按钮以及它们分配给的字节?还是不应该使用controlTransfer
来获取HID报告描述符?我是使用USB的新手。
答案 0 :(得分:0)
这确实很晚,但是如果您还没有提出解决方案或者其他人正在寻找解决方案,这就是我的解决方案。我应该提到,我对这些都不是很有经验,所以一些细节可能会漏掉,但是总的情况还是存在的。
UsbDeviceConnection.controlTransfer
需要7个变量:
请求类型描述了转移的方向,类型和接收者。在这种情况下,我们要使用标准(00)传输读取(1),并且要查询接口(00001)。我们想查询一个接口,因为HID是设备的接口。因此,0b10000001
或0x81
。
请求描述了我们的特定请求。我们正在寻找HID报告描述符,并且GET_DESCRIPTOR
被规范定义为0x06
。
请求值由描述符类型(高字节)和接口索引(低字节)组成。在我们的例子中,描述符类型是HID报告或0x22
(这是从HID规范中获得的,特别是类描述符)。接口的索引与下面的请求索引相同。就我而言,它是0x00
,但您的可能有所不同。结合高位和低位,我们得到0x2200
作为请求值。
请求索引指定要查询的界面。如果HID是设备的唯一接口,则它将为0x00
。否则,您将必须检查配置描述符中可用接口的类型及其索引。
输出缓冲区是为事务返回分配的空间,其大小应由缓冲区的大小指定,如下所述。
缓冲区大小描述了报告描述符中的字节数。该值在配置描述符中,在HID类特定的描述符(bDescriptorType
= 0x21
)中指定,并且是9个总数中的第8个字节(wDescriptorLength
)的值。在我的情况下,该值为104。
超时是要放弃的毫秒数。我使用了2000
。
将它们放在一起,UsbDeviceConnection.controlTranfer(0x81, 0x06, 0x2200, 0x00, byte[] buffer, 104, 2000)
。
https://www.beyondlogic.org/usbnutshell/usb6.shtml很好地概述了controlTransfer
中使用的位字段,请查看是否需要更多上下文。
https://eleccelerator.com/usbdescreqparser/是了解USB和HID描述符的极其有用的工具,比单独阅读规格表和API更有见地。