关于PS/2键盘的一些资料,很全,推荐给大家

发 布 时 间 : 2008-11-19 来 源 : 立宇泰论坛 作 者 : noavay 浏 览 :
 [推荐]关于PS/2键盘的一些资料,很全,推荐给大家
pc的键盘控制器.
参考


历史

常用键盘包括:
USB 键盘 - 最近为所有的新机器所支持(Macintosh and IBM/compatible).
IBM/兼容 键盘 - 也称 "AT keyboards" 或者 "PS/2 keyboards", 现代pc都支持. 本文的主题.
ADB 键盘 - Apple Desktop Bus of older Macintosh systems.
原来的IBM 以及兼容机使用一种称作 "XT "的键盘. 现在不多见了,我们不介绍.后来IBM引入 AT 系统, AT之后是IBM PS/2. AT 键盘和 PS/2

键盘类似,是我们常用的键盘. PS/2 设备使用更小的连接器,支持更多一点的特性. 同时兼容AT, 新的特性几乎不使用.

IBM 的几种键盘:

IBM PC/XT 键盘 (1981):
83 个键
5-pin DIN 连接器
简单单向串口协议
使用扫描码 set 1
没有 host-to-keyboard 的命令

IBM AT 键盘 (1984) - 不兼容XT
84 到 101键
5-pin DIN 连接器
双向串口协议
使用扫描码 set 2
8个 host-to-keyboard 命令

IBM PS/2 键盘(1987) - 兼容AT
84 到 101 键
6-pin mini-DIN 连接器
双向串口协议
可选扫描码 set 3
17 个 host-to-keyboard 命令


今天买的键盘都兼容 PS/2 和 AT .所以今天的 "AT" 和 "PS/2" 有意义的只有他们的接口大小. 尽量不使用扩展特性.


现代兼容 AT-PS/2 键盘
任意键数目 (通常是101 或 104)
5-pin or 6-pin 连接器
双向串口协议
扫描码 set 2 肯定支持
应答所有的命令,但是可能并无此功能.



简单描述:

键盘包含一个由 keys组成的矩阵. 所有的键都为一个板上处理器监控,称作键盘编码器, (一般是i8048? 见下表).虽然这种芯片挺多,但是其职
能基本如下:
监控是哪个或那几个键被按下/释放,把相应的数据送到主板. 这个处理器处理所有的 debouncing(?what!) ,把数据缓存到他的16-byte 的缓冲区中. 在IBM兼容机上,主板也有一个板上芯片,称作键盘控制器.一般是8042. 他负责解码从键盘来的信息,通知系统软件各种事件.在host 和主板的通讯中 都使用IBM 协议.


现代键盘的encoders:
Holtek: HT82K28A, HT82K628A, HT82K68A, HT82K68E?EMC: EM83050, EM83050H, EM83052H, EM83053H,?Intel: 8048, 8049
Motorola: 6868, 68HC11, 6805
Zilog: Z8602, Z8614, Z8615, Z86C15, Z86E23


电器接口和协议:
AT 和 PS/2 键盘使用和 PS/2 鼠标一样的协议. 这里是协议的细节.
扫描码:
键盘处理器(encoder)大部分时间在"扫描", 监视着键矩阵. 一旦发现有键被按下,释放,或被按住不放,encoder就会向计算机发送一个数据包,称为扫描码. 有两种不同的扫描码, "make codes" 和 "break codes". make code 是键被按下,按住不放是产生的. break code 是键被释放时产生的. 每个键都有自己唯一的make code 和 break code. make code 和 break codes 的集合称为扫描码集. 共有三种标准的扫描码集.所有现代的键盘默认使用扫描码集 set 2.

详细情况见:
Scan Code Set 1 - 原来的 XT 扫描码集, 也有现代键盘支持此种东东.
Scan Code Set 2 - 现代键盘的缺省扫描码集.
Scan Code Set 3 - 可选的 PS/2 扫描码集,很少使用.

Make Codes, Break Codes, and Typematic Repeat:
a make code 和一个 ASCII 码之间并无固定的转换关系.尽管set 2的 make codes 大部分只有1个字节宽度, 但是有"extended keys" 的make codes 是2或4个字节宽,这些扩展键的make codes 的第一个字节总是 E0h.?每个键也有自己的唯一 break code(1). 但总是和make code有联系, 给程序设计带来不少方便. set 2 的大部分break codes 有2个字节宽,第一个字节是 F0h 第二个是那个键的make code. 扩展键的 Break codes 通常3个字节,前两个字节是E0h, F0h, 最后一个字节是那个键的 make code的最后一个字节.
按住一个键不放时,那个key 变成 typematic, 意味着键盘会不断的向主板发送那个键,直到释放他,或者另外一个键按下.这个过程有两个参数: typematic 延迟, typematic 速率. typematic 延迟从 0.25 秒到 1.00 秒, typematic 速率从 2.0 cps (characters per second) 到 30.0 cps. 可以使用"Set Typematic Rate/Delay" (0xF3) 命令改变这个值.如果多个键被按住不放,只有最后一个键成为typematic. 实际上,"Pause/Break" 键没有 break code(set 1,2).


i8042 :键盘控制器

以上的讨论都是针对硬件,其实,如果写一个底层的键盘相关的软件for PC,是不该直接和键盘通信的. 主板上一般都有键盘控制器,它在键盘和外设总线间是一个接口. 这个控制器处理 signal-level的东东和协议的细节 ,同时提供转换,解释,处理扫描码,执行命令的功能.
PC 的键盘一般使用Intel 8042/兼容 的微控制器.现代计算机上,这个功能一般集成到南桥 . 然而,这个设备逻辑上仍然叫做 "the 8042".基于主板的不同,键盘控制器可以工作于:"AT-兼容" 模式, 或者 "PS/2-兼容" 模式. 如果主板支持 PS/2 鼠标就会使用后者. 这时, 8042 既是键盘控制器又是鼠标控制器. 键盘控制器根据硬连线的方式自动决定工作于哪种模式.

8042 包含如下寄存器:

1字节的输入缓存 - 包含从键盘来的数据,只读
1字节的输出缓存 - 包含,要被写到键盘的数据;只写
1字节的状态寄存器 - 8 个状态位; 只读
1字节控制寄存器 - 7 个控制位; 读写?

前三个寄存器可以被cpu通过io端口0x60 and 0x64直接访问.最后一个必须使用"Read Command Byte" 命令读, 使用"Write Command Byte" 命令写.(见关于键盘的其他帖)

8042的端口在cpu的io空间地址如下:

port----Read/Write-----Function
0x60----Read----------Read Input Buffer
0x60----Write---------Write Output Buffer
0x64----Read----------Read Status Register
0x64----Write---------Send Command


写端口 0x64 不会写任何指定的寄存器, 只是给8042一个命令. 如果命令有参数,参数就送到端口0x60. 命令的返回值也从端口 0x60去读.
("input buffer" : input from the keyboard, "output buffer": output to be sent to the keyboard.)

键盘复位
加电时,(或者"Reset" 命令) , 键盘进行 BAT (Basic Assurance Test)并装载下面的缺省值:

Typematic delay 500 ms.
Typematic rate 10.9 cps.
*选择扫描码集 set 2.
*把所有键设置为 typematic/make/break 统统使能.

* 一些键盘可以改变,一些不能.

进入 BAT后, 三个 LED 点亮,BAT 完成之后熄灭.同时,BAT 代码返回给host: 0xAA (BAT successful) , 0xFC (Error). 许多键盘在BAT时忽略CLOCK 和 DATA 线, 直到BAT完成.因此, "禁止条件" (CLOCK line low) 不能键盘阻止向host发送BAT code.





参考资料
Adam's micro-Resources Home
Keyboard Scan Codes
PS/2 Mouse/Keyboard Protocol - Protocol used by AT and PS/2 keyboards.
Keyboard Code/Projects


上一篇:[推荐]一些电平标准 下一篇:ARM硬件电路设计系列(4部分)