Ошибка в клавиатуре: один байт перевернул всё

Наконец-то до меня доехала долгожданная электроёмкостная (EC) плата для клавиатуры Agar Mini. Собрал устройство, начал печатать — и сразу столкнулся с обилием опечаток. Сначала надеялся, что удастся исправить всё простыми настройками, но не тут-то было: попытка решения растянулась на семь часов квеста.

В этой статье я расскажу, что представляют собой EC-переключатели, как диагностировать подобные сбои и пропатчить прошивку, не обойдясь без полноценного реверс-инжиниринга.

Спойлер: все опечатки имели глубокую техническую причину.

Диагностика неисправности

Дело было вечером. Выяснилось неприятное: при быстром наборе текст «плыл», символы менялись местами, как в названии этой статьи.

Первым делом я попытался сбросить настройки через Vial. Перепробовал все доступные варианты Reset, но проблема осталась.

https://get.vial.today/
https://get.vial.today/

Затем я решил пойти радикальным путем — очистить энергонезависимую память (EEPROM), назначив клавише `QK_CLEAR_EEPROM`. Увы, это не принесло результата.

https://get.vial.today/
https://get.vial.today/

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

Удалось найти способ воспроизведения ошибки: при очень быстром вводе слова «лак» символы регистрировались в случайном порядке. С помощью Karabiner-EventViewer я отследил аномалию: клавиши регистрировались только в момент отпускания, а не нажатия. Причем, за исключением одной-единственной клавиши «w», вся матрица вела себя некорректно.

Почему Via здесь не помогла

EC Edition работает на базе QMK… с поддержкой инструментов конфигурации VIAL в реальном времени. — сайт производителя.

EC-клавиатуры (электроёмкостные) — это аналоговые устройства, фиксирующие изменение ёмкости поля. На значения ADC (аналого-цифрового преобразователя) влияют десятки факторов: от влажности воздуха до качества смазки на пружинах. Стало очевидно: рабочая клавиша «w» генерирует значения в «правильном» диапазоне, в то время как остальные — нет.

Я искал способ калибровки, но в стандартном ПО для этой модели такой функции не оказалось. Изучив исходники, я понял, что калибровка EC-сенсоров в Via завязана на специфические JSON-профили (V3), а моя клавиатура поддерживала лишь V2.

Исследование прошивки

В репозитории разработчика я нашел исходный код. Анализ файла ec_matrix.c подсказал логику: значения от ec_ap_value до 160 интерпретируются как нажатие. Похоже, моя плата «выплевывала» значения выше 160, из-за чего прошивка их игнорировала.

Для проверки я написал скрипт, общающийся с клавиатурой через Raw HID, чтобы «вытащить» реальные данные ADC. Дамп подтвердил догадку: проблемные клавиши выдавали значения в диапазоне 180–220, что выходило за рамки «понимания» прошивки.

Решение

Час ночи, желание писать сложные драйверы испарилось. Решил применить «хирургию»: пропатчить скомпилированную прошивку, заменив порог срабатывания со 160 на 220.

Распаковав файл прошивки (.uf2) в .bin и дизассемблировав его для архитектуры ARM Cortex-M3 (STM32F103), я нашел нужную инструкцию сравнения (`cmp r3, #0x9f`), где 0x9f — это шестнадцатеричное представление числа 159 (близкого к 160).

Используя dd, я заменил этот байт на 0xDC (220 в десятичной системе) прямо в бинарном файле.

printf '\xDC' | dd of=agar_cmp220.uf2 bs=1 seek=$((0x46c8)) count=1 conv=notrunc

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

https://get.vial.today/
https://get.vial.today/

Итог

Если столкнетесь с аналогичной «глючностью» Agar Mini, не спешите менять плату. Сначала добудьте данные ADC — это сэкономит вам массу времени. Ну а если хочется больше глубоких погружений в кастомизацию клавиатур, гаджетов и IT-карьеры, добро пожаловать в мой ТГ-канал.

 

Источник

Читайте также