[英]Read the keyboard in 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;
}
它讀取按鍵,但鍵盤布局以一種奇怪的方式移動; 例如:如果我按 9 我得到 q,如果我按 0 我得到 w,你明白。 一開始我以為可能是putch函數的問題,但是做了一些測試,我發現putch不是問題。
涉及 2 個或更多單獨的硬件:
當涉及不同的硬件時,最好有單獨的驅動程序:
處理 PS/2 控制器的東西; 包括處理“熱插入設備”、設備識別和為識別的設備啟動適當的驅動程序; 並包括提供一個“ get_byte()
/ send_byte()
”接口供其他驅動程序使用。
可能插入的每種設備的驅動程序(鍵盤、鼠標、觸摸屏、條碼掃描儀等); 它不接觸任何 PS/2 控制器的 IO 端口,僅與 PS/2 控制器驅動程序通信(通過 PS/2 控制器驅動程序提供的“ get_byte()
/ send_byte()
”接口)。
請注意(通常,不包括筆記本電腦中的“硬連線設備”場景)絕對沒有理由不能插入兩個 PS/2 鍵盤(具有 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,……”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.