簡體   English   中英

在保護模式下讀取鍵盤

[英]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 控制器(主要只是一個美化的串口控制器)
  • 無論碰巧插入第一個 PS/2 端口(鍵盤、鼠標、觸摸屏、條形碼掃描儀,...)
  • 無論發生什么插入第二個 PS/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM