Читать клавиатуру в защищенном режиме - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать контроллер клавиатуры 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, вы понимаете.Сначала я подумал, что это может быть функция «путч», но, выполнив некоторые тесты, я понял, что «путч» не является проблемой.

1 Ответ

0 голосов
/ 24 декабря 2018

Здесь задействовано 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()".

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

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

...