在保护模式下读取键盘

3

我正在尝试制作一个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 function:

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 says Reinstate Monica
@linuxfan 我正在进行裸机编程。 - user10481362
标签 protected-mode 让我怀疑... - linuxfan says Reinstate Monica
1个回答

4

涉及到两个或更多独立的硬件部件:

  • 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键盘驱动程序”的 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机器向后兼容(从scan code set 2存在之前);现代键盘发送扫描码集2的字节,但PS/2控制器将它们转换为“扫描码集1兼容”的值,导致像“如果按9,则获取q,如果按0,则获取w,...”这样的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接