在保护模式下读取键盘

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, ..."。

【讨论】:

以上是关于在保护模式下读取键盘的主要内容,如果未能解决你的问题,请参考以下文章

01保护模式

FreeDOS 实模式 保护模式

进入保护模式

内核保护模式之分段机制

实模式与保护模式

在保护模式下无法访问 32 位