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#