Как стать автором
Обновить
1874.55
Рейтинг
Timeweb Cloud
Облачная платформа для разработчиков и бизнеса

Реверс-инжиниринг нестандартной ps/2 клавиатуры

Блог компании Timeweb Cloud Интерфейсы *Реверс-инжиниринг *Старое железо Периферия
Туториал

Терминал VT520 c клавиатурой LK46W-A2

После моего предыдущего поста с подключением советской клавиатуры к современному ПК, я как-то заразился оригинальными клавиатурами от DEC, и уж больно хотелось их испытать в деле. И на удивление, на досках удалось найти даже клавиатуру LK201, однако для меня показалась не очень уж интересной. А вот клавиатуру Wyse 85 со свичами Cherry MX нашёл намного более стильной и крутой. Однако смущал вопрос, как же её использовать с современным железом, удобно ли будет такое расположение клавиш?

И тут мне на глаза попадается объявление с ещё одной терминальной клавиатурой LK46W-A2 которую можно подключить к обычному компьютеру по стандартному интерфейсу PS/2, но с количеством клавиш и расположением, как у LK201 с небольшими дополнениями. После того как ознакомился с информацией, принял волевое решение купить кота в мешке и попробовать эту клавиатуру с обычным ПК, а также понять, что же делают все остальные «нестандартные клавиши». Этакий реверс-инжиниринг клавиатуры.

Распаковка и отмывка


Итак, спустя пару недель мне пришла посылка с этой удивительной клавиатурой. Терминал найти невозможно, а вот клавиатуру – пожалуйста.


Клавиатура LK46W-A2 собственной персоной

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


Наклейка модели

С большим трудом удалось установить, что использовалась с моделями терминалов DEC VT520 (см КДПВ). Терминал не найти, а клаву – вот, пожалуйста.


Вид снизу

Предварительное включение показало, что клавиатура рабочая, но требует водных процедур. Поэтому принял решение её разобрать. Само устройство разбирается не так просто: требуется отогнуть большое количество пластиковых защёлок, благо на корпусе изделия есть специальные технологические отверстия для отвёртки. После нескольких пассов две половинки клавиатуры разделились.



Внутри стандартная плёночная клавиатура, с резиновыми «давилками».



Что приятно удивило, что все длинные клавиши имеют металлические поддерживающие клипсы от перекоса. И все места трения смазаны густой смазкой.


Металлические клипсы

Плёнка клавиатуры прижимается к контроллеру специальной резинкой, вмонтированною в корпус клавиатуры.


Резинка для прижима контактов

Контроллер – обычная капля, 4 стандартных контакта для ps/2: Data, Clock, +5, GND.




Контроллер

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

Когда омовение прошло, прежде чем окончательно закрыть клавиатуру в корпусе, сделал тестирование работоспособности всех клавиш на резинке.


Тестирование перед закрытием

Не забываю смазать все движущие части, и окончательно собираю клавиатуру.

Поиск потерянных клавиш




Если взглянуть на фотографию, и сравнить две клавиатуры, то можно заметить, что, во-первых, клавиш намного больше, а во-вторых, непонятно что эти клавиши делают. Сравните, для примера, расположение клавиш вокруг кнопки «Z».

В чём прикол?
На самом деле вас немного разыгрываю, нижняя клавиатура имеет сербскую латинскую раскладку, у которой «Y» и «Z» поменяны местами:



Если тут есть сербы, объясните мне, что за спецсимволы нанесены на клавиши и где они используются?

Главный вопрос, который меня волнует: как понять какая клавиша за что отвечает?

Изначально пытался найти хоть какую-то внятную документацию по теме, но в результате пришлось действовать методом научного тыка. Для этого пошёл на сайт en.key-test.ru и начал нажимать все клавиши, перебирая их последовательно. В результате получилась такая картинка:



Вы видите нажатую левую кнопку мыши? Это тоже реакция на нажатие одной кнопки, и, как можно заметить, практически все клавиши присутствуют на этой клавиатуре. PrtScr у меня под линуксом просто вызывало создание скриншота и не перехватывалось этим сайтом, то есть и она тоже работает.

Для своего удобства на клавиатуре расположил бумажки, с подписями, где и чего находится. Вопросами обозначены те клавиши, на которые реакции никакой не было.


На самом деле Right Ctrl

Итак, что же тут интересного:

  1. Клавиши F13, F14, Help, Do, F17, левый Compose Character – не определены. Назначение и функциональность пока неясны.
  2. Клавиша ESC расположена, где находится тильда "~" на обычной клавиатуре, а тильда рядом с клавишей «Z».
  3. Функциональные клавиши типа Home, End, PageUp, PageDown, Isert и т.д. находятся в других местах, но достаточно логично. Не стал их подписывать, потому что и так можно догадаться (например, Re-move = Del, Prev = PageUp). Часть функциональных клавиш расположена на клавишах F18-F20.
  4. Цифровой блок достаточно стандартен, кроме одной клавиши – это клавиша «минуса», она даёт странный код: "±". Да, символ «плюс-минус», который можно набрать прямо с клавиатуры, с одной клавиши (Linux Mint).


Пробуем получить скан-код клавиши


Согласно стандарту, клавиатура при нажатии передаёт скан-код нажатия клавиши и скан-код «отжатия» клавиши.




Примеры скан-кодов стандартной клавиатуры

Как можно заметить, что добавление новых клавиш клавиатуры осуществляется с помощью код расширения 0xE0, и, можно предположить, что необычные клавиши этого устройства тоже будут идти через дополнительный код.

Для начала попробовал получить скан-коды неизвестных клавиш через утилиту showkey. Для этого нужно полноправно завладеть устройством ввода, без иксов. Поэтому переключаюсь на консоль комбинацией клавиш ctrl-alt-F1 и ввожу:

showkey -scancodes

И начинаю радостно жать на неизвестные клавиши, но удивительно: ничего не происходит! Те клавиши, которые мне удалось перехватить, дают корректный скан-код, а вот «тайные» — «молчат». То есть либо эти клавиши вообще не работают, либо фильтруются на уровне драйвера ядра.

Думаю, что же мне проще: подключить логический анализатор, либо найти другой способ получения скан-кодов нажатых клавиш? И тут я вспомнил, что у меня есть тестовая машина с DOS.

Получаю скан-коды под ДОС


Синей пеленой экран заполнил чистый DOS
Мышь…
Стала вдруг квадратной, потеряла форму мышь…
Я разбил окно,
девяностопятое мастдайное окно,
И поставил DOS, и тогда увидел:
Это счастье, — вот оно.

Итак, для того чтобы получать скан-коды клавиш, нужно иметь какую-то программу, которая бы читала их из BIOS. Контроллер клавиатуры позволяет читать коды набранных клавиш из порта 0x60, осталось только это всё аккуратно написать. Для того чтобы понять, о чём я говорю, вы можете посмотреть пример на ассемблере.

Поскольку я человек ленивый, знаю, что всё давно придумано за нас, решил погуглить. У меня как раз в системе есть qbasic, значит, можно сходу найти пример приложения для него. И беглым гуглением, после нескольких тестов нашёл приложение, которое наиболее полно меня устраивает.
Не буду описывать весь код, главное, что оно читает скан-коды из порта, и в удобоваримом для меня виде выводит на экран. Вот, пример чтения кода из порта.

'recieve key (keyboard port)
k% = INP(&H60)

После того как протестировал в Dosbox, пришла пора проверить на реальном железе.


Тестовая машина с ДОС

Для своего удобства делал фотографии с именованием «неизвестной» клавиши и её кодом. Так получилось, что после запуска приложения, из буфера читается «мусорный код». Его я прикрывал бумажкой, важно, что ниже. Вот, например, нажатие левой клавиши «Compose Character».



Как я и предполагал, все они идут через код расширения 0xE0. То есть, код клавиши получается: 0xE00F. Вторая пара байт 0xE08F – это код отпускания этой клавиши (на это действие тоже есть отдельный код).

Ну и по аналогии, остальные клавиши.

Фотографии скан-кодов остальных неизвестных клавиш








Из забавного, что в ДОС даже есть какая-то скромная попытка обрабатывать нажатия на клавиши, например, реагирует на них, запуская копирование (хотя это ошибка).


Ложное срабатывание

В общем, ДОС хоть и стар, но оказывается местами даже очень полезен.

А что там с документацией?


Явно найти документацию на клавиатуру модели LK46W-A2 мне не удалось. Но, когда я искал документацию на стандарт ps/2, то наткнулся на сайт Keyboard scancodes, в котором есть раздел, посвящённый клавиатурам LK411 и LK450. Нашёл это уже после прохождения всех моих мытарств, но они лишь подтвердили результаты моих экспериментов:

These keyboards have seven additional keys, with escaped scancodes e0 0f (LeftCompose), e0 3d (F13), e0 3e (F14), e0 3f (Help), e0 40 (Do), e0 41 (F17), e0 4e (Keypad-minplus). (LK411 has all seven. LK450 has the last six — the report did not mention a Compose key.) There are only two LEDs. The keycaps are unusual.

In (translated) scancode Set 3 these keys give codes 68, 44, 42, 40, 3e, 65, 70. In untranslated Set 2, the F17 key gives e0 83.

An LK411 keyboard, with left and right hand side enlarged.

The keys labeled F18, F19, F20 produce the codes expected for PrtSc, ScrollLock, Pause. The keys labelled PF1, PF2, PF3, PF4 produce the codes expected for NumLock, Keypad-/, Keypad-*, Keypad--. The Keypad-, key produces the code 4e expected for Keypad-+. The Right ComposeCharacter key produces the code expected for RCtrl. The key labelled </> produces the code 29 expected for `/~. The key labelled with `/~/(Esc) produces the code expected for Esc.
image

То есть, фактически мне это удалось подтвердить эмпирическим путём, хотя у меня немного другая модель клавиатуры.

Выводы



Сравнение Wise 85 и LK46W-A2

Наверное, буду лукавить, если скажу, что текст набран именно на этой клавиатуре. Клавиши мне показались очень тугими. Но попробовал работать с ней, и достаточно быстро привык к такому вот нестандартному расположению клавиш, даже нахожу их весьма удобным и комфортным. Особенно стрелочная часть. Даже не испытывал проблем с набором текста и запуском программ. Поначалу ищешь ESC не там, где он есть. А вот расположение тильды я нахожу очень удобным.

Единственный вопрос, который остался за кадром: почему Linux фильтровал нажатия этих клавиш? Возможно ли поправить dts-файл так, чтобы ядро корректно отрабатывало нажатия этих клавиш? Добавить ими дополнительную, необходимую для комфортной работы функциональность? В общем, вопросов пока больше, чем ответов. Если опытные драйверисты есть, буду рад обсудить этот момент.

Из личного опыта такое расположение нахожу весьма удобным, и резюмируя, могу сказать что клоны клавиатур lk201, в том числе советский клон может быть использован для набора текста. Разве что потребуется программирование некоторых клавиш под свои нужды, и придётся отказаться от правого Alt и Ctrl.

Полезные ссылки:


  1. Keyboard tester online
  2. Keyboard scancodes (основная документация)
  3. The Scan Code values generated by the PC Keyboard
  4. Пример кода чтения скан-кодов клавиатуры, на бейсике.
  5. DEC KEYBOARDS


P.S. Если вам интересно моё творчество, вы можете следить за мной ещё в телеграмме.

Теги:
Хабы:
Всего голосов 92: ↑91 и ↓1 +90
Просмотры 7K
Комментарии 29
Комментарии Комментарии 29

Публикации

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия