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

How to request USB HID report descriptor from HID devices using UsbDeviceConnection on Android

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

我已经能够使用 bulkTransfer.

从 HID 设备获取实际输入数据

我查了一下,只能找到创建和解析 HID 报告描述符的教程。我试过在不同的范围内输入 controlTransfer,但一直无法弄清楚。

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

这真的很晚了,但如果您还没有想出解决方案或其他人正在寻找解决方案,这就是我的解决方案。我应该提一下,我对这些都不是很有经验,所以一些细节可能不对,但总体情况就在那里。

UsbDeviceConnection.controlTransfer 需要 7 个变量:

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

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

请求描述了我们的具体请求。我们正在寻找 HID 报告 描述符 并且 GET_DESCRIPTOR 被规范定义为 0x06

请求值由描述符类型高字节和接口索引低字节组成。在我们的例子中,描述符类型是 HID 报告或 0x22(这来自 HID 规范,特别是 class 描述符)。接口索引与下面的请求索引相同。在我的例子中是 0x00,但你的可能不同。结合高位和低位,我们得到 0x2200 作为我们的请求值。

请求索引指定查询的接口。如果 HID 是设备的唯一接口,那么这将是 0x00。否则,您将必须检查可用接口类型及其索引的配置描述符。

输出缓冲区 是为事务的 return 分配的 space,其大小应由缓冲区大小指定,如下所述。

缓冲区大小描述了报告描述符中的字节数。该值在 HID class 特定描述符 (bDescriptorType = 0x21) 的配置描述符中指定,并且是第 8 个字节 (wDescriptorLength) 的值共9个。在我的例子中这个值是 104.

Timeout 是多少毫秒后放弃。我用了 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 更有见地。