|
|

本帖最后由 树袋熊 于 2014-11-19 01:07 编辑
之前流行一种说法:USB 口协议只支持 6 键无冲。如果想要多余 6 键无冲要么依赖驱动使用私有协议要么模拟多设备。两种方法都有问题。考虑到多于 6 键的无冲应用场景有限,一些厂商干脆放弃全键无冲,尽管其键盘电路本身是完全可以达到全键无冲的。
楼主以前也一直相信这个说法。这两天看了一些文章之后查了 USB HID 协议的原始定义,发现完全是没有根据的人云亦云。
(以下技术细节不感兴趣的直接跳过)
USB 协议的对于典型键盘设备有三段子协议。第一段就是所谓 boot mode,是兼容旧设备的备用协议。这一部分的格式实质上是写死的。其中对于非切换按键(alt shift 这些)总共有 6 字节的空间,对应 6 个 key code 。所谓 6 键无冲上限就是这么来的。
第二段是设备私有的通讯,也就是各家驱动捣鬼的地方,协议中没有标准定义。
第三段是在初始化时使用描述符构建的自定义格式。其具体变量是有标准定义的,但是组合方式是设备指定的。这一部分对于键盘的 keycode 可以直接用 bitmap 仅仅在 16 字节里枚举出键盘上的一百多个键。因此其无冲实际上是没有上限的。重点摘录如下:
The NKRO interface itself isn’t hard in theory. Some manufacturers do crazy stuff like pretend to be a bunch of keyboards which each have a standard 6-key interface. However a simple understanding of the HID spec and HID descriptors leads you to realise you can implement an NKRO interface simply by using a bitmap image of keycodes instead of individual bytes. This the same way the standard boot-protocol keyboard interface sends you the LED states. For scancodes, you tell it the first bit in the image corresponds to scancode 0, and the last bit in the image corresponds to scancode 128 (or whatever).
详细的描述见 IBM 静电容键盘改装的原文及其所使用的一、三段描述符。更具体的标准见这份 HID 教程的图 3 前后几页及尾部的示例。
以上得出的结论就是,在标准 USB HID 协议的范围内完全可以构建不模拟多键盘,同 BIOS 兼容,具有完整全键无冲,不产生稳定性或轮询频率问题的键盘输出,并且实现简单,对于设备没有任何特殊要求,同任何主流操作系统兼容。(实际的情况稍微复杂一点点,详见原文。)
键盘本身电路全键无冲的前提下,键盘厂商(尤其是大厂)不实现 USB 接口全键无冲完全是故意的。 |
|