Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АВМиС(лекции).docx
Скачиваний:
13
Добавлен:
25.09.2019
Размер:
2.28 Mб
Скачать

Клавиатура

Управление работой клавиатуры в текстовом режиме осуществляется драйвером терминала, который входит в состав ядра ОС Linux.

Графический режим управления клавиатуры используется при работе приложениями, которые имеют собственный драйвер клавиатуры (пример система XWindow). Приложение само решает какой код символа выбрать для данного скан-кода при заданном сочетании видов модификаторов.

При каждом нажатии на клавишу контроллер клавиатуры генерирует скан-код представляющий собой последовательность длинной от 1 до 6 байта, которую можно получить чтением порта 0x60.

Основная задача драйвера (системного контроллера) – преобразовать эти скан-коды в соответствующие коды клавиш и далее коды символов. Код клавиши (виртуальный код) иногда говорят просто скан-код занимает размер всегда 1 байт (внутренние однобайтовые значения). Для обычной клавиши внутренний код идентичен чистому скан-коду, а расширенные коды заменяются по каким-то алгоритмам и на втором этапе уже внутренние коды преобразуются по специальной таблице раскладки клавиатуры (их много таких) преобразуются в обычные ASCII-коды.

Контроллер интерфейса находящийся на системной плате ЭВМ имеет системную поддержку на уровне BIOS (при каждом нажатии клавиши вырабатывается аппаратное прерывание IRQ1, вектор прерывания имеет номер 9h).

Драйвер клавиатуры может работать в одном из 4 режимов:

  1. RAW (K_RAW) – прикладной программе передается последовательность чистых скан кодов (которые сгенерировала клавиатура). Для интерпретации скан-кодов существуют специальные подпрограммы в библиотеке X_LIB они выбирают подходящий символ в соответствии с таблицей символов которую можно поменять с помощью утилиты xmodmap.

  2. CODE ( K_MEDIUMRAW) в скан код клавиши преобразуется 1 из 127 возможных кодов клавиш keycode преобразование осуществляется в соответствии с внутренней таблицей драйвера клавиатуры. Посмотреть эту таблицу можно с помощью команды getkeycodes и так же ее можно изменить при помощи setkeycodes.

  3. XLATE( K_XLATE) – режим код клавиши преобразуется в ASCII-код символа. Команда dumpkeys выводит на экран таблицу действующую в данный момент раскладки клавиатуры. Раскладу можно поменять при помощи команды loadkeys - загружает в драйвер раскладку клавиатуры из указанного файла (sudo loadkeys ./filename).

  4. UNICODE скан коды преобразуются в двухбайтовые коды таблицы UNICODE (она одна и содержит полный набор всевозможных символов) выбор режима осуществляется прикладной программой которая в данный момент выполняется. Узнать или изменить режим работы драйвера можно с помощью команды kbd_mode.

Из буфера клавиатуры коды можно извлечь при помощи программного прерывания BIOS int 16h.

Любой контроллер, как правило состоит из 3-ех регистров регистр данных, управления, состояния. Регистр данных имеет порт с адресом 60h. Используется для:

  • Считывания информации поступившей от клавиатуры.

  • Для передачи информации в клавиатуру.

  • Для получения информации возвращаемой контроллером интерфейса в ответ на выданную ему команду.

  • Запись информации необходимой для исполнения ранее выданной контроллеру команды.

Признаком наличия данных для считывания служит единица в младшем бите регистра состояния. Регистр состояния доступен при считывании из управляющего порта 64h.

Формат регистра состояния:

0 бит равен единице – выходной буфер контроллера содержит информацию.

1 бит равен единице – входной буфер контроллера заполнен, запись в регистр данных и команд запрещена.

2 бит равен нулю – был выполнен аппаратный сброс, равен единице – инициализация персонального компьютера закончена.

3 бит равен нулю – сигнализирует о том что последней передачей байта контроллеру была выдача команды, равен единице – последней передачей была выдача данных.

4 бит равен нулю – если клавиатура заблокирована.

5 бит равен единице – если в регистре данных находится байт полученный от мыши.

6 бит равен единице при зафиксированном таймауте. (если таймаут возник при передаче данных в устройство клавиатуры в регистре данных находится слово FE, а если при приеме данных от клавиатуры то будет значение FF).

7 бит равен единице если обнаружена ошибка четности.

Регистр команд доступен только для записи порт 64h.