【问题标题】:How to request USB HID report descriptor from HID devices using UsbDeviceConnection on Android如何在 Android 上使用 UsbDeviceConnection 从 HID 设备请求 USB HID 报告描述符
【发布时间】:2018-08-30 22:38:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android usb hid


    【解决方案1】:

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

    UsbDeviceConnection.controlTransfer 需要 7 个变量:

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

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

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

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

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

    输出缓冲区是为交易返回分配的空间,应该是缓冲区大小指定的大小,解释如下。

    缓冲区大小描述报告描述符中的字节数。此值在配置描述符中指定,在特定于 HID 类的描述符 (bDescriptorType = 0x21) 中指定,并且是总共 9 个字节中的第 8 个字节 (wDescriptorLength) 的值。在我的例子中,这个值为 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 更有洞察力。

    【讨论】:

    • 谢谢,我用通用 USB 游戏手柄测试了它,它工作正常。
    • 知道如何使用上述方法(UsbDeviceConnection.controlTranfer)在 USB 读卡器中发出哔声吗?
    • 谢谢!这是一篇很棒的文章。我使用了一个长度为 4098 的缓冲区。 controlTransfer 返回实际的字节数,所以如果你的缓冲区至少与它需要的一样大,你就可以了。如果它返回 4098,您可能没有从足够大的缓冲区开始。这比进行另一个查询并读取该长度字节要容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2021-10-10
    • 2021-04-26
    • 2019-10-25
    • 2012-11-08
    • 2015-08-28
    相关资源
    最近更新 更多