📄 jiurl键盘驱动 1.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0058)http://jiurl.nease.net/cn/document/KbdDriver/JiurlKbd1.htm -->
<HTML><HEAD><TITLE>JIURL键盘驱动 1</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>.title {
FONT-WEIGHT: bold; FONT-SIZE: 21px; LINE-HEIGHT: 48px; FONT-FAMILY: "黑体", Arial, sans-serif; TEXT-DECORATION: none
}
.author {
FONT-SIZE: 12px; LINE-HEIGHT: 16px; FONT-FAMILY: "宋体"
}
.content {
FONT-SIZE: 14px; LINE-HEIGHT: 20px
}
</STYLE>
<META content="MSHTML 6.00.2900.2668" name=GENERATOR></HEAD>
<BODY bgColor=#f7f7f7 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE height=29 cellSpacing=0 cellPadding=0 width="96%" border=0>
<TBODY>
<TR>
<TD class=title width="100%" height=41>
<P align=center><FONT face=宋体>JIURL键盘驱动 1</FONT></P></TD></TR></CENTER>
<TR>
<TD class=author width="100%" height=9>
<P align=center><FONT face=宋体>作者: <A
href="mailto:jiurl@mail.china.com">JIURL</A> </FONT></P></TD></TR>
<TR>
<TD class=author width="100%" height=6>
<P align=center><FONT
face=宋体>
主页: <A href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A>
</FONT></P></TD></TR>
<TR>
<TD class=author width="100%" height=2>
<P align=center><FONT face=宋体> 日期: 2003-12-13</FONT>
</P></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE height=1 cellSpacing=0 cellPadding=0 width="96%" border=0>
<TBODY>
<TR>
<TD width="100%" height=1>
<HR color=#396da5 SIZE=3>
</TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<TABLE class=content height=200 cellSpacing=0 cellPadding=0 width="96%"
border=0>
<TBODY>
<TR>
<TD vAlign=top width="131%" height=200>
<P><B>0 概述</B><BR><BR> 我们将讨论 ps/2 键盘的驱动。主要讨论的内容有,ps/2
键盘的硬件,使用键盘驱动的应用层,键盘驱动的初始化,键盘驱动如何完成自己的工作,以及一些涉及到的相关内容。需要注意的是,以后我们提到的键盘,如果没有特殊说明,都是指
ps/2 键盘。<BR><BR><B>1 ps/2 键盘的硬件</B><BR><BR>
要以写一个硬件的驱动为目的的话,需要对这个硬件有一定的了解,但并不需要太深入,只要对于写驱动足够就可以了。关于 ps/2
键盘的硬件知识,我们也是对讨论键盘驱动足够就可以了,一些对于驱动没有帮助的硬件实现的细节,我们不讨论。<BR><BR>1.1 ps/2
键盘硬件概述<BR><BR> 对于驱动来说,和键盘相关的最重要的硬件是两个芯片。一个是 intel 8042
芯片,位于主板上,CPU 通过 IO 端口直接和这个芯片通信,获得按键的扫描码或者发送各种键盘命令。另一个是 intel 8048
芯片或者其兼容芯片,位于键盘中,这个芯片主要作用是从键盘的硬件中得到被按的键所产生的扫描码,与 i8042
通信,控制键盘本身。<BR><BR> 当键盘上有键被按下时,i8048 直接获得键盘硬件产生的扫描码。i8048
也负责键盘本身的控制,比如点亮 LED 指示灯,熄灭 LED 指示灯。i8048 通过 ps/2 口和 i8042 通信,把得到的扫描码传送给
i8042。CPU 通过读写端口,可以直接把 i8042 中的数据读入到 CPU 的寄存器中,或者把 CPU 寄存器中的数据写入 i8042
中。ps/2 口一共有 6 个引脚,可以拔下 ps/2 插头看一下,这 6
个引脚分别为,时钟,数据,电源地,电源+5V,还有2个引脚没有被用到。由于只有一个引脚传输数据,所以 ps/2
口上的数据传输是串行的。<BR><BR> 下面几幅图是一个键盘的内部,可以看到用来产生扫描码的按键矩阵( Key
Martix ),可以看到键盘中的芯片(这里不是i8048,是一个兼容的其他型号的芯片)。
<P align=center><IMG height=203 src="JIURL键盘驱动 1.files/kbd1.jpg" width=640
border=0>
<P align=center><IMG height=233 src="JIURL键盘驱动 1.files/kbd2.jpg" width=640
border=0>
<P align=center><IMG height=125 src="JIURL键盘驱动 1.files/kbd3.jpg" width=183
border=0> <IMG height=215 src="JIURL键盘驱动 1.files/kbd4.jpg" width=271
border=0>
<P>注意,i8042 并不一定在主板上单独出现,可能被整合在某一芯片中。<BR><BR>1.2 扫描码 ,Make Code ,Break
Code ,Typematic <BR><BR> 当键盘上有键被按下,松开,按住,键盘将产生扫描码(
Scan Code ),这些扫描码将被 i8048 直接得到。扫描码有两种,Make Code 和 Break
Code。当一个键被按下或按住时产生的是 Make Code ,当一个键被松开产生的是 Break Code。每个键被分配了唯一的 Make
Code 和 Break Code ,这样主机通过扫描码就可以知道是哪一个键。简单的说就是按下键,产生一个 Make Code。松开键,产生一个
Break Code。<BR><BR> 而对于按住不放的情况呢。我们可以打开一个记事本,把 'a'
键按住不放,可以看到会不停的产生 'a' 直到我们松开。这是由于,当按住一个键不放时,将会 Typematic
,也就是自动打。每隔一定时间,自动产生一个被按住的键的 Make Code,直到最后松开该键。对于 Typematic 有两个重要的参数,一个是
Typematic Delay ,决定了按下多长时间之后,进入 Typematic,另一个是 Typematic Rate,决定了在进入
Typematic 之后,一秒钟内能产生多少个 Make Code 。现在我们再打开记事本,按住 'a' 不放,仔细观察,将看到第一个 'a'
和第二个 'a' 之间间隔的时间明显比其他的要长,而之后每个'a'之间的时间间隔是一样的。<BR><BR>
而对于同时按下多个键的情况呢。在一个键被按下,产生了 Make Code,而没有被松开,没有产生 Break Code
的时候,再按下另一个键,于是产生了另一个键的 Make Code ,就算是这两个键被同时按下。之后,这两个键松开时,各自产生各自的 Break
Code。更多的键的情况也是一样。比如要按 Ctrl 和 A,下面的情况就算作是同时按下了 Ctrl 和 A。按Ctrl,产生 Ctrl 的
Make Code,然后按A,产生 A 的 Make Code,然后各自松开,各自产生各自的 Break
Code。<BR><BR>
而对于按一个键不放的时候,再按另一个键的情况呢。我们可以打开一个记事本,把'a'键按住不放,不要松开,然后再按's'键不放。我们可以看到当按下's'时,'a'键并没有松,但是并没有'a'再出现了,而是's'开始出现,这时即使松开了's','a'也不会继续出现了。<BR><BR><BR>1.3
扫描码集<BR><BR> 到目前为止一共有三套扫描码集( Scan Code Set ),ps/2
键盘默认使用第二套。不过可以设置 i8042,让 i8042 把得到的 Scan Code 翻译成 Scan Code Set 1 中的 Scan
Code ,这样键盘驱动从 i8042 得到的所有 Scan Code 都是第一套中的 Scan Code(实际中驱动也是这么做的)。所以我们只讨论
Scan Code Set 1 。需要说明的是 Scan Code 和 ASCII码完全不相同。<BR><BR>
在 Scan Code Set 1 中,大多数键的 Make Code,Break Code 都是一个字节。他们的 Make Code
的最高位都为0,也就是他们的 Make Code 都小于 0x7F。而他们的 Break Code 为其 Make Code 或运算 80h
,也就是把 Make Code 的低7位不变,最高位设置为1。<BR><BR> 还有一些扩展按键,他们的
Scan Code 是双字节的。他们的第一个字节都是E0h,表明这是一个扩展键。第2个字节,和单字节 Scan Code
的情况相同。<BR><BR> 还有一个特殊的键,Pause/Break 键,它的 Make Code 为
E1,1D,45 E1,9D,C5,注意是 E1h 开头。而且它没有 Break Code 。<BR><BR>我们按键的 Make Code
的值的大小,列出 Scan Code Set 1 中的所有扫描码<BR><BR>KEY MAKE BREAK<BR><BR>ESC 01
81 <BR>1 02 82 <BR>2 03 83 <BR>3 04 84 <BR>4 05
85 <BR>5 06 86 <BR>6 07 87 <BR>7 08 88 <BR>8 09
89 <BR>9 0A 8A <BR>0 0B 8B <BR>- 0C 8C <BR>= 0D
8D <BR>BKSP 0E 8E <BR><BR>TAB 0F 8F <BR>Q 10 19 <BR>W
11 91 <BR>E 12 92 <BR>R 13 93 <BR>T 14 94 <BR>Y 15
95 <BR>U 16 96 <BR>I 17 97 <BR>O 18 98 <BR>P 19
99 <BR>[ 1A 9A <BR>] 1B 9B <BR>ENTER 1C
9C <BR><BR>L_CTRL 1D 9D <BR>A 1E 9E <BR>S 1F 9F <BR>D
20 A0 <BR>F 21 A1 <BR>G 22 A2 <BR>H 23 A3 <BR>J 24
A4 <BR>K 25 A5 <BR>L 26 A6 <BR>; 27 A7 <BR>' 28
A8 <BR><BR>` 29 89 <BR>L_SHFT 2A AA <BR>\ 2B AB <BR>Z
2C AC <BR>X 2D AD <BR>C 2E AE <BR>V 2F AF <BR>B 30
B0 <BR>N 31 B1 <BR>M 32 B2 <BR>, 33 B3 <BR>. 34
B4 <BR>/ 35 B5 <BR>R_SHFT 36 B6 <BR><BR>KP * 37
B7 <BR>L_ALT 38 B8 <BR>SPACE 39 B9 <BR>CAPS 3A
BA <BR><BR>F1 3B BB <BR>F2 3C BC <BR>F3 3D BD <BR>F4
3E BE <BR>F5 3F BF <BR>F6 40 C0 <BR>F7 41 C1 <BR>F8 42
C2 <BR>F9 43 C3 <BR>F10 44 C4 <BR><BR>NUM 45
C5 <BR>SCROLL 46 C6 <BR><BR>KP 7 47 C7 <BR>KP 8 48
C8 <BR>KP 9 49 C9 <BR>KP - 4A CA <BR><BR>KP 4 4B
CB <BR>KP 5 4C CC <BR>KP 6 4D CD <BR>KP + 4E
CE <BR><BR>KP 1 4F CF <BR>KP 2 50 D0 <BR>KP 3 51
D1 <BR><BR>KP 0 52 D2 <BR>KP . 53 D3 <BR><BR>F11 57
D7 <BR>F12 58 D8 <BR><BR>KP EN E0,1C E0,9C <BR>R_CTRL E0,1D
E0,9D <BR><BR>KP / E0,35 E0,B5 <BR>R_ALT E0,38
E0,B8 <BR><BR>HOME E0,47 E0,C7 <BR>UP ARROW E0,48
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -