Настройка и работа в Linux
adb5321d

Клавиатура


Теперь рассмотрим ту часть syscons, которая работает с клавиатурой.

Начнем с самого "низа" - "железного" контроллера клавиатуры. При нажатии на любую клавишу он выдает ее скан-код - некий номер кнопки на клавиатуре. Сразу замечу, что этот скан-код не имеет ничего общего с ASCII-кодами тех символов, которые "нарисованы на кнопках".

Более того, для каждой кнопки контроллер выдает по крайней мере два разных кода - один, когда вы нажимаете кнопку, другой - когда отпускаете ее. Эти коды всегда отличаются на величину 128 (старший бит в байте кода), хотя в данном случае это не так уж и важно. Кроме этого, при нажимании некоторых кнопок (и отпускании) контроллер генерирует скан-коды состоящие из двух байт - "префикса" (обычно это E0) и собственно кода кнопки. Обычно такие скан-коды называют "расширенными".

Основная задача syscons - преобразовать эти скан-коды в соответствующие коды символов. Причем, он делает это в два этапа.

Сначала "сырые" скан-коды (которые считываются из контроллера) преобразуются во внутренние коды syscons. В основном это касается "расширенных" кодов. Для обычных клавиш в качестве внутреннего кода берется просто скан-код, а вот "расширенные" коды заменяются на однобайтные коды (естественно, те, которые не заняты обычными клавишами). Кстати, в документации они обычно тоже называются скан-кодами, но учтите, что это "немного не те" скан-коды.

На втором этапе уже внутренние коды по специальной таблице "раскладки клавиатуры" (keyboard map) преобразуются в обычные ASCII коды символов. Надо заметить, что при этом используется только скан-код "нажатия клавиши".

Наконец, для некоторых клавиш существует еще и третий этап. На этом этапе коды, уже преобразованные через таблицу раскладки, превращаются в последовательность из нескольких кодов (такие клавиши называются "функциональными", но об этом чуть позже).
То есть, при нажатии таких клавиш, получаются опять как бы "расширенные" коды. Естественно, это уже не те "расширенные" скан-коды, которые выдает контроллер клавиатуры (да и клавиши другие).


Надо отметить, что первый этап (преобразование "сырых" скан-кодов во "внутренние") жестко "зашит" в программе syscons. То есть, изменить соответствие между каким-нибудь "расширенным" скан-кодом и внутренним кодом, в который его превратит syscons, нельзя.

А вот преобразованием в ASCII-коды, напротив, можно управлять. Таблица раскладки клавиатуры может быть загружена в syscons с помощью соответствующей утилиты (kbdcontrol). Естественно, если вы не будете загружать никакую таблицу, это не значит, что syscons не сможет перевести скан-коды в символы ASCII. В нем есть "встроенная" таблица раскладки "по умолчанию". Но, как я уже сказал, в любой момент можно поменять все соответствия кодов.

Также можно менять и последовательности, которые "навешиваются" на "функциональные" клавиши на третьем этапе.

Прежде чем перейти к более подробному рассмотрению "раскладки клавиатуры", надо отметить, что syscons можно переключить в режим, когда он будет отдавать в систему просто "сырые" скан-коды (RAW) или в режим выдачи "внутренних" скан-кодов (CODE). (В "нормальном" режиме выдаются "транслированные" (XLATE) коды.)

Если вам захочется посмотреть скан-коды вашей клавиатуры, можете воспользоваться моими программками ("Приложение 4. Несколько мелких полезных программок.), которые используют эти режимы. Только хочу еще раз подчеркнуть, что наиболее интересными являются не "сырые" (RAW) скан-коды, а "внутренние" коды syscons (CODE), поскольку в таблице раскладки клавиатуры указываются именно они (причем, только "код нажатия").

Итак, что собой представляет таблица раскладки клавиатуры (keyboard map)?
  Во-первых, напомню, что есть несколько вспомогательных клавиш - "модификаторов" (Shift, Ctrl и Alt), которые меняют код выдаваемый другими клавишами.
  Поэтому, каждая строчка в "таблице раскладки" состоит из скан-кода клавиши ("внутреннего", не "сырого") и нескольких значений для этой клавиши. (В зависимости от комбинации "модификаторов" syscons выберет одно из них.)

Все возможные значения для клавиш можно разделить на несколько групп


  • модификаторы - клавиши, которые изменяют значения для других клавиш
  • обычные "знаковые" клавиши
  • "функциональные" клавиши
  • переключатели виртуальных терминалов
  • специальные клавиши (рестарт компьютера, переход в отладчик и т.п.)



Содержание раздела