1、PS/2,键盘介绍,BIOS Team/Carol,2012/05/08,PS/2 Keyboard introduction,内容索引,1,键盘概述,2,键盘的工作原理,3 KBC8042,介绍,4 BDA,与,键盘中断,3.1 8042,概述,3.2 8042,的寄存器,3.3 60h/64h,端口,3.4 8042,的工作原理,3.5,命令集,3.6,编程实例,3 KBC8042,的介绍,返回主页,3.1 8042,概述,返回本节,3.1.1,键盘控制器,在,IBM AT,和,IBM PS/2,键盘系统中,,CPU,并不直接和,Keyboard,进行通信,而是通过键盘控制器实现过渡。,
2、最初,IBM,使用,Intel,的,8042,微控制器作为它的键盘控制器现在已经被兼容设备取代并整合到主板的,南桥或,SIO,中。,它控制整个键盘的工作,包括加电自检、键盘扫描码的缓冲以及与主板的通讯等。,3.1 8042,概述,返回本节,3.1.2,原理简图,按键的处理需要,CPU,、中断和,8042,的协调工作完成。,CPU,可通过,8042,向,8048,发键盘命令,另外,,CPU,也可直接发命令给,8042,,以使用,8042,芯片自身所提供的功能,。,3.1 8042,概述,返回本节,3.1.3,接,口图,3.1 8042,概述,返回本节,3.1.4,芯片接口,8042,有三个,po
3、rt,:,Input Port,P1,,,Output Port,P2,,,Test Port,T,。,System Reset,和,A20 Gate,是两个与键盘无关的重要的控制位。,GateA20,:决定,CPU,是否可以访问以,MB,为单位的偶数内存。,0,:,CPU,工作于,DOS,的,实模式,;,1,:,CPU,可进入,保护模式,;,KRST*,:向系统发送,Reset,信号,可让主机重新启动。,0,:,normal,;,1,:,reset computer,;,3.1 8042,概述,返回本节,3.1.4 8042,功能,(,1,)接收键盘输出的键盘扫描码,(,2,)对键盘数据进行
4、正确性检查,(,3,)缓冲器满产生键盘中断,(,4,)供中断程序读取系统扫描码,(,5,)向键盘传送命令,等待键盘响应,(,6,)控制键盘鼠标的开关,(,7,)控制系统复位动作,(,8,)选通地址线,A20,3.2 8042,的寄存器,返回本节,Output Buffer,:,输出缓存,,read-only,Input Buffer,:,输入缓存,,write-only,Status Register,:,状态寄存器,,read-only,Control Register,:,控制寄存器,,read/write,前三个寄存器可通过,60h,和,64h,端口直接用,in/out,指令读,/,写;
5、最后的控制寄存器要使用,20h/60h,命令实现读写。,3.2.1,四个寄存器,3.2 8042,的寄存器,返回本节,3.2.2,缓存,Output Buffer,:,1,个字节,只读,与,in,指令配合使用。,它的值有以下几种情况:,来自,8048,:,scan code,,命令响应,命令返回值。,来自,8042,:命令返回值。,Input Buffer,:,1,个字节,只写,与,out,指令配合使用。,它的值有以下几种情况:,送往,8048,:命令,命令跟随值。,送往,8042,:命令,命令跟随值。,3.2 8042,的寄存器,返回本节,3.2.3,状态寄存器,Status Regist
6、ar,:,8,个状态标志位,只读,包含了错误信息、状态信息和输入输出缓存信息等。,Flag,定义如下:,Bit7:,奇校验位,0,:正常;,1,:错误;,Bit6:kbd,接收,/,回应超时,0,:正常;,1,:超时;,PS/2,兼容,:,Bit5:,写鼠标缓存满,0,:缓存空;,1,:缓存满;,PARE,TO,MOBF,KEYL,C/D,SYSF,IBF,OBF,3.2 8042,的寄存器,返回本节,3.2.3,状态寄存器,Status Registar,:,8,个状态标志位,只读,包含了错误信息、状态信息和输入输出缓存信息等。,Flag,定义如下:,PS/2,兼容,:,Bit4:,禁止键盘
7、通信,0,:键盘被禁止,(Clock=0),;,1,:正常通信,(Clock=1),;,Bit3:,指示最后写入端口,0,:,60h,端口;,1,:,64h,端口;,PARE,TO,MOBF,KEYL,C/D,SYSF,IBF,OBF,3.2 8042,的寄存器,返回本节,3.2.3,状态寄存器,Status Registar,:,8,个状态标志位,只读,包含了错误信息、状态信息和输入输出缓存信息等。,Flag,定义如下:,PS/2,兼容,:,Bit2:,系统重启标志,0,:上电重启,(,冷启,),;,1,:软件重启,(,热启,),;,Bit1:,输入缓存满,0,:缓存空;,1,:缓存满;,B
8、it0:,输出缓存满,0,:缓存空;,1,:缓存满;,PARE,TO,MOBF,KEYL,C/D,SYSF,IBF,OBF,3.2 8042,的寄存器,返回本节,3.2.4,控制寄存器,0,XLATE,ME,KE,0,SYSF,MIE,KIE,Control Registar,:,即,command byte,,可读可写,,6,个控制标志位,包含了系统信息、键盘信息和鼠标信息等。,Flag,定义如下:,PS/2,兼容,:,Bit6:,转化扫描码为,set 1,0,:禁止换码;,1,:开启换码;,Bit5:,鼠标,0,:可用;,1,:禁用;,Bit4:,键盘,0,:可用;,1,:禁用;,3.2
9、8042,的寄存器,返回本节,3.2.4,控制寄存器,0,XLATE,ME,KE,0,SYSF,MIE,KIE,Control Registar,:,即,command byte,,可读可写,,6,个控制标志位,包含了系统信息、键盘信息和鼠标信息等。,Flag,定义如下:,PS/2,兼容,:,Bit2:,系统标志位,0,:冷启动;,1,:热启动;,Bit1:,鼠标中断,IRQ12,0,:禁用;,1,:使能;,Bit0:,键盘中断,IRQ1,0,:禁用;,1,:使能;,3.3 60h/64h,端口,返回本节,3.3.1 64h,端口读操作,in al,64h,此指令被执行后,寄存器,AL,Sta
10、tus Register,的值。,Note,:,读,64h,端口的操作,因读,/,写,buffer,时,往往需要查询它们的状态,故此指令,使用,很,频繁,。,3.3 60h/64h,端口,返回本节,3.3.2 64h,端口写操作,out 64h,al,此指令被执行后,,Input Buffer,寄存器,AL,的值。,Note,:,写,64h,端口的操作,被视为往,8042,发命令,那么,AL,中存放的是,8042,命令,。,3.3 60h/64h,端口,返回本节,3.3.3 60h,端口读操作,in al,60h,此指令被执行后,寄存器,AL,Output Buffer,的值。,Note,:,
11、读,60h,端口的操作,后,,,AL,的值有,4,种情况,即:,1,、,系统扫描码,,键盘有按键事件发生。,2,、,8048,的命令响应,,,CPU,向键盘发命令后,键盘会发出响应,告诉,CPU,命令是否被成功接收。,3,、,8048,的命令返回值,,键盘执行某些键盘命令后,会有返回值供,CPU,读取。,4,、,8042,的命令返回值,,键盘控制器执行某些键盘命令后,会有返回值供,CPU,读取。,3.3 60h/64h,端口,返回本节,3.3.4 60h,端口写操作,out 60h,al,此指令被执行后,,Input Buffer,寄存器,AL,的值。,Note,:,写,60h,端口的操作,,
12、AL,的值有,3,种情况:,1,、,8042,的,命令跟随值,,前提是之前写,64h,端口的命令需要进一步的数据输入,。,2,、,8048,的,命令,或,命令跟随值,,不满足,1,前提的所有情况。,8048,命令,与,8042,命令,的最大,区别,就是前者写入,60h,端口,后者写入,64h,端口。,3.3 60h/64h,端口,返回本节,3.3.5,读写,注意事项,Note,:,写,60h,和,64h,端口的操作,前,,,判断,status register,的,IBF,(bit1),是,否为,0,,确保,Input Buffer,中无数据,。,读,60h,端口的操作,前,,,判断,stat
13、us register,的,OBF,(bit0),是,否为,1,,确保,Output Buffer,中有数据,。,读,64h,端口的操作,即读取,status register,,可,随时,使用。,3.4 8042,的工作原理,返回本节,3.4.1,工作原理图,64h,8042 chip,60h,Status Register,Input Buffer,in,out,Output Buffer,out,in,keyboard,Buffer,8048,LED,Key Matrix,Command Byte,3.4 8042,的工作原理,返回本节,3.4.2,读键盘输入,1,、转换扫描码,当,80
14、42,从键盘收到有效的键盘扫描码后,就把它转换成第一套扫描码,称为系统扫描码。系统扫描码放到输入缓存,,OBF,标志被置起。,2,、发出中断,IRQ1,OBF,被置起后产生,IRQ1,中断请求。同时,,8042,把时钟线拉低,禁止键盘通信。如果中断被允许,,IRQ1,将激活,INT 09,,调用中断服务程序。,3,、传送扫描码,INT 09,服务程序从,60h,端口读取系统扫描码。,8042,将扫描码送出后,会释放,IRQ1,并清,OBF,标志。同时,恢复键盘通信。,3.4 8042,的工作原理,返回本节,3.4.2,往键盘写数据,1,、写输入缓存,CPU,通过,60h,端口写入数据到,804
15、2,,,8042,把,IBF,标志位置起,并处理数据为串行通信做准备。,2,、发送数据,8042,把处理好的数据发给键盘,并等待回应。,3,、读取响应,如果键盘没有接收或指定时间内未响应,那么超时标志被置起。如果键盘继续回复错误字节,那么校验错标志被置起。如果没有错误发送,响应字节会放到输出缓存,再按照读键盘输入步骤操作。,3.5,命令集,返回本节,3.5.1,命令介绍,KBC Command set,:,包括,8042 command,,,8048 command,。,8042 command,:,由,8042,执行,命令写往,64h,端口。,例如:发送命令,0 xAD,禁用键盘,mov a
16、l,0ADh,Out 64h,al,8048 command,:,由,8048,执行,命令写往,60h,端口。,例如:发送命令,0 xED,设置键盘灯,mov al,0EDh,Out 60h,al,3.5,命令集,返回本节,3.5.2 8042 command,command,name,description,0 x20,读命令寄存器,数据置于,output buffer,,从,60h,端口进一步读取,0 x60,写命令寄存器,通过,60h,端口进一步写入,0 xAA,自检,自检返回值由,60h,端口读取,,55hOK,,,FChNOK,0 xAD,禁用键盘,命令寄存器的,bit4,自动置,1
17、keyboard,无法发送数据,0 xAE,启用键盘,命令寄存器的,bit4,自动置,0,,,keyboard,可以发送数据,0 xC0,读取输入端,P1,值,数据置于,output buffer,,从,60h,端口进一步读取,0 xD0,读取输出端,P2,值,数据置于,output buffer,,从,60h,端口进一步读取,0 xD1,写输出端,P2,通过,60h,端口进一步写入,0 xD2,写键盘输出缓存,通过,60h,端口进一步写入,用于模拟键盘扫描码,0 xFE,系统重启,系统会立刻重启。,3.5,命令集,返回本节,3.5.3 8048 command,command,name
18、detail,0 xED,设置键盘,LEDs,从,60h,端口写入设置值,0 xEE,诊断,Echo,诊断键盘是否正常,0 xF0,设置,/,读取扫描码集,从,60h,端口写入设置值,01(set 1),02(set 2),03(set 3),;,从,60h,端口读取当前扫描码集,43(1),41(2),3f(3),0 xF2,读取键盘,ID,从,60h,端口读取键盘,0 xF3,设置机打速率和延时,从,60h,端口写入设置值:,bit7=0,bit6-5delay,bit4-0rate,0 xF4,启动键盘,用于传输错误发生后,键盘被禁止的情况,0 xF5,关掉键盘,关闭扫描功能,恢复默认
19、设置,0 xF6,恢复默认设置,清除缓存,载入缺省机打设置,恢复,set2,0 xFE,重发,resend,数据传输发生错误时,,8042,会发出此命令,0 xFF,键盘重启,基本正确性检测,(BAT),,恢复默认设置,3.5,命令集,返回本节,3.5.4 8048 command,返回值,响应,description,00h/FFh,键盘出错,,1.,若干,keys,同时按下,2.,键盘缓存溢出,3.,奇偶校验错误,AAh,BAT OK,EEh,Echo,命令返回值,F1h,0 xA4,命令,没有安装密码或没有密码功能时的返回值,FAh,正确接收完来自,60h,端口的命令或数据后的应答信号(
20、ACK,),FEh,键盘响应失败(,NACK,),FCh,BAT not OK,3.6,编程实例,返回本节,3.6.1,编程经验,1,、对于,8042,命令,,,KBC,的读写速度很,快,,几乎不用延时就已经执行完毕。例如,0 xFE,系统重启命令,命令一发出,系统立马重启。,2,、对于,8048,命令,,,KBC,的读写速度相对较,慢,,必须加延时,等待,keyboard,接收完命令后响应,应答,FAh,,不应答,FEh,。如有返回值,应再加延时后,继续接收。,3,、,keyboard,的大部分命令都,先,返回,FAh,,,再,有相应的,返回值,。如,0 xF2,读取键盘,ID,的命令,返
21、回值顺序是:,FAh,ABh,41h,。,0 xEE,诊断命令例外,只返回,EEh,。,4,、,8042,的,output buffer,满,,OBF,置,1,,,in 60h,读值,,OBF,置,0,;在下一个,OBF,置,1,前,,in 60h,读到的值仍是上次,output buffer,满的值。,1,、程序流程:,返回本节,3.6.2,模拟按键,0 xD2,等待,KBC,输入输出缓存空,向,64h,端口发送,D2,命令,OK,等待,D2,命令被取走,向,60h,端口发按键扫描码,等待扫描码被取走,退出,,BIOS,执行按键动作,Over,3.6,编程实例,2,、注意事项:,从,60h,
22、端口送入的按键扫描码应该是,scan code set 1,;,发送,D2,命令前注意确保键盘中断,IRQ1,是开启状态。,返回本节,3.6.2,模,拟按键,0 xD2,3,、编程:,;Name:WrKbdObf,;Detail:Write keyboard output buffer,act as if this was keyboard data.,;Command:D2h,;Inputs:al=input scan code,;Output:n/a,;Modify:AL,3.6,编程实例,WrKbdObf,PROC public,;,save scan,code,mov,ah,al,;,
23、wait buffer empty,:,in,al,64h,test,al,03h,jnz,b,;input D2 command,mov,al,0d2h,out,64h,al,:,;,wait input buffer empty,in,al,64h,test,al,02h,jnz,b,;,get scan code,and input scan code,mov,al,ah,out,60h,al,;wait Input buffer empty,:,in,al,64h,test,al,02h,jnz,b,ret,WrKbdObf,ENDP,返回本节,3.6.2,模拟按键,0 xD2,3.6
24、编程实例,返回本节,3.6.3,点亮,num lock,灯,0 xED,1,、程序流程:,向,60h,端口发送,ED,命令,等待键盘响应,,ACK,?,OK,向,60h,端口发,LED,设置值,等待键盘响应,,ACK,?,ZF=1,开中断,退出,从,BDA,读取键盘灯信息,等待,KBC,输入输出缓存空,关中断,Y,Y,ZF=0,N,N,3.6,编程实例,返回本节,3.6.3,点亮键盘灯,0 xED,2,、注意事项:,发键盘命令前,关闭键盘中断,,以防键盘返回值被中断服务程序读走,BIOS Data Area(BDA),定义了键盘 缓,冲,区,在基地址为,0400h,偏移量为,17h,处,是键
25、盘状态字,低字节如下:,B7=1,Insert,active,B6=1,CapsLock,active,B5=1,NumLock,active,B4=1,ScrlLock,active,B3=1,Alt Key is,pressed,B2=1,Ctrl Key is,pressed,B1=1,Left Shift Key is,pressed,B0=1,Right Shift Key is,pressed,3,、编程:,;Name:WrNumL,;Detail:keyboard Num Lock on,;set value-bit1=1,;Command:EDh,;Inputs:BDA 000
26、0:0417h value,;Output:ZF=1-successed,;0-failed,;Modify:AX,,,DI,flag,;BDA 0000:0417h value,3.6,编程实例,返回本节,3.6.3,点,亮键盘灯,0 xED,WrNumL,PROCpublic,;get led value,push,ds,xor,ax,ax,mov,ds,ax,mov,di,417h,mov,al,byte,ptr di,pop,ds,;save led setting,and,al,70h,shr,al,4,mov,ah,al,:,;wait buffer empty,in,al,64h
27、test,al,03h,jnz,b,cli,;interrupt enabled,mov,al,0edh,out,60h,al,:,;wait keyboard ack,,,if not FAh,exit,in,al,64h,test,al,01h,jnz,b,in,al,60h,cmp,al,0fah,jnz,exitWr,mov,al,ah,out,60h,al,:,;wait keyboard ack,in,al,64h,test,al,01h,jnz,b,in,al,60h,cmp,al,0fah,exitWr:,ret,WrNumL,ENDP,3.6,编程实例,4.1 BIOS,键
28、盘缓冲区,4.2,键盘中断的处理,4.3 BIOS,键盘服务,INT16H,4.4 DOS,键盘中断,INT21H,4 BDA,与键盘中断,返回主页,返回本节,4.1.1,键,盘缓冲区的作,用,4.1 BIOS,键盘缓冲区,BIOS,在内存低端的,BIOS,数据存储区开设一个键盘缓冲区,其作用如下:,(,1,)可以满足键盘实时输入要求。,(,2,)适应随机访问的应用要求。,(,3,)能容纳快速键盘输入要求。,4.1.2,键,盘缓冲,区地址,4.1 BIOS,键盘缓冲区,0000:0417H 1,字,键盘状态字,0000:041AH 1,字,指向键盘缓冲区的头,0000:041CH 1,字,指向
29、键盘缓冲区的尾,0000:041EH16,字,键盘缓冲区,0000:0471H 1,字,break,标志,组合键,Break,被按,下时,其值被置为,80H,0000:0480H 1,字,键盘缓冲区的起始地址,0000:0482H 1,字,键盘缓冲区的末尾地址,0000:0496H 1,字,键盘状态和类型,返回本节,可参见,TEB-M7064,的,kbcdefs.inc,的,BIOS DATA AREA SEGMENT,4.1.3,键盘状态字,4.1 BIOS,键盘缓冲区,返回本节,4.1.3,键,盘缓冲,区,4.1 BIOS,键盘缓冲区,键盘缓冲区是一个,先进先出,的环形队列,,0000:0
30、41Eh 0000:043Eh,,,16,个字。,返回本节,4.2.1,按键中断过程,4.2,键盘中断的处理,用户按键,由,8042,发出,IRQ1,中断,,BIOS,调用,INT 09,中断服务程序。,INT 09,先从,8042,取得系统扫描码,然后根据扫描码值判断用户按键并作相应处理,最后通知中断控制器,8259,本次中断结束并实现中断返回。,返回本节,4.2.2 INT 09,按键,处理,4.2,键盘中断的处理,若用户按下,双态键,(,如:,Caps Lock,、,Num Lock,和,Scroll Lock,等,),,则在键盘上和,BDA,上相应,LED,指示灯的状态将发生改变;,若
31、用户按下,控制键,(,如:,Ctrl,、,Alt,和,Shift,等,),,则在,BDA,上相应的键盘标志位将发生改变;,若用户按下,功能键,(,如:,F1,、,F2,、,等,),,再根据当前是否又按下控制键来确定其软件扫描码,并得到该按键所对应的,ASCII,码;,若用户按下,字符键,(,如:,A,、,1,、,+,、,等,),,再根据当前是否又按下控制键来确定其软件扫描码,并得到该按键所对应的,ASCII,码;,若用户按下,功能请求键,(,如:,Print Screen,等,),,则系统直接产生一个具体的动作。,返回本节,4.2.3 INT 09,的功能,4.2,键盘中断的处理,对某些键或键
32、的组合定义为单字节的,ASCII,码和扫描码,供系统中断,INT 16H,使用。,对某些键仅设置变量,反映其被按下或释放的状态。,对某些键或键的组合产生特殊操作。,返回本节,中断服务程序可参考,TEB-M7064,的,Kbcint09.asm,的,kbcKeyboardInterruptFar PROC,4.3.1 INT 16H,的功能,4.3 BIOS,键盘服务,INT16H,00H,、,10H,从键盘读入字符,03H,设置重复率,01H,、,11H,读取键盘状态,04H,设置键盘点击,02H,、,12H,读取键盘标志,05H,字符及其扫描码进栈,BIOS,中断方便程序员不必了解硬件,I/
33、O,接口的特性,可直接用,INT,指令参数,读取键盘按键信息。,返回本节,中断服务程序可参考,TEB-M7064,的,Kbcint16.asm,的,kbcKeySystemServicesFar PROC,4.4.1 INT 21H,的功能,4.4 DOS,键盘中断,INT21H,DOS,是,PC,机上最重要的操作系统,它和,BIOS,一样包括有近百个设备管理、目录管理和文件管理程序,是一个,功能齐全、使用方便,的中断例行程序的集合。使用,DOS,操作比使用相应功能的,BIOS,操作更简易,而且,对硬件的依赖性更少些,。对一般的键盘操作,我们也可以使用,INT 21H,中断提供的键盘功能调用。
34、01H,从键盘输入一个字符并回显在屏幕上,06H,读键盘字符,07H,从键盘输入一个字符,不回显,08H,从键盘输入一个字符,不回显,检测,Ctrl_Break,组合键,0AH,输入字符到缓冲区,0BH,读键盘状态,0CH,清键盘缓冲区,并调用一种键盘功能,返回本节,返回主页,结 束放映,The end!,Any question?,参考链接:,puter-engineering.org/,www.win.tue.nl/aeb/linux/kbd/scancodes.html#toc1,BIOS,键盘服务,INT16H,功能描述:从键盘读入字符,入口参数:,AH,00H,读键盘,10H,读扩
35、展键盘,可根据,0000:0496H,单元的内,容判断:扩展键盘是否有效,出口参数:,AH,键盘的扫描码,AL,字符的,ASCII,码,4.3.1.2,功能,01H,和,11H,4.3 BIOS,键盘服务,INT16H,功能描述:读取键盘状态,入口参数:,AH,01H,检查普通键盘,11H,检查扩展键盘,出口参数:,ZF,1,无字符输入,0AH,键盘的扫描码,,AL,ASCII,码。,返回,4.3.1.3,功能,02H,和,12H,4.3 BIOS,键盘服务,INT16H,功能描述:读取键盘标志,入口参数:,AH,02H,普通键盘的状态字节,12H,扩展键盘的状态字,出口参数:,AL,键盘的状
36、态字节,,0000:0417H,的值,AH,扩展键盘的状态,各位之值为,1,时的含义如下:,位,7SysReq,键按下,位,3,右,ALT,键按下,位,6CAPS LOCK,键按下,位,2,右,CTRL,键按下,位,5NUM LOCK,键按下,位,1,左,ALT,键按下,位,4SCROLL,键按下,位,0,左,CTRL,键按下,返回,4.3.1.4,功能,03H,4.3 BIOS,键盘服务,INT16H,功能描述:设置机打重复率,入口参数:,AH,03H,,,AL,05H,BH,机打延时,,BL,机打速率。,出口参数:无,返回,4.3.1.5,功能,04H,4.3 BIOS,键盘服务,INT16H,功能描述:设置键盘点击,入口参数:,AH,04H,AL,00H,关闭键盘点击功能,01H,打开键盘点击功能,出口参数:无,返回,4.3.1.6,功能,05H,4.3 BIOS,键盘服务,INT16H,功能描述:字符及其扫描码进入键盘缓冲区,入口参数:,AH,05H,CH,字符扫描码,CL,字符,ASCII,码,出口参数:,AL,00H,操作成功,01H,键盘缓存满,返回,






