关于键盘鼠标的PS/2接口的开发笔记

PS/2硬件接口:计算机(Host)端是母的,键盘鼠标(Device)端是公的。由6-pin的mini-DIN连接
Pin1 - Data; Pin3 - Ground; Pin4 - +5V; Pin5 - Clock; Pin2 & Pin6 - Not Implemented。
Data和Clock可以被计算机和键盘鼠标双向控制,所以是OC的。
Clock的频率最大为33kHz,一般在10-20kHz之间,周期约为50-100us。

通常,Device是主动向Host发送数据的。发送格式是:1 Start bit(logic "0"); 8 Data bits(least significant bit first); 1 Odd Parity bit; 1 Stop bit(Logic "1"); 1 ACK bit(Host-to-device communication only,Logic "0")。
Host总是在Clock下跳沿时读入Data的状态。所以,Device要在Clock为“1”时改变Data的状态。
Device发送完一字节后,至少要等待50us方可发送下一字节。
如果Host要Device暂停数据发送,只要把Clock拉低就行了;如果此时Device正发送到一半,就放弃当前字节。在Host释放Clock后,Device要等候50us后方可继续发送数据。

当Host要向Device发送命令时,首先要拉低Clock 100us,然后拉低Data,释放Clock(形成Clock的上跳沿),使得这时候Device收到了一个Start bit。
Device要在10ms内响应这个请求,继续向Host发送Clock(首先令Clock为“0”),Host在Clock为“0”的时候改变Data的状态,而Device在Clock上跳沿的时候读入Data的状态。在读到Stop bit后,Device将Data拉低,然后将Clock拉低(形成Clock的下跳沿),Host接受到ACK信号。最后,Device先释放Data,然后释放Clock,进入空闲状态。

Scan Code: 按下按键时发送“Make Code”,松开时发送“Break Code”。
通常,Make Code有一个字节:如“A”的Make Code是“1C”。
特殊功能键有两个到四个字节,以“E0”或“E1”开头:如Pause的Make Code是“E1,14,77”; PrtScreen的Make Code是“E0,12,E0,7C”。
Break Code是在Make Code前面加一个“F0”。所以,“A”,Pause和PrtScreen的Break Code就是“F0,1C”“E1,F0,14,F0,77”“E0,F0,7C,E0,F0,12”。注意PrtScreen的Break Code中的“12”和“7C”顺序与Make Code中相反,它实际上两个特殊功能按键的组合。

现在常用的是第二套键盘扫描码:
101 102 104 键的键盘
KEY MAKE BREAK KEY MAKE BREAK         KEY MAKE BREAK

A 1C F0,1C     9 46 F0,46             [ 54 FO,54
B 32 F0,32     ` 0E F0,0E             INSERT  E0,70 E0,F0,70
C 21 F0,21     - 4E F0,4E             HOME E0,6C E0,F0,6C
D 23 F0,23     = 55 FO,55             PG UP E0,7D E0,F0,7D
E 24 F0,24     / 5D F0,5D             DELETE E0,71 E0,F0,71
F 2B F0,2B     BKSP 66 F0,66          END E0,69 E0,F0,69
G 34 F0,34     SPACE 29 F0,29         PG DN E0,7A E0,F0,7A
H 33 F0,33     TAB 0D F0,0D           U ARROW E0,75 E0,F0,75
I 43 F0,43     CAPS 58 F0,58          L ARROW E0,6B E0,F0,6B
J 3B F0,3B     L SHFT 12 FO,12        D ARROW E0,72 E0,F0,72
K 42 F0,42     L CTRL 14 FO,14        R ARROW E0,74 E0,F0,74
L 4B F0,4B     L GUI E0,1F E0,F0,1F   NUM 77 F0,77
M 3A F0,3A     L ALT 11 F0,11         KP / E0,4A E0,F0,4A
N 31 F0,31     R SHFT 59 F0,59        KP * 7C F0,7C
O 44 F0,44     R CTRL E0,14 E0,F0,14    KP - 7B F0,7B
P 4D F0,4D     R GUI E0,27 E0,F0,27     KP + 79 F0,79
Q 15 F0,15     R ALT E0,11 E0,F0,11     KP EN E0,5A E0,F0,5A
R 2D F0,2D     APPS E0,2F E0,F0,2F      KP . 71 F0,71
S 1B F0,1B     ENTER 5A F0,5A           KP 0 70 F0,70
T 2C F0,2C     ESC 76 F0,76             KP 1 69 F0,69
U 3C F0,3C     F1 05 F0,05              KP 2 72 F0,72
V 2A F0,2A     F2 06 F0,06              KP 3 7A F0,7A
W 1D F0,1D     F3 04 F0,04              KP 4 6B F0,6B
X 22 F0,22     F4 0C F0,0C              KP 5 73 F0,73
Y 35 F0,35     F5 03 F0,03              KP 6 74 F0,74
Z 1A F0,1A     F6 0B F0,0B              KP 7 6C F0,6C
0 45 F0,45     F7 83 F0,83              KP 8 75 F0,75
1 16 F0,16     F8 0A F0,0A              KP 9 7D F0,7D
2 1E F0,1E     F9 01 F0,01              ] 5B F0,5B
3 26 F0,26     F10 09 F0,09             ; 4C F0,4C
4 25 F0,25     F11 78 F0,78             ' 52 F0,52
5 2E F0,2E     F12 07 F0,07             , 41 F0,41
6 36 F0,36   PRNTSCRN E0,12,E0,7C
E0,F0,7C,E0,F0,12   . 49 F0,49
7 3D F0,3D     SCROLL 7E F0,7E                           / 4A F0,4A
8 3E F0,3E     PAUSE
E1,14,77, E1,F0,14,F0,77 -NONE(PAUSE被释放时不会发送Break Code)

Device在复位后向Host发送0xAA(初始化成功)或0xFC(初始化失败)。
Host向Device发送命令后,Device要回复一个0xFA,作为应答。Resend和Echo命令不需要回复0xFA。如果是带参数的多字节命令,在发送完每一个字节后都要收到0xFA后才能发送下一个字节。
Device接到Host命令后,要清空所有缓冲区。

给键盘的命令列表:
0xFF: (Reset).复位Device。

0xFE: (Resend).要求重新发送上一个字节(此命令可以由Host发给键盘,也可以由键盘发给Host)。

0xFD/0xFC/0xFB: (Set Key Type Make/Make & Break/Make & Typematic).指定一个按键只发送Make Code/Make Code & Break Code/Make Code & Typematic Repeat。该键值依照第三套键盘扫描码设定。

0xFA: (Set all keys Make,Break & Typematic).缺省设置,恢复所有按键的Make code, Break code 和 Typematic repeat功能。

0xF9/0xF8/0xF7: (Set all keys Make/Make & Break/Make & Typematic).设置所有按键只发送Make Code/Make Code & Break Code/Make Code & Typematic Repeat。

0xF6: (Set Default).设置缺省的Typematic rate/delay(10.9cps/500ms),第二套键盘扫描码,执行0xFA命令。

0xF5: (Disable).键盘停止扫描,执行0xF6命令。

0xF4: (Enable).使能键盘扫描。

0xF3: (Set Typematic Rate/delay). 后面跟1个字节设置Repeat Rate & Delay。
Bit0-4:Repeat rate 0x00-0x10-0x1F (2.0-8.0-30.0 cps);
Bit5-6:Delay 0.25/0.5/0.75/1.0 second。

0xF2: (Read ID). 键盘回复双字节的设备ID(0xAB,0x83).

0xF0: (Set Scan code set). 设置或读取当前使用的扫描码。参数为0x01,0x02或0x03时设置当前扫描码,参数为0x00时读取当前扫描码。

0xEE: (Echo).键盘回复一个0xEE。

0xED: (Set/Reset LEDs). 后面跟一字节参数,用来设置键盘的Caps Lock/Num Lock/Scroll Lock。
Bit0:ScrollLock;Bit1:NumLock;Bit2:CapsLock。

PS/2键盘作为单片机的输入设备时,单片机可以将Clock拉低,然后每20ms释放Clock一次,用查询的方式接收键盘的数据。
设置两个字节标志键盘工作状态:
字节1包括:校验位,读取过程完整标志,0xE0收到标志,0xE1收到标志,0xF0收到标志,请求发送键盘LED状态标志,有效按键标志。
字节2包括:功能键标志,释放状态(Break Code)标志,CapsLock,Ctrl,Shift,Alt,NumLock,ScrollLock标志。

计算机在Reset后要向键盘发送命令关闭键盘所有的LED,然后发送命令读取键盘ID。

鼠标向Host发送三字节的数据包:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Y Overflow X Overflow Y Sign bit X Sign bit 1 Middle button Right button Left button



X movement





Y movement


鼠标的工作模式:

1、Reset模式:鼠标上电或受到复位命令(0xFF)时进入次模式。
设置缺省的Sample rate:100samples/s;Resolution: 4 counts/mm;Scaling: 1:1; Data report disabled。
复位完成后向Host发送0xAA/0xFC(successful/Error)。Host如果没有收到0xAA,就重新给鼠标上电。
发送完0xAA后,鼠标继续向Host发送自己的ID号:0x00。之后进入Stream模式,此时,禁止向Host发送任何数据包,直到收到0xF4(Data report enable)。 

2、Stream模式:缺省模式。一旦发现鼠标状态有任何变化,就向Host发送数据包。

3、Remote模式:鼠标不主动向Host发送数据包,只有在收到命令0xEB后才发送数据包并复位计数器。

4、Wrap模式:鼠标将除了Reset(0xFF)和Reset Wrap Mode(0xEC)以外的所有从Host收到的命令发送回去。

Intellimouse扩展:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Y Overflow X Overflow Y Sign bit X Sign bit 1 Middle button Right button Left button



X movement





Y movement


0 0 5th button 4th button
Z movement

进入Intellimouse的三键滚轮模式:
Set sample rate to 200;
Set sample rate to 100;
Set sample rate to 80。
然后,Host发送命令0xF2查询鼠标的ID,如果鼠标支持Intellimouse,则返回0x03,否则返回0x00。

进入Intellimouse的五键滚轮模式:
Set sample rate to 200;
Set sample rate to 200;
Set sample rate to 80。
然后,Host发送命令0xF2查询鼠标的ID,如果鼠标支持Intellimouse,则返回0x04,否则返回0x00。

给鼠标的命令列表:

0xFF: (Reset).复位Device。

0xFE: (Resend).要求重新发送上一个字节(此命令可以由Host发给鼠标,也可以由鼠标发给Host)。

0xF6: (Set Default).设置缺省的参数,然后进入Stream模式。

0xF5: (Disable).禁止Stream模式下的数据包发送,使之在Stream模式下完成类似于Remote模式下的功能。

0xF4: (Enable).使能Stream模式下的数据包发送。

0xF3: (Set Sample Rate). 后面跟1个字节参数。有效参数为:10,20,40,60,80,100,200。

0xF2: (Read ID). 鼠标回应ID号码:0x00,0x03,或0x04。

0xF0: (Set Remote Mode). 设置Remote模式。

0xEE: (Set Wrap Mode).设置鼠标为Wrap模式。

0xEC: (Reset Wrap Mode).退回到鼠标进入Wrap以前的那个模式。

0xEB: (Read Data). 在Remote Mode下向鼠标索取数据。注意:鼠标回送数据前一定先用0xFA做收到命令的Echo信号。

0xEA: (Set Stream Mode).设置鼠标为Stream Mode。

0xE9: (Status Request).查询鼠标状态。鼠标回复的数据包为3字节:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
0 Mode Enable Scaling 0 Left button Middle button Right button




Resolution






Sample Rate


其中:Mode=0为Stream Mode, Mode=1为Remote Mode。

0xE8: (Set Resolution).设置分辨率,带一字节参数。有效值为0x00/0x01/0x02/0x03,分别对应的分辨率为:1/2/4/8 Count/mm。

0xE7: (Set Scaling 2:1).设置比例为2:1。
此时,当Movement Counter分别为0/1/2/3/4/5/n时,Reported Movement为0/1/1/3/6/9/2*n。

0xE6: (Set Scaling 1:1).设置比例为1:1。

鼠标在复位成功后要先向Host发送0xFA(复位成功),然后发送自己的ID:0x00。
键盘则只需发送0xFA。

FROM:http://blog.ednchina.com/WoodPecker/98626/Message.aspx#

你可能感兴趣的:(关于键盘鼠标的PS/2接口的开发笔记)