在保护模式下读取键盘
Posted
技术标签:
【中文标题】在保护模式下读取键盘【英文标题】:Read the keyboard in protected mode 【发布时间】:2021-07-09 07:59:23 【问题描述】:我正在尝试做一个 PS/2 键盘控制器,但我无法让它工作。
outb(0x60, 0xED);
outb(0x60, 2); /* Turn on CapsLock LED (doesn't works)*/
char c = 0;
while (c != 1)
if (inb(0x60) != c)
c = inb(0x60);
if (c > 0)
putch(scan2char(c));
scan2char 函数:
char scan2char(char scn)
char keych;
switch (scn)
case 0x15:
keych = 'q';
break;
case 0x1D:
keych = 'w';
break;
case 0x24:
keych = 'e';
break;
case 0x2D:
keych = 'r';
break;
case 0x2C:
keych = 't';
break;
case 0x35:
keych = 'y';
break;
return keych;
它读取按键,但键盘布局以一种奇怪的方式发生了变化;例如:如果我按 9,我得到 q,如果我按 0,我得到 w,你懂的。 一开始我以为可能是putch函数,但做了一些测试,发现putch不是问题。
【问题讨论】:
确保您拥有使用这些 I/O 端口所需的权限。 @linuxfan 我在裸机编程 标签protected-mode
让我怀疑...
【参考方案1】:
涉及 2 个或更多独立的硬件:
PS/2 控制器(主要是一个美化的串行端口控制器) 任何插入第一个 PS/2 端口的东西(键盘、鼠标、触摸屏、条形码扫描仪……) 随便插到第二个 PS/2 端口当涉及到单独的硬件时,最好使用单独的驱动程序:
处理 PS/2 控制器的东西;包括处理“热插入设备”、设备识别和为识别的设备启动适当的驱动程序;并包括提供“get_byte()
/send_byte()
”接口供其他驱动程序使用。
为每种可能插入的设备(键盘、鼠标、触摸屏、条形码扫描仪等)提供驱动程序;它不接触任何 PS/2 控制器的 IO 端口,仅与 PS/2 控制器驱动程序通信(通过 PS/2 控制器驱动程序提供的“get_byte()
/send_byte()
”接口)。
请注意(通常,不包括笔记本电脑中的“硬连线设备”场景)您绝对没有理由不能插入两个 PS/2 键盘(有两个完全相同的“PS/ 2 键盘驱动程序”运行);或两个 PS/2 鼠标,或一个条形码扫描仪和一个触摸屏(没有键盘和鼠标),或任何 PS/2 端口中任何类型设备的任何其他组合。此外(如果您喜欢便携性)没有理由为什么相同的 PS/2 键盘/鼠标/任何设备驱动程序不能在具有完全不同 PS/2 控制器的完全不同架构上“按原样”工作(仅需要重新编译即可) (例如一些ARM系统有的PL050 PS/2控制器),仅仅是因为完全不同的PS/2控制器的驱动可以提供完全相同的“get_byte()
/send_byte()
”接口。
适用于 80x86 PC 上的“8042”PS/2 控制器;您可能应该阅读(如果不遵循)此处描述的初始化序列:https://wiki.osdev.org/%228042%22_PS/2_Controller#Initialising_the_PS.2F2_Controller
如果您没有正确初始化 PS/2 控制器(例如,只使用“随机启动加载程序留下的任何状态”),那么它可能会留下一个糟糕的转换功能,其中数据来自该设备被控制器故意损坏,以便与原始 IBM XT 机器向后兼容(在扫描代码集 2 存在之前);现代键盘为扫描代码集 2 发送字节,但 PS/2 控制器将它们转换为“与扫描代码集 1 兼容”的值,从而导致诸如(例如)“如果按 9,则得到 q,如果按 0,则得到 w, ..."。
【讨论】:
以上是关于在保护模式下读取键盘的主要内容,如果未能解决你的问题,请参考以下文章