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

qhe1ddawixyagpvjsfax15tod7a.jpeg


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

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

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

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


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

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

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

buvefgfgibpbscmut5inev9bymy.jpeg
Наклейка модели

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

n9lqh32c69pjnuhjwshh-pxcu0e.jpeg
Вид снизу

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

dpzur_mvexrqyvnhbnfmo3dvswe.jpeg

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

yk8ycagwjbjdvchpoendo4x5ovi.jpeg

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

uajtoc-r7nn90aoabetkpdhleyg.jpeg
Металлические клипсы

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

u5-nuyyd1hmhap3dknel1p8h_ae.jpeg
Резинка для прижима контактов

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

ebujhky3_ivn2tdm7fkjoetxyci.jpeg

78fteshgaxcqlgt43jkvcecpud0.jpeg
Контроллер

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

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

j3xejtk_69sark0u-ibrw3g1jzw.jpeg
Тестирование перед закрытием

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

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


hxn6lq2t0ejr7eoo5e04cpnpesk.jpeg

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

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

m48fw-pfdttsr5evx70smnw4i8o.jpeg

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


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

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

v1awtljrh0q9ejv3nm0cyxcuiyk.png

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

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

u7dzp5fxqelml3s49re1s21gnne.jpeg
На самом деле 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).

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


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

wek9r8cqm9bnzvecjx9y_bj8hzq.gif

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

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

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

showkey -scancodes


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

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

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


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


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

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

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


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

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

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

zvrexdfopbny0ivk8m9cy08hbi8.jpeg

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

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


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

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

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

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


Явно найти документацию на клавиатуру модели 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


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

Выводы


dif7igymclv6iz1lowad_e-2qoq.jpeg
Сравнение 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. Если вам интересно моё творчество, вы можете следить за мной ещё в телеграмме.

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru