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

Gra*_*nen 3 usb android hid

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

我已经能够通过使用bulkTransfer.

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

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

小智 5

这真的很晚了,但如果您还没有提出解决方案或其他人正在寻求这样做,这就是我的解决方案。我应该提一下,我对这方面的经验不是很丰富,所以可能会丢失一些细节,但大致情况是存在的。

UsbDeviceConnection.controlTransfer 需要 7 个变量:

  • 请求类型
  • 要求
  • 请求值
  • 请求索引
  • 输出缓冲器
  • 缓冲区大小
  • 暂停

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

请求描述了我们的具体请求。我们正在寻找 HID 报告描述符GET_DESCRIPTOR按照0x06规范进行定义。

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

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

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

缓冲区大小描述了报告描述符中的字节数。该值在配置描述符中指定,在 HID 类特定描述符 ( bDescriptorType= 0x21) 中,并且是wDescriptorLength9个字节中第 8 个字节 ( )的值。在我的例子中,这个值是 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 更有见地。