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


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数组由键/值对组成,如果可以这样称呼的话。例如第二行: 0x05,0x01指示键0x05,这是“ 用法”页面,而0x01是指示通用桌面的值

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

USAGE_PAGE == 0x05

例如

COLLECTION == 0xA1

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

我只是想知道,我是否真的很想念此键/值参考文档?

在线上有大量示例,例如以下链接: http //www.frank-zhao.com/cache/hid_tutorial_1.php

但这甚至引用了诸如 END_COLLECTION == 0xc0之

在哪里可以找到这些值的参考?我想念什么?


看来我将不得不使用USB描述符工具来构建HID描述符。:)
josef.van.niekerk 2013年

Answers:


20

USB文档非常糟糕。它受到过度泛化的困扰,他们试图使所有东西变得如此泛泛而通用,以至于很难从文档移植到任何特定的应用程序。

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

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

例如,关于0xA1: 在此处输入图片说明

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

你可以看到 END COLLECTION其指定为0b1100_00nn,而nn被忽略了。这是来自哪里0xC0

您还可以开始了解其他参数的构造方式。例如,LOGICAL MINIMUM0x250b0010_0101。由此可见,我们的数据长度为0bnnnn_nn01,或一个字节,并且指定符为LOGICAL MINIMUM IS0b0010_01nn

在此处输入图片说明

的结构 USAGE PAGE描述符相同。选择使用情况页面的命令是0000_01nn,并nnnn_nn01指示它是1个字节长。我猜想,由于文档指出用法页为32位,因此假定高位为零,或从文档的另一部分推论得出。我实际上不知道如何指定它们。

还有就是各种HID常数的一个很好的页面在这里

而且从BSD源的一个较新版本在这里(谢谢,@crazysim!)(最新HEAD,可能不会持续)。


正是我所需要的。非常感谢您的深入回答。确实有很大帮助!;)
josef.van.niekerk

1
@ josef.van.niekerk-没问题。进入USB标准已经有一段时间了,就像我记得的那样,它们是不透明的。
康纳·沃尔夫,

我为挖墓而道歉,但指向USB.org的链接不再起作用。
罗伯·范德维尔

1
@RobvanderVeer应该现在修复。
hoosierEE

1
是否应该从FreeBSD源中将 “各种HID常量的好页面”更改为该文件的更高版本?
crazysim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.