异常 USB HID 报告

Unusual USB HID Reports

最近检查了一些 Zalman 键盘,嗅探我收到的 USB 报告:

键'3'在键盘上按下:

00 00 00 00 00 01 00 00 00 00 00

键 '3' + '2' 按下:

00 00 00 00 80 01 00 00 00 00 00

键 '3' + '2' + '1' 按下:

00 00 00 00 C0 01 00 00 00 00 00

我的问题是那是什么?这绝对不是 usb hid 用法代码。在哪里可以找到翻译 table?像这样的东西: USB HID to PS/2 Scan Code Translation Table - Microsoft

你按下的三个键似乎都对应了报告中的一位。该位为1表示按下该键,该位为0表示未按下。

HID 允许键盘定义自己的报告格式。您可以查看键盘向计算机报告的 HID 描述符,以了解报告格式应该是什么。

我在研究我的 HID 解析器的一个错误时偶然发现了这个问题。

为了它的价值,我将根据我对这里发生的事情的解释向已接受的答案添加几点。

In the HID Usage Table spec,它为 Keyboard/Keypad 使用页面指定以下内容:

The usage type of all key codes is Selectors (Sel), except for the modifier keys Keyboard Left Control (0x224) to Keyboard Right GUI (0x231) which are Dynamic Flags (DV).

因此,键代码将被解释为选择器。

查看定义选择器类型的部分 (3.4.2.1),它指出具有“Sel”类型的输入标签将设置 Array 标志。

到目前为止,我一直在根据 Array 标志的存在来解释关键代码字段,但是一个不起作用的随机键盘让我进一步研究了这一点。

我在重读时发现该规范“偷偷摸摸”地陷入了困境……上述 Array 规则的例外情况。

在下面的同一部分中,它描述了选择器如何以三种形式出现。最后一种形式适用于我的问题:

Any selection of a set. The control is implemented as a set of bit fields in which each bit represents a single selection. This control is defined by a Main item with the Variable flag set and the Report Size equal to 1. The Report Count will be equal to the number of selections in the set.

原来这是用于在有问题的报告描述符中指定关键代码的方法。

...键盘页面上每个可用的用法 ID 一位,加上备用。报告中的 240 个字段代表每个可能的键码。考虑到键盘的键翻转为 6,这是描述报告的一种相当疯狂的方式,我敢肯定他们的理由中一定有我遗漏的东西。

无论如何,规范说它没问题,所以我更新了我的 HID 解析器来处理这种情况。

所以我基本上重申了大卫已经说过的话,但我相信这就是为什么会这样的基本原理。