我已经实现了一个旋转编码器来通过 HID 设备控制主机 PC 的音量。这是报告描述符:
0x05, 0x0C, /* Usage Page (Consumer). */
0x09, 0x01, /* Usage (Consumer Control). */
0xA1, 0x01, /* Collection (Application). */
0x85, 0x03, /* Report ID (3). */
0x05, 0x0C, /* Usage Page (Consumer). */
0x95, 0x02, /* Report Count (2). */
0x75, 0x01, /* Report Size (1). */
0x15, 0x00, /* Logical Minimum (0). */
0x25, 0x01, /* Logical Maximum (1). */
0x09, 0xE9, /* USAGE (Volume Increment). */
0x09, 0xEa, /* USAGE (Volume Decrement). */
0x81, 0x26, /* Input (Data,Var,Rel,No Wrap,Linear,No Preferred State,No Null Position). */
0xC0, /* End Collection. */
在 Linux 上,它可以完美运行。
在 Windows 10 上,它有一个非常奇怪的、可变的行为,具体取决于操作:
我指定数据是相对的,没有首选状态并且没有空位置。当我的设备停止发送报告时,为什么 Win10 在特定情况下自动重复该操作?
编辑(11 月 28 日 11:14):澄清一下,如果设备在每次非空报告后系统地发送空报告,则可以解决问题。尽管问题仍然存在,但为什么 Windows 自动重复输入明确配置为非重复类型。
音量增量和减量在HID 使用表中定义为重新触发控制,指定为“只要断言就触发重复事件”(3.4.1.5)。因此,如果您发送设置了两个位之一的报告,Windows 似乎会正确实现此行为。正如您所指出的,您需要发送空报告来清除重复。
旁注,将他们定义为亲戚对我来说似乎很可疑。它们应该是绝对的,它们旨在反映瞬时按钮的状态。
最后,如果您确实有一个旋钮,您宁愿将一个反映旋钮旋转量的有符号项目声明为“音量”(消费者页面,0xE0,定义为“线性控制”),您可以在其中实际使用相关项目。 这可能接近规范中的示例 A.2,其中包含 Volume 项目而不是 Tape Jog。比如:
0x05, 0x0c, // UsagePage (consumer)
0x09, 0x01, // Usage (ConsumerControl)
0xa1, 0x01, // Collection (Application)
0x15, 0x81, // LogicalMinimum (-127)
0x25, 0x7f, // LogicalMaximum (127)
0x75, 0x08, // ReportSize (8)
0x95, 0x01, // ReportCount (1)
0x09, 0xe0, // Usage (Volume)
0x81, 0x06, // Input (Variable|Relative)
0xc0, // EndCollection
这将允许将旋转速度反映为精确的体积变化。