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

12下一页
我的人缘0

[心得] 关于键盘无冲的笔记

13 15620
楼主
跳转到指定楼层
发表于 2010-7-28 22:37 只看该作者 倒序浏览 阅读模式
本帖最后由 Saphire 于 2010-8-5 20:49 编辑

持续更新链接:https://docs.google.com/document ... G-Gai4tdAK72TEfzuSo

关于键盘无冲的笔记
1、无冲的定义


无冲分为多键无冲(Multi-key Rollover)和任意键无冲(N-key Rollover)。多键无冲(X-key),即任意X键同时按下可以被正确检测,也可以理解为已按下键盘上的任意(X-1)键,再按下任意一个键而不导致问题。而N-key Rollover则是键盘所有键的任意子集被按下都可被正确检测。详细解释请参见Wiki百科。http://en.wikipedia.org/wiki/Rollover_(key)

这里面主要的问题Wiki称之为幽灵键(key ghosting)和键干扰(key jaming)。幽灵键就是键按下或释放不能被系统识别,键干扰是A键的按下或释放影响B键的识别。

2、无冲的实现

按键事件从开关到主机,中间还相隔键盘控制器。无冲实现主要是两方面:键盘控制器可以无冲突检测按键,键盘控制器可以把检测到的按键事件发送到主机。

先说从开关按下到键盘控制器。如果每一个按键(开关,0和1)都独立的接入到控制器上,那么不存在冲突问题,但这样需要控制器有很大的IO通道,x键就需要x个通用IO,这在现实中很难办到的,或者说成本很高。现在的键盘实现基本上采用了扫描矩阵的方式实现,就是输入编码,把一维线性空间映射到二维空间上,这样增加维度,减小基半径。称这两个维度为行(Row)和列(Column),这样需要的IO数为Row+Column。实现上通常行固定为8,而列最早有14、16,现在主流实现是18和20。行固定为8通常是因为控制器多用8位单片机实现,一次可以读取所有行。扫描时逐列输出1,而检测行的方式来确定那些键被按下。冲突的原因和详细解释参照如下网址,有图有真相,解释了幽灵键和键干扰(其实是同因多果):http://www.dribin.org/dave/keyboard/one_html/

再说控制器到主机,通常控制器和主机之间通过串行协议来传输按键信息的,主要探讨目前主流的两种:PS2和USB。USB协议实际特指USB HID协议。两种协议因为历史原因,使用了不同方式来传输信息。PS2传输按键发生的两种事件,即沿逻辑,按下和释放。协议里称为通码和断码(make和break);USB传输按键的当前状态,即电平逻辑,当前有哪些键处于按下状态,释放的不管。实际上,控制器按键扫描自身是采集状态,即周期性扫描按键状态。如果是PS2,则要根据两次扫描的结果,分析是否有0-1跳变,生成按键事件上传。

根据上面论述,在PS2下,只要传输速度和带宽足够,如果扫描矩阵实现了无冲,而控制器又不做限制,那主机侧就是无冲的。

USB则一波三折,根据USB HID规范,发送按键消息的报文称为报告,报告的具体格式是由报告描绘符来描绘,报告描绘符又分成两种:启动模式正常模式。正常模式主机启动时根据键盘的USB枚举情况,从键盘控制器中读取报告描绘符。启动模式就是类似于bios设定这种情况,主机侧无需读取描绘符,使用主机内置的缺省描绘符。在缺省描绘符中,键盘报告使用8个字节来传输键盘状态。字节1是Modifier Key状态,就是左右Ctrl Alt Shift Win键的情况。字节2保留,剩下6个字节用来传输按键状态。这样最多通知主机6键按下。规范还规定,如果按键超过6个,要报错误。

从启动阶段进入OS阶段后,OS会对总线发出RESET命令,然后重新枚举设备,这时主机会读取报告描绘符,规范里的范例实现依然用了6个字节作为按键队列。但规范并没有限制是6个。而大多数新的操作系统,比如Windows和Linux也支持6个以上的按键状态,但是这里习惯又占了上风,既然规范范例是6个,保不齐那个主机侧实现硬编码为6个,为了最大的兼容性,或者说大多数制造商不关心这种用途,选择最稳妥的做法,这形成目前USB 6键无冲的局面。这样考虑的原因可能是在USB 1.1规范中,低速模式下Packet的上限是8字节。

这里面还有一个推波助澜者就是控制器芯片制造商,大多数键盘制造商没有选择使用通用控制器,来自己实现全部内容,包括USB HID协议栈和扫描矩阵相关程序,而是使用现成的键盘芯片,这种芯片固件中已经包含了一个键盘所需的全部功能,键盘制造商只需设计简单的外围电路,然后在固件中写入键盘扫描矩阵码和自己的标识信息,一枚键盘就出炉了。这种固件通常遵循规范的默认实现,即6键无冲。

3、USB如何实现无冲

从上面的描述可以看出,如果USB的报告描绘符部分声明了更大的按键队列,那么是可以突破6键无冲的。对于USB 1.1,有低速和全速两种模式,分别是1.5Mb和12Mb,在两种模式下Packet的限制分别是8和64。考虑64的情况下,同时发送的键为62。对于USB 2.0,高速模式下支持的包是1024,这样可以发送1022个键,但USB 2.0规范下,对于一个中断管道的端点,传输的包是64字节。这里详细情况可参照LUFA论坛上的一段讨论,顺便说一下,LUFA是Atmel USB系列芯片上USB协议栈的开源实现,里面就包含一个键盘的实现,有兴趣者可以参考。比如ATMEGA32自制一个USB键盘控制芯片。http://groups.google.com/group/myusb-support-list/browse_thread/thread/c57ceda4e153eb6e/e19e8c791256b083?#e19e8c791256b083

但是这样存在一个问题,对于主机侧不能正确解析报告描绘符的情况,这种实现可能出现兼容性问题,上面的讨论中也给出了建议,比如默认实现是6键,来适应BIOS和PDA的一些应用,通过开关切换进入62键的描绘符,实现准N-Key Rollover。

4、键盘开关

了解一下电容和电阻开关键盘。现在键盘的分类法逻辑不甚清析,比如机械和薄膜的定义就缺乏特征分类学上明确意义,仅仅是强调某个特征。细分下来,可以分成两个大的层面:电路特征和机械构造。机械构造又可细分为触发结构和支撑结构。触发结构和支撑结构通常会混合在一起实现,但是也有一些功能独立,以上是我个人的定义,更多阅读链接:Mechanical Keyboard Guide。举一些例子:
  • Model M也被称为机械键盘,但其触发结构是杠杆和开关薄膜,其支撑结构是轴体、杠杆和弹簧。电路特征是开关薄膜触点。链接:专利 4118611
  • cherry公司的MX轴其触发结构是侧壁上放置的弹性接触铜片和轴体的突触。由轴体上突触的变化,把垂直运动转换成水平运动,从而推动和释放铜片,而实现开合。早期的ALPS轴,以及其他一些轴类,其触发结构和支撑结构千变万化,电路特征多是铜片接触导通开关。
  • 薄膜键盘(通常意义上的薄膜,以下皆用此意),触发结构是开关薄膜和胶碗的突起,支撑结构是胶碗,少量包含弹簧。其中开关薄膜是三层,上下两层相对,印刷有石墨电路,中间的薄膜开孔。当有压力时,上层形变,和下层接触,开关导通。电路特征就是碳膜接触导通开关。
  • X结构的笔记本键盘,触发结构和薄膜键盘类似,但支持结构为X支架。
  • 微软的X4键盘支撑结构我不熟悉,想来和薄膜键盘类似,会有多种变形。触发结构和薄膜是一样的,不过触点涂的是电阻材料。微软自己称为电阻多触摸技术,根据压力不同,不同的接触面积有不同的阻值,得到的电流经过放大器,并转换为电压,再经过A/D,得到数值。这种技术可以得到压感,做出更复杂的产品。键盘只是简单应用。参考链接:《Keyboard Ghosting And The SideWinder X4》和《Pressure Sensitive Keyboard》,后面的链接中有一篇论文解释了电阻开关的原理和无冲技术。
  • Topre的电容键盘,参见链接:专利 4584444。触发结构是电介质锥形弹簧,支撑结构是弹簧和胶碗以及上面的轴体,电路特征是电容式接近开关,PCB上的两个触点是两个固定电极,锥形弹簧是电介质,弹簧形变导致电介质变化。引用此处的说明如下:通过C的变化从而使振荡频率变化,将此种变化传给F/V电路,引起F/V电路的输出电压变化。由锁相环CD4046组成的F/V变换电路将频率值变成电压值后。之后的处理和电阻开关类似,可以用比较器直接得到开关量,也可以经过A/D,在处理器内部处理。
0
已赞
微信分享 收藏
回复

使用道具 举报

我的人缘0
2
发表于 2010-7-28 23:55 只看该作者
不错~我看出LZ喜欢技术贴~
回复 支持 反对

使用道具 举报

我的人缘0
3
发表于 2010-7-29 08:47 只看该作者
{:1_089:}技术强帖
回复 支持 反对

使用道具 举报

我的人缘0
4
发表于 2010-7-29 09:30 只看该作者
原來我是X KEY..


好吧, 我是用X KEY 的MAN.
回复 支持 反对

使用道具 举报

我的人缘0
5
发表于 2010-7-29 23:46 只看该作者
很怀念当初那个转帖哥。。。。许久不见他了
回复 支持 反对

使用道具 举报

我的人缘0
6
发表于 2010-7-30 02:06 只看该作者
学习了~
回复 支持 反对

使用道具 举报

我的人缘0
7
发表于 2010-8-5 20:50 只看该作者
更新键盘开关部分,主要是电容和电阻开关。
回复 支持 反对

使用道具 举报

我的人缘0
8
发表于 2010-8-6 09:02 只看该作者
测试
值得玩味,多点普及知识帖子比那些无聊的瞎评论好多了,支持!
回复 支持 反对

使用道具 举报

我的人缘0
9
发表于 2010-8-6 09:31 只看该作者
技术好贴要顶啊
回复 支持 反对

使用道具 举报

我的人缘0
10
发表于 2010-8-6 12:02 只看该作者
测试
笔记不错,只是估计没几个人能看懂
回复 支持 反对

使用道具 举报

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

本版积分规则