gpt4 book ai didi

c - 在保护模式下读取键盘

转载 作者:行者123 更新时间:2023-12-04 22:42:09 26 4
gpt4 key购买 nike

我正在尝试做一个 PS/2 键盘 Controller ,但我无法让它工作。

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 函数,但做了一些测试,我发现 putch 不是问题。

最佳答案

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

  • PS/2 Controller (主要是一个美化的串口 Controller )
  • 任何恰好插入第一个 PS/2 端口的东西(键盘、鼠标、触摸屏、条形码扫描仪……)
  • 随便插入第二个 PS/2 端口

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

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

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

请注意(一般来说,不包括笔记本电脑中的“硬连线设备”情况)绝对没有理由不能插入两个 PS/2 键盘(有 2 个完全相同的“PS/2 键盘驱动”正在运行);或两个 PS/2 鼠标,或一个条形码扫描仪和一个触摸屏(没有键盘和鼠标),或任何 PS/2 端口中任何类型的设备的任何其他组合。此外(如果你喜欢便携性)没有理由为什么相同的 PS/2 键盘/鼠标/任何设备驱动程序不能在具有完全不同的 PS/2 Controller 的完全不同的体系结构上“按原样”工作(重新编译,仅此而已) (例如,某些 ARM 系统具有的 PL050 PS/2 Controller ),仅仅是因为完全不同的 PS/2 Controller 的驱动程序可以提供完全相同的“get_byte()/send_byte() ”界面。

对于 80x86 PC 上的“8042”PS/2 Controller ;您可能应该阅读(如果不遵循)此处描述的初始化序列:https://wiki.osdev.org/%228042%22_PS/2_Controller#Initialising_the_PS.2F2_Controller

如果你没有正确初始化 PS/2 Controller (例如,只是使用“随机的任何状态,引导加载程序碰巧留下了东西”)那么它可能已经启用了一个糟糕的翻译功能,其中数据来自该设备被 Controller 故意破坏以向后兼容原始 IBM XT 机器(在扫描代码集 2 存在之前);现代键盘为扫描代码集 2 发送字节,但 PS/2 Controller 将它们转换为“扫描代码集 1 兼容”值,导致类似(例如)“如果你按 9 你得到 q,如果你按 0 你得到 w, ..."。

关于c - 在保护模式下读取键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53908872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com