外设天下 - 电脑外设发烧友聚集地

我的人缘0

[资料] 有关 USB 口无冲的问题

9 35500
楼主
跳转到指定楼层
发表于 2014-11-19 01:04 只看该作者 倒序浏览 阅读模式
本帖最后由 树袋熊 于 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 接口全键无冲完全是故意的。
0
已赞
微信分享 收藏
回复

使用道具 举报

我的人缘0
2
发表于 2014-11-19 09:01 只看该作者
這樣好的事怎可能沒有廠商願意搞..
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

我的人缘0
3
发表于 2014-11-19 09:50 只看该作者
感谢楼主分享这么有意义的技术文章,关于HID部分已经存档,准备慢慢研究。
[发帖际遇]: mekchen 扣mekchen不是目的,目的是扣发烧值。 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

我的人缘0
4
发表于 2014-11-19 12:01 只看该作者
2087 u口无冲,一直无问题
回复 支持 反对

使用道具 举报

我的人缘0
5
发表于 2014-11-19 12:12 只看该作者
测试
好高端的样子
回复 支持 反对

使用道具 举报

我的人缘0
6
发表于 2014-11-19 14:25 只看该作者
这个要顶 !
还有我发现 如果两个全键无冲的键盘查到一个电脑上 同时 按就会出问题
回复 支持 反对

使用道具 举报

我的人缘0
7
发表于 2014-11-19 23:08 只看该作者
既然技术上没问题,那为什么没有厂商搞USB全无冲呢?行业潜规则?

点评

潜规则倒不至于。超过 6 键无冲除非多人分屏操作否则确实意义不大。我这贴只是纯粹从标准协议下可不可行的角度说。  详情 回复 发表于 2014-11-20 15:43
回复 支持 反对

使用道具 举报

我的人缘0
8
发表于 2014-11-20 15:43 只看该作者
zhangjikun16888 发表于 2014-11-19 23:08
既然技术上没问题,那为什么没有厂商搞USB全无冲呢?行业潜规则?

潜规则倒不至于。超过 6 键无冲除非多人分屏操作否则确实意义不大。我这贴只是纯粹从标准协议下可不可行的角度说。
回复 支持 反对

使用道具 举报

我的人缘0
9
发表于 2014-11-20 17:27 只看该作者
以前确实很疑惑,小厂都能做到全键无冲大厂为什么就不愿意呢?接了PS2口在行
回复 支持 反对

使用道具 举报

我的人缘0
10
发表于 2015-3-26 19:11 只看该作者
测试
学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则