这里将键盘控制器和键盘分开来,因为键盘是键盘,键盘控制器是键盘控制器,键盘是物理设备,键盘控制器是一种控制键盘的控制芯片。从另外一个角度,我们在编写键盘相关接口,包括键盘驱动程序的时候,还有鼠标,有时候是需要和键盘打交道,有时候需要和键盘控制器打交道,包括和鼠标打交道。因为通过端口方式操作键盘和键盘控制器有些不一样,涉及的端口有些差异,以及发送给键盘和键盘控制器的命令也是不一样的。
输入输出缓冲区
包括输入缓冲区和输出缓冲区,它们都是8位字节。往键盘写入数据和从键盘读取数据都是从这两个缓冲区读取或者写入。
输入缓冲区
输出缓冲区
PS/2控制器
PS/2 Controller即PS/2控制器,通常也叫键盘控制器。
支持PS/2控制器的设备叫做PS/2设备。通常我们的键盘和鼠标都支持PS/2控制器,所以我们常见的键盘和鼠标也被称为PS/2设备。
寄存器
Status Register
Status Register即状态寄存器
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |Output buffer status (0 = empty, 1 = full)
| | | | | | |Input buffer status (0 = empty, 1 = full)
| | | | | |System Flag
| | | | |Command/data (0 = data written to input buffer is data for PS/2 device, 1 = data written to input buffer is data for PS/2 controller command)
| | | |Unknown (chipset specific)
| | |Unknown (chipset specific)
| |Time-out error (0 = no error, 1 = time-out error)
|Parity error (0 = no error, 1 = parity error)
配置字节
// +-+-+-+-+-+-+-+-+
// | | | | | | | | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | |First PS/2 port interrupt (1 = enabled, 0 = disabled)
// | | | | | | |Second PS/2 port interrupt (1 = enabled, 0 = disabled, only if 2 PS/2 ports supported)
// | | | | | |System Flag (1 = system passed POST, 0 = your OS shouldn't be running)
// | | | | |Should be zero
// | | | |First PS/2 port clock (1 = disabled, 0 = enabled)
// | | |Second PS/2 port clock (1 = disabled, 0 = enabled, only if 2 PS/2 ports supported)
// | |First PS/2 port translation (1 = enabled, 0 = disabled)
// |Must be zero
unsigned char kb_read_configuration_byte() { // send command 0x20 to command register outpb_32(IO_PORT_64, KB_PS2_CTR_CMD_20); // then read it. return kb_read(); }
USB遗留支持
按照现在的标准,很多设备都通过USB进行连接。并不是所有电脑都支持PS/2,有些PC甚至可能根本没有PS/2连接器,为了保持与旧软件兼容,主板模拟USB键盘和鼠标作为PS/2设备。 这被称为USB遗留支持。
模拟的PS/2控制器
键盘
键盘是一种标准输入设备。我们常说的标准输入输出,这个标准输入就是通过键盘输入。如scanf函数,在调用后,会阻塞等待用户输入。
键盘上有很多键,这些键按下代表对应输入,按下a键,表示输入a,像我们经常写文档,通过键盘输入,文档中显示我们编写的内容,这里对应会在文档中输出a。当然这里其实包含两个操作,这里只是说的是输入,输出由显卡完成并显示在屏幕上。
键盘输入不只是在键被按下时发生,在键被按下释放的时候也会产生输入。键盘按下和释放时产生的输入并不是我们在键盘上看到的按键字符,而是按键对应的扫描码,也就是说,键被按下时会产生一个对应的扫描码,释放时也会产生一个对应的扫描码。
键盘上的按键按功能分成几个功能区。
键盘也有很多标准,这个根据扫描码集定义,不同的扫描码集标准对应键盘上的按键及键盘键布局也有一定的差异。
键盘也是一种PS/2设备。
+--------------------------| PS/2 |--------------------------+
| | Device | |
| +------------------+ |
| |
| +--------------------+ |
| Press/Release Key--->| kb | |
| +--------------------+ |
| | ^ |
| v | |
| +---------------+ +--------------+ |
+--+------------| output buffer | | input buffer |<------------+--+
| | +---------------+ +--------------+ | |
| | | |
| +------------------------------------------------------------------------+ |
| +------------------+ |
| +--------------------------| PS/2 |--------------------------+ |
| | | Controller | | |
| | +------------------+ | |
| | | |
| | +------------------+ +------------------+ +------------------+ | |
| | | Command Register | | Command Register | | Data Register | | |
| | +------------------+ +------------------+ +------------------+ | |
| | ^ | | |
| | | | | |
| +----------------------------------------------------+--------------+----+ |
| Port| |Port |
| 0x60| |0x60 |
| +----------------------------------------------------+--------------+----+ |
| | | v | |
Port| | +--------------------------------------------------------------------+ | |Port
0x60+--+>| 键盘接口 |-+--+0x60
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| +--------------------------------------------------------------------+ |
| ^ | |
| | | |
| | v |
| +------------+ |
| | 键盘驱动 | |
| +------------+ |
| ^ | |
| | | |
| | v |
| +--------------------------------------------------------------------+ |
| | 硬件抽象层 | |
| | +------------+ | |
| | | I/O 驱动 | | |
| | +------------+ | |
| | ^ | | |
| | | | | |
| +-----------------------------+--------+-----------------------------+ |
| | v |
| |
| +------------------+ |
+--------------------------| os |--------------------------+
+------------------+
关于键盘鼠标等PS/2设备及控制器的一些"less simple"不那么简单的情况
The PS/2 Controller has hardware faults and your OS did no testing
There's a USB keyboard and a PS/2 mouse, and the BIOS didn't bother initialising the PS/2 controller because it was using USB Legacy Support and not using the mouse
You want to reliably send data to the second PS/2 device on older hardware and have to know the second PS/2 port exists (see the warning for "Sending Bytes To The Second PS/2 Port" below).
鼠标
输入缓冲区
输出缓冲区
轮训(Poll)方式
中断方式
键盘可以通过中断的方式读取键盘的输入。当有键盘输入的时候,键盘会产生IRQ1中断请求,中断控制器收到键盘产生的这个中断请求后,根据初始化设置,这个IRQ1对应应该产生的中断(向量),对应一个中断号,发送给CPU,CPU根据这个中断号,调用中断处理例程。
采用这种方式之前,应该先做一些中断相关的设置。
实地址模式
实地址模式下,就是设置中断向量表以及每个中断向量,包括编写中断处理程序
保护模式
保护模式下,就是设置中断描述符表以及每个中断描述符,也需要编写中断处理程序
还得初始化中断控制器
然后通过中断屏蔽位开启键盘中断
编写键盘IRQ1中断请求处理例程
开启硬件中断
在初始化PS/2控制器的时候,还得开启第1个(first)PS/2端口。如果没有开启这个端口的话,键盘不会产生IRQ1中断请求。这个可以通过向PS/2控制器发送0xAE/0xA8命令,或者通过设置配置字节的方式去开启第1个(first)PS/2端口,通过向PS/2控制器发送0x20命令读取配置字节,向PS/2控制器发送0x60命令写入配置字节。
关于中断、IRQ和PIC、APIC以及8259/8259A参考另一篇:https://www.iteye.com/blog/lobin-2038516
设置读取方式
接收键盘鼠标输入可以通过轮训的方式,还可以通过中断的方式。
键盘操作
读取键盘按键
键盘鼠标接口
键盘接口
键盘控制器相关接口以"kbc_"为前缀,以区分键盘相关接口。
byte kb_input();
byte kb_read();
byte kb_bf_read();
int kb_bf_read(char* dest, int nbytes);
相关推荐
MikroTik RouterOS是一种路由操作系统,并通过该软件将标准的PC电脑变成专业路由器,在软件RouterOS 软路由图的开发和应用上不断的更新和发展,软件经历了多次更新和改进,使其功能在不断增强和完善。特别在无线、...
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...
第十一章 对话框 11.1 模态对话框 11.1.1 创建about对话框 11.1.2 对话框及其模板 11.1.3 对话框过程 11.1.4 激活对话框 11.1.5 不同的主题 11.l.6 更复杂的对话框 11.1.7 使用对话框控制 ...
第一章考点总结 第一节和第二节知识点 1、 第一台电子数字计算机于 1946 年诞生在美国,名叫 ENICA。 2、 计算机的四个发展阶段:第一代电子管;第二代晶体管;第三代中小规模集成电路;第四代大规模、 超大规模集成...
四、实验原理 所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。比如:uCOS-II在读写处理器、...
题目一:基于μc/os-Ⅱ的多任务实现 一、 基本要求(必做) 以实验二十二为基础,做如下的改进。 1) 求出四路通道的平均值,并绘制在显示屏上(平均值应该象其他通道的值一样,可以根据实时采集值的变化而变化)。 ...
第15章 LCD显示驱动的实现 15.1 点阵字符型LCD-TC1602A简介 15.2 TC1602A液晶显示器与DP-51单片机仿真实验仪的连接 15.3 驱动程序的使用 15.4 对TC1602A操作的基本函数 15.5 初始化TC1602A液晶显示器 15.6 消除指定...
在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...
├─第15章 流量操控与隧道 │ 任务114:流量操控技术、重定向.mp4 │ 任务115:SSH隧道和SSH本地端口转发.mp4 │ 任务116:SSH远程端口转发和动态端口转发以及X协议转发.mp4 │ 任务117:DNS协议隧道、DNS协议隧道-...
如同系统BIOS的快取功能,启用影像BIOS的快取功能将允许存取影像BIOS自C0000H到C7FFFH具有快取功能,如果快取控制器也被启用。高速缓存的大小愈大,影像效能将会更快速。 Memory Hole At 15M-16M(扩展卡内存分配...
《计算机应用基础》第二章测试卷1全文共6页,当前为第1页。《计算机应用基础》第二章测试卷1全文共6页,当前为第1页。《计算机应用基础》第二章测试卷1 《计算机应用基础》第二章测试卷1全文共6页,当前为第1页。 ...
13.3 小结 13.4 问与答 13.5 作业 第14章 存储应用程序首选项 第15章 使用表视图显示和导航数据 第16章 读写数据 第17章 创建可旋转及调整大小的用户界面 第18章 扩展触摸界面 第19章 使用加速计输入检测移动 第20章...
四、实验原理 所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。比如:uCOS-II在读写处理器、...
在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...
嵌入式系统从20世纪70年代单片机的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,至今已有30多年的发展历史。最初的嵌入式系统应用是基于单片机的,使得汽车,家电,工业机器人,通信装置以及成千上万...
联机(键盘操作命令)、脱机(作业控制语言) 用户组合自编(Shell语言):DOS Shell;UNIX ;BShell、CShell等 •系统调用(System Call) 4、作业输入输出方式 •输入输出方式:脱机、直接...
nand1: add r3, r3, #0x1 cmp r3, #0xa blt nand1 nand2: ldr r2, [r1, #oNFSTAT] @ wait ready tst r2, #0x1 beq nand2 ldr r2, [r1, #oNFCONF] orr r2, r2, #0x800 @ disable chip str r2, [r1, #...
特殊的控制器(如 RAID 控制器)需要额外的内核模块,请向安装系统提供一 个内核模块更新磁盘。 4 入门指南 其他安装目标可能是提供运行操作系统所需的足够磁盘空间和速度的所有种类 的块设备。这包括网络块设备,如...
计算机基础知识试题(1)全文共5页,当前为第1页。1、计算机主机是由cpu与下列哪种设备共同构成的(d )a.控制器 b.运算器 c.输入、输出设备 d.内存储器2、计算机能直接执行的指令包括两部分,它们是(b ) a.源...