C 在保护模式下读取键盘

C 在保护模式下读取键盘,c,x86,osdev,bare-metal,protected-mode,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)); } } sc

我正在尝试做一个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不是问题所在。

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

  • PS/2控制器(主要只是一个美化的串行端口控制器)
  • 插入第一个PS/2端口(键盘、鼠标、触摸屏、条形码扫描仪等)时发生的任何情况
  • 无论第二个PS/2端口插入了什么
当涉及单独的硬件时,最好有单独的驱动程序:

  • 处理PS/2控制器的部件;包括处理“热插拔装置”、装置识别和启动已识别装置的适当驱动器;包括为其他驱动程序提供一个“
    get\u byte()
    /
    send\u byte()
    ”接口

  • 每种可能插入的设备(键盘、鼠标、触摸屏、条形码扫描仪等)的驱动程序;它不接触任何PS/2控制器的IO端口,只与PS/2控制器驱动程序通信(通过PS/2控制器驱动程序提供的“
    get\u byte()
    /
    send\u byte()
    ”接口)

请注意(一般情况下,不包括笔记本电脑中的“硬接线设备”场景),绝对没有理由不能插入两个PS/2键盘(两个完全相同的“PS/2键盘驱动程序”单独运行);或两个PS/2鼠标,或条形码扫描仪和触摸屏(无键盘和鼠标),或任何PS/2端口中任何类型设备的任何其他组合。此外(如果您喜欢便携性),没有理由说明相同的PS/2键盘/鼠标/任何设备驱动程序不能“按原样”在具有完全不同的PS/2控制器(例如某些ARM系统具有的PL050 PS/2控制器)的完全不同的体系结构上工作(只需重新编译),因为完全不同的PS/2控制器的驱动程序可以提供完全相同的“
get\u byte()
/
send\u byte()
”接口

用于80x86 PC上的“8042”PS/2控制器;您可能应该阅读(如果不遵循)此处描述的初始化顺序:


如果您没有正确初始化PS/2控制器(例如,只使用“启动加载程序留下的东西的随机状态”),那么它可能已经启用了糟糕的转换功能,其中来自设备的数据被控制器故意破坏,以便与原始IBM XT机向后兼容(从扫描代码集2存在之前开始);现代键盘为扫描代码集2发送字节,但PS/2控制器将其转换为“扫描代码集1兼容”值,导致(例如)“按9得到q,按0得到w…”.

确保您有使用这些I/O端口所需的权限。@linuxfan我正在进行裸机编程标签
保护模式
让我怀疑。。。