如何在Android上使用UsbDeviceConnection从HID设备请求USB HID报告描述符

时间:2018-08-30 22:38:26

标签: android usb hid

我正在尝试使用UsbDeviceConnection.controlTransfer来获取USB设备的HID报告描述符,因此我可以看到USB HID设备具有哪些按钮。

通过使用bulkTransfer,我已经能够从HID设备获取实际的输入数据。

我已经查找了它,只能找到用于创建和解析HID报告描述符的教程。我尝试将不同的边界输入controlTransfer,但我一直无法弄清楚。

我应该将什么值传递到controlTransfer中以获取USB HID报告描述符,以便可以开始解析设备具有的按钮以及它们分配给的字节?还是不应该使用controlTransfer来获取HID报告描述符?我是使用USB的新手。

1 个答案:

答案 0 :(得分:0)

这确实很晚,但是如果您还没有提出解决方案或者其他人正在寻找解决方案,这就是我的解决方案。我应该提到,我对这些都不是很有经验,所以一些细节可能会漏掉,但是总的情况还是存在的。

UsbDeviceConnection.controlTransfer需要7个变量:

  • 请求类型
  • 请求
  • 请求值
  • 请求索引
  • 输出缓冲区
  • 缓冲区大小
  • 超时

请求类型描述了转移的方向,类型和接收者。在这种情况下,我们要使用标准(00)传输读取(1),并且要查询接口(00001)。我们想查询一个接口,因为HID是设备的接口。因此,0b100000010x81

请求描述了我们的特定请求。我们正在寻找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更有见地。