在哪里查找用于构建 USB HID 描述符的值?

电器工程 USB 隐藏
2022-01-30 11:08:10

我正在尝试对自己进行一些关于在 C 中为我想尝试的 PIC32 USB 项目创建 USB HID 描述符的教育。

我已经从http://www.usb.org/developers/hidpage/下载了 HID 使用表文档,并试图找出 HID 描述符中不同元素的实际值在哪里表示。

让我用我正在查看的示例的摘录来解释:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

从上面的例子中,很明显 BYTE 数组是由键/值对组成的,如果我可以这么称呼它的话。例如第2行:0x05,0x01表示键0x05,即Usage Page,0x01表示Generic Desktop的值

我试图找出这些值在 HID 使用表 PDF 文档中的位置。例如,我找不到任何参考

USAGE_PAGE == 0x05

例如

COLLECTION == 0xA1

我尝试在 PDF 中搜索 0xA1,没有结果。我能够找出这些值的唯一方法是查看示例的注释,或者使用上面链接中的USB 描述符工具

我只是想知道,我是否完全因为缺少这个键/值参考文档而感到愚蠢?

网上有很多例子,比如下面的链接:http ://www.frank-zhao.com/cache/hid_tutorial_1.php

但即使这引用了大量的字符串值,如END_COLLECTION == 0xc0

我在哪里可以找到这些值的参考?我错过了什么?

1个回答

USB 文档非常糟糕。它受到过度泛化的困扰,他们试图使所有内容都如此通用和通用,以至于很难从文档中获得任何特定的应用程序。

描述符格式位于您提供的 usb.org 链接中名为“ HID 的设备类定义”的文档中。

您缺少的关键是各个段(例如 0x05)未使用前缀0x记录。事实上,它们通常用原始二进制文件描述它们。

例如,关于 0xA1: 在此处输入图像描述

可以看到二进制前缀1010_00nn表示is是一个集合,后缀nnnn_nn01表示它是1字节长。然后随后的字节被解释为集合类型,在这种情况下为类型应用程序。然后设置解释进一步字节的上下文,直到 HID 描述符解析器看到另一个集合标记或结束集合标记。

您可以看到它END COLLECTION被指定为0b1100_00nn,nn被忽略。这就是它的0xC0来源。

您还可以开始了解其他参数是如何构造的。例如,LOGICAL MINIMUM0x250b0010_0101从那里,我们可以看到我们有一个数据长度0bnnnn_nn01,或者一个字节,并且说明符LOGICAL MINIMUM0b0010_01nn

在此处输入图像描述

描述符的结构USAGE PAGE是相同的。选择使用页面的命令为0000_01nnnnnn_nn01表示为 1 字节长。我猜想,由于文档声明使用页面是 32 位,因此假设高位为零,或者从文档的另一部分推断。我实际上不知道它们是如何指定的。

这里有各种 HID 常量的好页面

以及来自 BSD 来源的更新版本谢谢,@crazysim!)(最新的HEAD,可能不会持续)。