C 在保护模式下读取键盘
我正在尝试做一个PS/2键盘控制器,但我无法让它工作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
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()
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我正在进行裸机编程标签
保护模式
让我怀疑。。。