Чтение клавиатуры в защищенном режиме

Я пытаюсь сделать контроллер клавиатуры 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.


person Community    schedule 24.12.2018    source источник
comment
Убедитесь, что у вас есть необходимые привилегии для использования этих портов ввода-вывода.   -  person linuxfan says Reinstate Monica    schedule 24.12.2018
comment
@linuxfan Я занимаюсь программированием на «голом железе»   -  person    schedule 24.12.2018
comment
Тег protected-mode заставил меня заподозрить...   -  person linuxfan says Reinstate Monica    schedule 24.12.2018


Ответы (1)


Задействовано 2 или более отдельных аппаратных частей:

  • контроллер PS/2 (который в основном является просто прославленным контроллером последовательного порта)
  • все, что подключено к первому порту PS/2 (клавиатура, мышь, сенсорный экран, сканер штрих-кода, ...)
  • что бы ни было подключено ко второму порту PS/2

Когда задействованы отдельные аппаратные части, лучше иметь отдельные драйверы:

  • что-то, что управляет контроллером PS/2; включая обработку «устройства горячей вставки», идентификацию устройства и запуск соответствующего драйвера для идентифицированного устройства; и в том числе предоставление интерфейса «get_byte()/send_byte()» для использования другими драйверами.

  • драйвер для каждого типа подключаемых устройств (клавиатура, мышь, сенсорный экран, сканер штрих-кода и т. д.); который не касается ни одного из портов ввода-вывода контроллера PS/2 и взаимодействует только с драйвером контроллера PS/2 (через интерфейс «get_byte()/send_byte()», предоставляемый драйвером контроллера PS/2).

Обратите внимание, что (в общем, за исключением сценариев «проводных устройств» в ноутбуках) нет абсолютно никаких причин, по которым вы не можете подключить две клавиатуры PS/2 (с двумя отдельными экземплярами одного и того же «драйвера клавиатуры PS/2»). " Бег); или две мыши PS/2, или сканер штрих-кода и сенсорный экран (без клавиатуры и без мыши), или любая другая комбинация любых типов устройств в любых портах PS/2. Кроме того (если вам нравится переносимость), нет никаких причин, по которым одни и те же драйверы клавиатуры/мыши/любого устройства PS/2 не могут работать «как есть» (с перекомпиляцией и ничем более) на совершенно разных архитектурах с совершенно разными контроллерами PS/2. (например, контроллер PL050 PS/2, который есть в некоторых системах ARM), просто потому, что драйвер для совершенно другого контроллера PS/2 может предоставить точно такой же интерфейс «get_byte()/send_byte()».

Для контроллера PS/2 "8042" на ПК 80x86; вам, вероятно, следует прочитать (если не следовать) последовательность инициализации, описанную здесь: //wiki.osdev.org/%228042%22_PS/2_Controller#Инициализация_the_PS.2F2_Controller

Если вы не инициализируете контроллер PS/2 должным образом (например, просто используете «произвольное произвольное состояние, в котором вещь оказалась в загрузчике»), возможно, он остался с включенной ужасной функцией перевода, где данные с устройства намеренно искажен контроллером для обратной совместимости с исходными машинами IBM XT (до появления набора кодов сканирования 2); где современная клавиатура отправляет байты для набора кодов сканирования 2, но контроллер PS/2 преобразует их в значения, совместимые с набором кодов сканирования 1, вызывая такие вещи, как (например) «если вы нажмете 9, вы получите q, если вы нажмете 0, вы получить ж,...".

person Brendan    schedule 24.12.2018