在保护模式下阅读键盘

时间:2018-12-24 03:22:38

标签: c x86 osdev bare-metal protected-mode

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

它读取键,但是键盘布局却发生了怪异的变化。 e.x:如果我按9我得到q,如果我按0我得到w,你明白了。 起初我以为可能是putch函数,但是做一些测试后,我发现putch并不是问题。

1 个答案:

答案 0 :(得分:3)

涉及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,...”。