在保护模式下阅读键盘

用户名

我正在尝试做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函数,但是进行一些测试后,我发现不是问题所在。

布伦丹

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章