在保护模式下读取键盘

2024-03-28

我正在尝试制作 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));
    }
}

扫描2字符函数:

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 不是问题。


涉及 2 个或更多独立的硬件:

  • PS/2 控制器(主要是一个美化的串行端口控制器)
  • 无论插入第一个 PS/2 端口的是什么(键盘、鼠标、触摸屏、条形码扫描仪……)
  • 无论插入第二个 PS/2 端口发生什么情况

当涉及单独的硬件时,最好有单独的驱动程序:

  • 处理 PS/2 控制器的东西;包括处理“热插入设备”、设备识别以及为识别的设备启动适当的驱动程序;并包括提供“get_byte()/send_byte()” 供其他驱动程序使用的接口。

  • 可能插入的每种设备的驱动程序(键盘、鼠标、触摸屏、条形码扫描仪……);它不接触任何 PS/2 控制器的 IO 端口,仅与 PS/2 控制器驱动程序通信(通过“get_byte()/send_byte()“由 PS/2 控制器驱动程序提供的接口)。

请注意(一般来说,排除笔记本电脑中的“硬连线设备”场景)绝对没有理由不能插入两个 PS/2 键盘(具有完全相同的“PS/2 键盘驱动程序的 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 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 则得到 q”之类的结果。得到w,......”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在保护模式下读取键盘 的相关文章