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

关于os的一些整理:第十五篇:键盘

 
阅读更多

这里主要是针对键盘鼠标进行编程,并提供相关键盘鼠标接口。并不关心当前是否可输入等这类等待IO的问题,这些交给输入输出子系统完成。

 

 

从键盘自身的角度看,键盘是一种输入输出设备,我们敲键盘,按下键盘键,释放键盘按下键,就是对键盘的输入,键盘接收到我们的按键后,会将按键对应的键码输出出去,也就是键盘将按键对应的键码存放在输出缓冲区中,就是对键盘的输出。

 

键盘内还有个输入缓冲区,我们也可以往键盘的这个输入缓冲区写入数据,这种情况下,对于键盘来说也是一种对键盘的输入,和敲键盘按下或释放按键对键盘输入不同的是,这里的输入数据是我们自己向键盘输入的。

 

但对于os来说,键盘是一种输入设备,对键盘需要提供的接口就是键盘读操作。键盘提供的读操作接口可以有3个接口。

 

在读键盘的时候,这里有两种情况,我们要读取键盘输入,首先得是键盘有输入或者有输入的数据让你去读,不管是按下释放键盘键的输入,还是我们往输入缓冲写入的数据,所以我们需要根据输出缓冲区的状态判断键盘是否有输入的数据。判断的依据就是检查输出缓冲区是否为空,为空的话说明没有数据可读,为满的话说明有数据可读。

 

所以这里第一个就是直接读键盘输入的接口,就是不检查输出缓冲区直接读,当然这种读操作可能不会读到数据,这种读操作也叫异步操作。

 

第二个读操作就是读之前检查输出缓冲区,知道输出缓冲区满再去读,这种情况也叫同步操作。

 

第三个是在前面两个思路的基础上提供的读键盘操作,按照前面的思路,键盘有输入的话,我们就把数据从输出缓冲区读出来,再存放在我们自己的一个输出缓冲区中。然后我们这里的读操作是从我们自己的输出缓冲区中去读,而不是直接从键盘内部的输出缓冲区读。

如果开启了键盘中断,读操作也有些差异,之前读键盘的时候,我们是根据输出缓冲区的状态来判断输出缓冲区中是否有数据可读。这里如果开启了键盘中断的话,可以依据键盘中断,如果有键盘输入,就会产生中断,也就是输出缓冲区中有数据可读。可以在键盘中断处理函数中读取键盘输入,把数据从输出缓冲区读出来,再存放在我们自己的一个输出缓冲区中。

 

PS/2设备

 

按键

 

 

扫描码

 

 

Scan Code Set

Scan Code Set规定了每个键盘按键按下或释放时产生的Scan Code,通常,按下或释放一个按键会产生一个对应的扫描码,当然也有一个按键产生多个扫描码的。同一个按键,不同的Scan Code Set产生的扫描码不同。目前主要有3种Scan Code Set。

 

Scan Code Set即扫描码集。

enum kb_scan_code_set_t 
{
  SCAN_CODE_SET_1 = 1, // Scan Code Set 1
  SCAN_CODE_SET_2 = 2, // Scan Code Set 2
  SCAN_CODE_SET_3 = 3  // Scan Code Set 3
};

大多数键盘在设计的时候都支持Scan Code Set 2。

 

按键扫描码对应ASCII码映射

通常按下键盘按键,对于显示字符,在显示屏幕上会对应的按键字符。当然,按键产生的是扫描码,并不是直接是显示的字符。所以需要建立按键扫描码到对应显示字符的映射,也就是对应字符的ASCII码,因为将一个字符输出到显示屏幕上显示的时候,实际上是将对应字符的ASCII码输出到显示屏幕上显示。

 

还有特殊按键,这些按键在按下时,并不会在显示屏幕上显示,它们是一些特殊控制功能键,如Shift,Ctrl,Alt,Enter等,这些也有必要建立对应的ASCII码映射。虽然我们不会直接将它们输出到显示屏幕上,但在响应这些特殊按键时,这么做是有好处的,因为不同的Scan Code Set对于同样的键产生的扫描码是不一样的,这样的话,如果不建立这些扫描码到对应ASCII码的映射,意味着需要针对不同Scan Code Set的按键扫描码进行不同的响应处理,即便按下的是同样的按键,比如,同样按下的是F1键,不同的Scan Code Set产生的扫描码不一样,如果没有对应的统一ASCII码映射,需要针对不同的Scan Code Set产生的扫描码进行响应。如果建立了对应的ASCII码映射,尽管采用的是不同的Scan Code Set,但映射的都是一样的ASCII码,可以采用同样的响应处理。

 

另外还有按键释放是产生的扫描码。

 

转换

为了解决不同Scan Code Set之间的兼容性问题,键盘控制器有一个翻译转换功能,可以将Scan Code Set 2翻译转换为Scan Code Set 1。

 

可以通过设置键盘控制器的配置字节来指定是否开启翻译转换功能,控制键盘控制器是否要将按键输入产生的扫描码翻译转换为Scan Code Set 1。

关于键盘控制器的配置字节可参考键盘控制器那篇文章。

 

翻译转换是由键盘控制器完成的,我们只是通过开启或关闭这个翻译转换功能,来控制键盘控制器是否需要翻译转换。

 

Scan Code Set转换

 

命令

#define KB_CMD_ED 0XED
#define KB_CMD_EE 0XEE
#define KB_CMD_F0 0XF0
#define KB_CMD_F2 0XF2
#define KB_CMD_F3 0XF3
#define KB_CMD_F4 0XF4
#define KB_CMD_F5 0XF5
#define KB_CMD_F6 0XF6
#define KB_CMD_F7 0XF7
#define KB_CMD_F8 0XF8
#define KB_CMD_F9 0XF9
#define KB_CMD_FA 0XFA
#define KB_CMD_FB 0XFB
#define KB_CMD_FC 0XFC
#define KB_CMD_FD 0XFD
#define KB_CMD_FE 0XFE
#define KB_CMD_FF 0XFF

 

确认

#define KB_CMD_ACK 0XFA

 

 

 

 

怎么接收键盘输入?

 

键盘鼠标操作

 

 

检查键盘

键盘类型

 

当前采用的是哪种Scan Code Set

 

键盘控制器是否开启翻译转换功能?

这决定了键盘当前采用的是哪套Scan Code Set。

 

是否开启键盘中断?

 

是否开启第1个(first)PS/2端口中断?

 

 

检查鼠标

鼠标类型 

 

检查扫描码集

 

 

设置扫描码集

 

键盘鼠标接口

键盘相关接口以"kb_"为前缀,以区分键盘控制器相关接口。

 

获取当前的扫描码集(Scan Code Set)

int kb_get_scan_code_set()
{
  unsigned char scan_code_set = 0;

  kb_send(KB_CMD_F0, 0); // command to get current scan code set

  scan_code_set = kb_read_16();

  kprintf("kb: scan code set: 0x%x.\r\n$", scan_code_set);
  return scan_code_set;
}

 

设置扫描码集(Scan Code Set)

int kb_set_scan_code_set(enum kb_scan_code_set_t scan_code_set)
{
  kb_send(KB_CMD_F0, scan_code_set); // command to set current scan code set
  return 0;
}

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    七十个电脑使用技巧汇总

    4. **文件夹整理**:定期整理文件,创建有序的文件夹结构,使用文件命名规则,便于查找和管理文件。 5. **网络优化**:了解并调整网络设置,如DNS解析、路由器的QoS设置,可优化网络速度和稳定性。 6. **安全防护*...

    HP惠普LaserJet M1522nM1522nf多功能一体机中文说明书

    - 数字键盘:输入数字、设置复印份数等。 **控制面板菜单:** - **打印设置:** 调整打印质量、纸张尺寸等。 - **复印设置:** 设置复印份数、复印尺寸等。 - **扫描设置:** 选择扫描格式、分辨率等。 - **传真...

    自己动手写操作系统(含源代码).part2

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    自己动手写操作系统(含源代码).part1

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    程序员必须掌握的英语词汇

    6. **Keyboard (键盘)**: 输入设备之一,用于输入文本、命令等。 7. **Notepad (记事本)**: Windows自带的一款简单的文本编辑器。 8. **Word (字,词,微软公司生产的文字处理软件)**: Microsoft Word,是一款功能...

    计算机应用技术(实用手册)

    这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...

    cmd操作命令和linux命令大全收集

    63. osk------------打开屏幕键盘 64. odbcad32-------ODBC数据源管理器 65. oobe/msoobe /a----检查XP是否激活 66. cmd.exe--------CMD命令提示符 67. regsvr32 /u zipfldr.dll------取消ZIP支持 68. ntbackup...

    C++MFC教程

    +-- 第五章 对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框 |------ 5.3 创建无模式对话框 |------ 5.4 在对话框中进行消息映射 |------ 5.5 在对话框中进行数据交换和数据检查 |------...

    《计算机应用基础》第二章测试卷1.docx

    【计算机应用基础】第二章测试卷的内容涵盖了计算机操作系统的基础知识,包括操作系统的作用、分类,Windows 7的基本操作,文件管理,以及计算机安全和维护等方面的知识点。 1. 操作系统(OS)是计算机软件系统中不...

    江苏省专转本计算机知识点.pdf

    1. ENIAC是世界上第一台电子计算机,它于1946年诞生,主要用于数值计算,加减运算速度达到每秒5000次。 2. 信息技术作为现代科技的核心,已经成为推动全球经济社会发展的新动力。 3. 1997年5月11日,IBM的超级...

Global site tag (gtag.js) - Google Analytics