Нынешнее увлечение: клавиатуры

Posted on Sat 09 October 2021 in клавиатуры

Итак, уже пару лет служившая верой и правдой Hexgears GK705 начала подавать признаки того, что ей несколько нехорошо: уже давно помер один светодиод под плюсом на нампаде, и внезапно одновременно померли еще два.

Посмотрел я на нее внимательно и решил поисследовать вопрос о прошивках для клавиатур, о которых когда-то давно читал.

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

Тогда пошел я в локальный магазин клавиатур выбирать такую, чтобы можно было поставить QMK. Присмотрел себе Durgod Taurus K310 Nebula RGB: QMK для K310 есть, вроде должно было подойти. Но кто же знал, что в клавиатуре, отличающейся лишь наличием подсветки, будет совершенно другой микроконтроллер: LPC11U35/401 (да, я это уже выучил наизусть) вместо чипа серии STM32, под которые преимущественно и заточена QMK.

Даташит на чип показал, что замыканием одного пина на землю при включении можно перевести его в режим прошивки, когда он изображает из себя FAT32-носитель на 64 килобайта с файлом firmware.bin, который можно просто скопировать для изучения или перезаписать другим. Для того, чтобы не держать клавиатуру открытой, припаял кнопку на проводки из витой пары и вынес ее наружу корпуса. Для этого был куплен нормальный паяльник, я стал чуть менее уверен в кривости собственных рук.

Пара вечеров была потрачена на изучение прошивки в IDA Pro, с которой я уже имел дело несколько раз, что ничего полезного не принесло, но что ж: that's reverse engineering for you.

Далее попытался писать свой код для чипа: вооружился мультиметром, нашел, на какой пин подключен один из светодиодов статуса, с горем пополам написал прошивку, мигающую им, при помощи ChibiOS. В ChibiOS (еще и в Contrib-репозитории) поддержка этого чипа очень старая и рудиментарная, поэтому я обратился к Mbed, которая во второй версии (текущая -- шестая) его поддерживала официально. Подумывал еще портировать QMK, но из-за абсолютного непонимания структуры проекта от этой идеи быстро отказался. Используя фреймворк PlatformIO получилось собрать рабочую прошивку для микроконтроллера с Mbed, и писать с ним код довольно легко. И поддерживаются, в общем-то, все (нужные) фичи чипа: и USB, и I2C.

Снова вооружился мультиметром и Google Sheets и начал реверсить матрицу клавиш. Она оказалась довольно неочевидна, и, как оказалась, совпадала с матрицей обычной K310 без подсветки, за исключением отличающейся маркировки пинов контроллера. Была написана прошивка, по USB Serial передающая нажатые клавиши.

Еще в клавиатуре стоят четыре LED-драйвера IS31FL3731 на шине I2C. Драйвер для Arduino, портированный на Mbed, заработал сразу, но 8 килобайт оперативной памяти -- это очень мало, поэтому пришлось его переписать на одновременную поддержку всех четырех драйверов одним инстансом. У светодиодов тоже оказалась занятная матрица.

И тогда началась эпопея с изучением протокола и дескриптов USB HID, и в особенности того, как заставить работать NKRO. В процессе была допущена пара досадных опечаток в дескрипторах, из-за чего клавиатура работала в BIOS и в линуксе, но не в Windows. Отыскать их получилось только используя официальный инструмент от авторов стандарта USB: USB30CV. Запускать пришлось в виртуалке, потому что во время своей работы эта софтина заменяет USB-драйвер, делая все устройства, подключенные к хабу, недоступными, включая мои другую клавиатуру и мышь. А виртуальный хаб VirtualBox'а не жалко, с эмуляцией устройств ввода по PS/2-то.

И вот, клавиатура в текущем состоянии: все клавиши работают, NKRO есть, медиаклавиши с Fn работают, при зажатии Fn красиво остаются подсвеченными только те клавиши, которые имеет смысл нажимать. В планах еще как минимум добавить ручное управление подсветкой по USB и хоткеями, пока просто на максимальной яркости светят белым.

Но руки опять чешутся. Вдруг в голову ударяет идея собрать собственными руками клавиатуру с нуля. Но об этом в другом посте.

a