|
|

本帖最后由 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,在处理器内部处理。
|
|