带你了解键盘驱动程序 键盘驱动程序是什么


带你了解键盘驱动程序 键盘驱动程序是什么

文章插图
键盘驱动程序键盘如何工作的前文曾经说过,当时是以 Linux 0.11 为基础讲的但不系统,本文以 xv6 的键盘驱动程序为例来系统地讲述键盘是如何工作的 。关于驱动程序前文磁盘那一篇说过了,它就是硬件物理接口的封装,所以了解键盘驱动程序,同样的还是先来了解键盘的一些物理接口 。
与键盘相关的芯片有两个,一个是键盘编码器 i8048,另一个是键盘控制器 i8042,分别来看 。
键盘编码器键盘编码器位于键盘,它的作用主要是监测键的按下和弹起,然后将两种状态编码,发送给键盘控制器
上述说的码叫做键盘扫描码,编码方式一共有三种,相应的也就有三套键盘扫描码,各套键盘扫描码具体怎么编码的就不说了,见后面的链接 。现今的键盘大多数都是用的第二套键盘扫描码,但也不排除使用第一套和第三套的,所以为了兼容,键盘控制器会统统地转换为第一套扫描码 。当然这是默认的情况,具体使用哪一套扫描码,控制器是否转化,还是要看硬件是否支持与具体怎么设置,有兴趣的详见文末链接 。
因此第一套键盘扫描码还是得说道说道,一个键有按下就会有弹起,所以每个键会有两个状态,即每个键将会对应两个扫描码,键被按下时的编码叫做通码(),弹起时的编码叫做断码()
大部分键的通码和断码都是 8 位 1 字节,但有些操作控制键如 Ctrl、Alt,附加键如Insert,小键盘区如/,方向键等是 2 字节甚至多个字节 。有多个字节的扫描码通常都是以 开头 。只有 一个键是以 开头 。
断码与通码的关系:断码通码 。二进制表示为,所以对于断码和通码可以这样理解,它们由 8 位比特组成,最高位第 7 位表示按键状态,1 表示按下,0 表示弹起 。
键盘控制器键盘控制器(i8042),不在键盘内部,被集成在南桥芯片上 。主要接收键盘编码器发来的键盘扫描码,做一些处理(比如第二套扫描码转第一套),然后触发中断通知 CPU 来读取扫描码
键盘控制器有 4 个 8 bits 寄存器,Status Register 和 Control Register,两者共用一个端口 0x64,读的时候是状态寄存器,写的时候是控制寄存器 。Input Buffer 和 Output Buffer,两者共用一个端口 0x60,读的时候是输出缓冲器,写的时候是输入缓冲器 。
状态寄存器:bit0:1 表示输出缓存器满,CPU 读取后清零 。从编码器发过来的扫描码就放在这里 。
bit1:1 表示输入缓存器满,控制器读取后清零 。
控制寄存器:通过写 0x64 端口来向控制器发送命令,注意是向控制器本身发命令而不是向硬件设备键盘发命令,对于键盘的控制就是通过控制器来间接控制,所以只需要操作键盘就是了 。
命令控制器就是将命令字节写入 0x64 端口,一般命令就是一字节,如果有两字节,则将第二个字节写入 0x60 端口 。因为要写 0x60 端口表示的缓存区,所以要先判断该缓存区是否为空 。
比如进入保护模式设置 时,先判断输入缓存区是否为空,空的话表示控制器已取走数据,可以继续进行,否则不空的话循环等待
inb $0x64,%al # Wait for not busy 等待i8042缓冲区为空testb $0x2,%aljnz seta20.1
再向 0x64 端口写入命令,表示准备写 Output 端口,随后写入 0x60 端口的字节将放入 Output 端口 。
inb $0x64,%al # Wait for not busy 同上testb $0x2,%aljnz seta20.2movb $0xdf,%al # 0xdf -> port 0x60 向端口0x60写入0xdf,打开A20outb %al,$0x60
同样的先判断输入缓存区是否为空,然后写入命令第二字节,这个字节会被送到 Output 端口,这个端口也是一个控制端口,bit2 控制着 的开关,所以如果是命令字节 表示关闭。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: