提前说说

返校有几天了,底盘驱动还在研究。第一次接触这么多陌生的代码,感觉还是有点吃不消的,慢慢弄吧,顺便把基础再补补。

PS2实验

PS/2 简介

PS/2 是电脑上常见的接口之一,用于鼠标、键盘等设备。一般情况下,PS/2 接口的鼠标为
绿色,键盘为紫色。

PS/2 接口是输入装置接口,而不是传输接口。所以 PS2 口根本没有传输速率的概念,只有
扫描速率。在 Windows 环境下,ps/2 鼠标的采样率默认为 60 次/秒,USB 鼠标的采样率为 120
次/秒。较高的采样率理论上可以提高鼠标的移动精度。

物理上的 PS/2 端口可有 2 种,一种是 5 脚的,一种是六脚的。下面给出这两种 PS/2 接口

的引脚定义图,如图 30.1.1 所示:

batocrea支持ps2 bios ps2 bios版本_补码


从图 30.1.1 可以看出,不管是 5 脚还是 6 脚的 PS/2 接头,都是有 4 根有用的线连接:时钟线、数据线、电源线、地线。PS/2 设备的电源是 5V 的,而数据线和时钟线均是集电极开路的,这两根信号线都需要接一个上拉电阻(开发板上使用的是 10K)。

PS/2 鼠标和键盘遵循一种双向同步串行协议,换句话说每次数据线上发送一位数据并且每在时钟线上发一个脉冲就被读入。键盘/鼠标可以发送数据到主机,而主机也可以发送数据到设备,但主机总是在总线上有优先权,它可以在任何时候抑制来自于键盘/鼠标的通讯,只要把时钟拉低即可。

设备到主机的数据在时钟信号的下降沿被主机读取,而从主机到设备的数据在时钟信号的上升沿被设备读取。不论通信方向如何,时钟总是由设备产生的,最大的时钟频率为 33Khz,大多数设备工作在 10~20Khz。

鼠标键盘,采用的是一种每帧包含 11/12 位的串行协议,这些位的含义如表 30.1.1 所示:

batocrea支持ps2 bios ps2 bios版本_batocrea支持ps2 bios_02


表 30.1.2 中校验位的含义是:如果数据位中包含偶数个 1,则校验位为 1;如果数据位中

包含奇数个 1,则校验位为 0。数据位中的 1 的个数加上校验位总为奇数(奇校验),用于数据侦错。当主机发送数据给键盘/鼠标的时候,设备会发送一个握手信号来应答数据已经被收到了,该位不会出现在设备到主机的通信中。

设备到主机的通信过程:

正常情况下数据线和时钟线都是高电平,当键盘/鼠标有数据要发送时,它先检测时钟线,
确认时钟线是高电平。如果不是,则是主机抑制了通信,设备必须缓冲任何要发送的数据,直到重新获得总线的控制权(键盘有 16 字节的缓冲区而鼠标的缓冲区仅存储最后一个要发送的数据包)。如果时钟线是高电平,设备就可以开始传送数据了。
(要先检测时钟线是否为高电平才能进行数据传输,再判断为高电平后,时钟总线再拉低才能接受设备传来的数据)

设备到主机的数据在时钟线的下降沿被主机读入,如图 30.1.2 所示:

batocrea支持ps2 bios ps2 bios版本_采样率_03


主机可以在设备发送数据的时候拉低时钟线来来放弃当前数据的传送。

主机到设备的通信过程:

主机到设备的通信与设备到主机的通信有点不同,因为 PS/2 的时钟总是由设备产生的,如

果主机要发送数据,则它必须首先把时钟线和数据线设置为请求发送状态。请求发送状态通过

如下过程实现:

1.拉低时钟线至少 100us 以抑制通信。(拒绝设备向主机的传输)

2.拉低数据线,以应用“请求发送”,然后释放时钟线。(信号)

设备在不超过 10ms 的时间内就会检测这个状态,当设备检测到这个状态后,它将开始产生

时钟信号,并且在设备提供的时钟脉冲驱动下输入八个数据位和一个停止位。主机仅当时钟线为低的时候改变数据线,而数据在时钟脉冲的上升沿被锁存,这与发生在设备到主机通讯的过程中正好相反。

主机到设备的通信时序图如图 30.1.3 所示:

batocrea支持ps2 bios ps2 bios版本_batocrea支持ps2 bios_04


标准的 PS/2 鼠标支持下面的输入:X(左右)位移、Y(上下)位移、左键、中键和右键。

但是我们目前用到鼠标大都还有滚轮,有的还有更多的按键,这就是所谓的 Intellimouse。它支持 5 个鼠标按键和三个位移轴(左右、上下和滚轮)。

标准的鼠标有两个计数器保持位移的跟踪:X 位移计数器和 Y 位移计数器。可存放 9 位

的 2 进制补码,并且每个计数器都有相关的溢出标志。它们的内容连同三个鼠标按钮的状态一起以三字节移动数据包的形式发送给主机,位移计数器表示从最后一次位移数据包被送往主机后所发生的位移量。

标准 PS/2 鼠标发送唯一和按键信息以 3 字节的数据包格式发给主机,三个数据包的意义如

图 30.1.4 所示:

batocrea支持ps2 bios ps2 bios版本_数据_05


位移计数器是一个 9 位 2 的补码整数,其最高位作为符号位出现在位移数据包的第一个字

节里。这些计数器在鼠标读取输入发现有位移时被更新。这些值是自从最后一次发送位移数据包给主机后位移的累计量(即最后一次包发给主机后位移计数器被复位位移计数器可表示的值的范围是-255 到+255)。如果超过了范围,相应的溢出位就会被置位,并在复位之前,计数器不会再增减。而所谓的 Intellimouse,因为多了 2 个按键和一个滚轮,所以 Intellimouse 的一个位移数据

包由 4 个字节组成,如图 30.1.5 所示:

batocrea支持ps2 bios ps2 bios版本_batocrea支持ps2 bios_06


Z0-Z3 是 2 的补码,用于表示从上次数据报告以来滚轮的位移量。有效范围从-8 到+7,第

四键如果按下,则 4th Btn 位被置位,如果没有按下,则 4th Btn 位为 0。第五键也与此类似。