常见鼠标种类有四种:总线鼠标、串行鼠标、PS/2鼠标和USB鼠标。下面是鼠标键盘与系统之间关系的示意图:
做了一个文本示意图,大家就着吧。
+--------------------------+
| |
+--------------->| |<---------------+
| | 消息分发机制 | |
| +--------------------------+ |
| // // 字符 |
| || // |
| || +----------+ |
| 按键状态 |字符 | |
| X,Y值 |映射表 | |
| || +----------+ |
| || // |
| || ||扫描码 |
// // // //
+----------+ +----------+ +----------+ +----------+
| 协议解释 | | PS/2 | | | | |
| | | | |键盘 | |协议解释 |
| | | 协议解释 | |协议解释 | | |
+----------+ +----------+ +----------+ +----------+
// // // //
|| || || ||
// // // //
+----------+ +--------------------------+ +----------+
| 相关 | | | | |
| | | | |8251 |
| 设备驱动 | | 8042驱动程序 | |驱动程序 |
+----------+ +--------------------------+ +----------+
// // // 软件
----||-----------------------------||原始数据---------------------||-------
// // // 硬件
+----------+ +--------------------------+ +----------+
| ISA/PCI | | | | 8251 |
| | | | |也在Super |
| 设备 | | 8042(在南桥SuperI/O中) | | I/O中 |
+----------+ +--------------------------+ +----------+
// // // //
|| PS/2鼠标协议 键盘协议 ||
// // // //
+----------+ +----------+ +----------+ +----------+
| | | | | | | |
|总线鼠标 | |PS/2鼠标 | |键盘 | |串行鼠标 |
| | | | | | | |
+----------+ +----------+ +----------+ +----------+
具体的过程是这样的:PS/2鼠标通过PS/2鼠标协议与8042通信(该通信过程是基于串行协议的,一个开始位、一个奇偶校验位、一个停止位);PS/2鼠标协议解释程序通过8042驱动程序获取8042得到的原始数据;PS/2鼠标协议解释程序进行解释后分发给消息处理系统。
键盘的数据获取、解释过程也是同上面的描述一致的,只是键盘协议解释程序在解释键盘扫描码的同时会在“字符映射表”中查找扫描码对应的字符。Windows下有键盘左手习惯、右手习惯等应该是通过键盘字符映射表来实现的。
同样的8042芯片,接待由滚轮的鼠标和不带滚轮的鼠标所使用的PS/2鼠标协议解释程序是不一样的。这也就是双飞燕、罗技等鼠标需要额外的驱动的原因。滚轮鼠标的协议是非滚轮鼠标的协议的扩展,所以支持非滚轮鼠标的协议也可以支持滚轮鼠标(但不支持滚轮功能)。非滚轮鼠标的协议交互有一定的规则,该规则目前没有详细的文档,但是可以找到一些实验结果,通过鼠标控制芯片的数据手册也可以找到一些内容。基本鼠标数据包包含三个字节,即按键状态、X变化值、Y变化值。滚轮鼠标应该还包含第四个字节即滚轮的信息。
使用相同控制芯片的鼠标因为使用同样的串行协议,所以可以方便的更改为串行鼠标,同理串行鼠标也可以改为PS/2 鼠标,因为其通信原理相同。
鼠标、键盘在宏观上是输入设备,实际上计算机也是要向鼠标发送命令的,也就是说还是一个双向设备。
总结这么点,欢迎大家补充。
整理人张杨。