`
lobin
  • 浏览: 427785 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于os的一些整理:第十五篇:键盘:1、键盘控制器

 
阅读更多

这里将键盘控制器键盘分开来,因为键盘是键盘,键盘控制器是键盘控制器,键盘是物理设备,键盘控制器是一种控制键盘的控制芯片。从另外一个角度,我们在编写键盘相关接口,包括键盘驱动程序的时候,还有鼠标,有时候是需要和键盘打交道,有时候需要和键盘控制器打交道,包括和鼠标打交道。因为通过端口方式操作键盘和键盘控制器有些不一样,涉及的端口有些差异,以及发送给键盘和键盘控制器的命令也是不一样的。

 

输入输出缓冲区

包括输入缓冲区和输出缓冲区,它们都是8位字节。往键盘写入数据和从键盘读取数据都是从这两个缓冲区读取或者写入。

 

输入缓冲区

 

输出缓冲区

 

 

PS/2控制器

PS/2 Controller即PS/2控制器,通常也叫键盘控制器。

 

支持PS/2控制器的设备叫做PS/2设备。通常我们的键盘和鼠标都支持PS/2控制器,所以我们常见的键盘和鼠标也被称为PS/2设备。

 

寄存器

Status Register

Status Register即状态寄存器

写道
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |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)

 

 

 

配置字节

 

写道
// 7 6 5 4 3 2 1 0
// +-+-+-+-+-+-+-+-+
// | | | | | | | | |
// +-+-+-+-+-+-+-+-+
// ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | |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"不那么简单的情况

写道
Something (e.g. a Boot Manager) left the PS/2 Controller in a dodgy state
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);

 

 

0
0
分享到:
评论

相关推荐

    RouterOS2.9.6.with.crack及配置动画

    MikroTik RouterOS是一种路由操作系统,并通过该软件将标准的PC电脑变成专业路由器,在软件RouterOS 软路由图的开发和应用上不断的更新和发展,软件经历了多次更新和改进,使其功能在不断增强和完善。特别在无线、...

    OS X和iOS核心编程(Apress.OS.X.and.iOS.Kernel.Programming)

    读者将学习到USB的架构,包括主机控制器、设备、集线器以及它们之间的通信协议。章节可能涵盖了USB版本的发展历程,如USB 1.1、2.0、3.0和USB Type-C等,以及它们的传输速度和特性。此外,书中还可能涉及USB设备类别...

    ARM3000实验指导书

    2. **实验二十五**: MiniGUI到μC/OS-II-----LOADBMP位图操作,展示如何在MiniGUI中加载和显示位图图像。 #### 第八章 嵌入式系统扩展板开发案例 本章涉及嵌入式系统的扩展功能开发。 1. **扩展实验一**: GPRS...

    网管教程 从入门到精通软件篇.txt

    网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...

    蓝桥杯嵌入式第15届省赛程序设计题(完整工程+题目)(0积分,拿走请关注)

    1. **微处理器与微控制器**:理解不同类型的微处理器和微控制器的区别,如ARM架构,其在嵌入式系统中的应用广泛。 2. **操作系统与实时性**:嵌入式系统中常见的是实时操作系统(RTOS),如FreeRTOS、RTOS-Lite、μ...

    Windows 程序设计(第5版)(上、下册)--详细书签版

    第十一章 对话框 11.1 模态对话框 11.1.1 创建about对话框 11.1.2 对话框及其模板 11.1.3 对话框过程 11.1.4 激活对话框 11.1.5 不同的主题 11.l.6 更复杂的对话框 11.1.7 使用对话框控制 ...

    计算机英语词汇:计算机基础知识.pdf

    这份文档是关于计算机基础知识的专业英语词汇列表,适用于计算机专业领域。它涵盖了广泛的概念、工具、技术以及与计算机相关的基本术语。在这些内容中,我们可以识别出多个与计算机技术相关的专业词汇和短语,并从中...

    可编程4k超清1200万像素摄像头+蓝牙点击器一体机(python源码)

    支持编程模拟标准键盘向电脑,或者手机发送键盘动作指令, 以上鼠标和键盘指令都可以通过python,C/C++,Java,易语言等各种编程语言实际控制. 安装教程 代码使用python3.8.8编写 先安装python3.8,只适用于python3.8这个...

    职称计算机考试题.pdf

    15. 控制器:控制器是计算机硬件系统的指挥中心,负责解释和执行指令。 16. 显示器:显示器是输出设备,用于显示计算机处理的信息。 17. 计算机软件:它包括程序及其相关的文档,如操作系统、编译程序和应用软件等...

    职中计算机应用基础期中考试试题及答案.pdf

    5. 运算器、控制器和内存储器的总称:主机或CPU(中央处理器)的一部分。 6. 系统软件最重要的是:操作系统,如Windows、Linux、Mac OS等。 7. 不是计算机硬件的例子:DOS,因为它是操作系统的一部分,而非物理...

    [iPhone和iPad开发书籍大全].Take.Control.of.iPad.Networking.and.Security(TidBITS.2010-06)

    #### 十五、推荐书籍 - **章节**:推荐书籍 - **内容**: - 增加 iPad IQ:推荐了其他相关的 iPad 使用技巧书籍。 - 更多 Take Control 电子书:提供了出版社其他电子书的信息。 ### 总结 《掌控 iPad 网络与...

    自学考试嵌入式总复习题

    MCU**:微控制器广泛应用于嵌入式系统。 - **B. DSP**:数字信号处理器也被广泛应用于嵌入式系统。 - **C. SoC**:系统级芯片是嵌入式系统的核心组件之一。 - **D. BSP**:BSP是板级支持包,而不是处理器。 - ...

    PRE_PPT_CHAP1_V1.0.ppt

    - **冯·诺依曼体系结构**:这是现代计算机的基础架构,它包括五个主要部分:运算器、控制器、存储器、输入设备和输出设备。 - **运算器(CA)**:负责执行基本的算术和逻辑运算。 - **控制器(CC)**:管理整个计算机...

    人大高起点计算机基础.pdf

    【计算机基础知识概述】 计算机基础知识是理解信息技术和使用现代科技设备的基础。...24. 中央处理器:微型计算机系统的中央处理器通常指控制器和运算器,它们是CPU的核心组成部分,负责执行指令和数据处理。

    全国计算机一级考试知识点教学提纲.pdf

    * 计算机系统结构五大部分:运算器、控制器、存储器、输入设备、输出设备 * 运算器和控制器合称 CPU(中央处理器),CPU 和内存(也叫主存)合称主机 * 存储器分内存和外存,内存也叫主存,外存也叫辅存 * 输入设备...

    十天学会单片机100个实例.pdf

    #### 九、键盘控制 - **实例69-78:独立式键盘和矩阵式键盘的控制** - **知识点**: - 键盘连接:如何正确连接独立式键盘和矩阵式键盘。 - 消抖处理:消除按键抖动的方法及其在实际项目中的应用技巧。 - 扫描...

Global site tag (gtag.js) - Google Analytics