Здравствуйте, коллеги, в наших рядах пополнение. Встречайте, - Котюбас:

Он же Whisk3r, он же DIY корпус для YubiKey с удалённым управлением, подсветкой и прочими приколюхами. Если в двух словах, то ниже вас ждет реализация схемы:

Nuphy Halo75 V2 (QMK)
  ↓ HID команда
BLE (nRF52832)
  ↓
ESP32
  ↓
YubiKey

Пристегивайтесь, остановки будут ;)

В начале была клавиатура

Начинается эта история с покупки новой клавиатуры, в моём случае - NuPhy Halo75 V2 на Silent Red свичах. Вот такая красотка:

Но сегодня не обзор клавиатуры, поэтому для этой истории важны только два факта:

  • основана она на опенсорсной прошивке QMK
  • имеет поддержку Bluetooth и 2.4 GHz донгла

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

Железячно же это STM32F072, к которому подключён nRF52832 по UART для поддержки Bluetooth и 2.4 GHz донгла. Дабы минимизировать патч, я решил обойтись только правками QMK прошивки для STM32F072. Во-первых, потому что это самый простой путь :) Во-вторых, без её модификации всё равно никак. Ну а в-третьих, прошивки для nRF52832 в OSS нет :( Последнее, конечно, решабельно, но я жесть как ленив.

До апстрима NuPhy свои клавиатуры не дотащили, а потому пришлось форкнуть их форк QMK и поверх написать небольшой патч с поддержкой BLE CMD. Логика у него прямая аки палка:

  • добавились настройки, где можно выбрать один из трёх слотов
  • 32 новых кейкода, мне нужно всего 2, остальное про запас
  • если BLE CMD включён, то:
    • держим Bluetooth включённым при работе клавиатуры по USB
    • при использовании одного из новых кейкодов - отправляем его как consumer-control usage

Собсно и всё, ничего хитрого. А главное, что:

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

Причём при переключении режима работы самой клавиатуры USB -> Radio - BLE CMD отключается и не мешает работе самой клавиатуры. Т.е. вообще ничего не сломано - только улучшено ;)

Я вам такое не писал, но таким же образом можно написать и стиллер.

Коллеги (!), пожалуйста, не шутите с моей клавиатурой в офисе, вы не хотите видеть, что я на ней пишу (поверьте).

Собираем и грузим VIA прошивку, подключив клавиатуру с зажатой клавишей Esc:

% qmk flash -kb nuphy/halo75_v2/ansi -km via
Ψ Compiling keymap with make -r -R -f builddefs/build_keyboard.mk -s flash KEYBOARD=nuphy/halo75_v2/ansi KEYMAP=via KEYBOARD_FILESAFE=nuphy_halo75_v2_ansi TARGET=nuphy_halo75_v2_ansi_via INTERMEDIATE_OUTPUT=.build/obj_nuphy_halo75_v2_ansi_via VERBOSE=false COLOR=true SILENT=false QMK_BIN="qmk"
[...]
Size after:
   text    data     bss     dec     hex filename
      0   69542       0   69542   10fa6 nuphy_halo75_v2_ansi_via.bin

Copying nuphy_halo75_v2_ansi_via.bin to qmk_firmware folder                                         [OK]
[...]

Opening DFU capable USB device...
Device ID 0483:df11
Device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Interface #0 ...
Determining device status...
DFU state(10) = dfuERROR, status(10) = Device's firmware is corrupt. It cannot return to run-time (non-DFU) operations
Clearing status
Determining device status...
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading element to address = 0x08000000, size = 69544
Erase           [=========================] 100%        69544 bytes
Erase    done.
Download        [=========================] 100%        69544 bytes
Download done.
File downloaded successfully
Submitting leave request...
Transitioning to dfuMANIFEST state

Готово! Хозяйке на заметку: если окирпичите STM32, то под клавишей CapsLock есть кнопка BOOT:

Осталось включить BLE CMD в VIA:

Назначить BLE_CMD0 на Fn+Enter:

Котюбас: дела железные

Идея Котюбасеньки проще некуда:

  • прячем внутрь YubiKey, какой-то B{T,LE} MCU и RGB-ленту
  • детектим, когда YubiKey моргает своим диодом, и повторяем за ним RGB-лентой
  • по команде “тискаем” YubiKey

Если говорить детальнее, то BOM Котюбаса выглядит так:

TEMT6000, будучи датчиком освещенности, улавливает LED-индикатор YubiKey, ESP32C3 считывает этот аналоговый сигнал и “выводит” на RGB-ленту. Параллельно ESP32C3 подключается к клавиатуре и ждёт от неё команду “потискать” YubiKey: открывает транзистор, и YubiKey через медную ленту распознаёт прикосновение (см. H4ptiX или Twibby).

Кстати, вот Котюбасик без шёрстки:

Для YubiKey Котюбас вообще не существует, из общего у них только линия питания:

Котюбас: сборка

Но чтобы собрать что-нибудь ненужное, сначала нужно распечатать что-нибудь ненужное, а у нас модели нет - исправляем ;) Состоит она, как ни странно, из двух частей.

Верхней (фиолетовым отмечены диффузоры для RGB, один “пиксель” - 3.6x3.6мм):

И нижней:

Около 6 шасов печати спустя можно всё запаять и примерить:

Установить на свои места:

Соединить две половинки:

Самое время прошить его github.com/buglloc/whisk3r и включить режим спаривания:

% tio /dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_58:8C:81:B1:8B:D4-if00 
[23:05:58.865] tio 62083fd
[23:05:58.865] Press ctrl-t q to quit
[23:05:58.865] Connected to /dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_58:8C:81:B1:8B:D4-if00
usage:
  whisk3r status
  whisk3r set-name <device name>
  whisk3r pairing <on|off>
whisk3r pairing on
W (53611) whisk3r::pairing: Pairing mode enabled
pairing mode enabled

Переключить клавиатуру в режим BT, включить спаривание в первом слоте (как выбрали ранее) и увидеть в логе ESP32 подключение:

I (67351) whisk3r::ble: Scanning for BLE HID device "NuPhy Halo75 V2-1" for 5 second(s)
BLE: 2c:19:5c:a4:8c:63, RSSI: -93, UUID: 0x0000, APPEARANCE: 0x0000, ADDR_TYPE: 'PUBLIC'
BLE: c7:22:ce:f3:d8:d6, RSSI: -52, UUID: 0x1812, APPEARANCE: 0x03c1, ADDR_TYPE: 'RANDOM', NAME: 'NuPhy Halo75 V2-1'
I (72351) whisk3r::ble: Scan result: transport=BLE addr=c7:22:ce:f3:d8:d6 rssi=-52 usage=GENERIC appearance=0x03C1 name=NuPhy Halo75 V2-1
I (72521) ESP_HID_GAP: BLE GAP SEC_REQ
I (72531) whisk3r::app: BLE security decision: action=sec_req peer=c7:22:ce:f3:d8:d6 passkey=0 allowed=yes
I (73031) ESP_HID_GAP: BLE GAP KEY type = ESP_LE_KEY_PENC
I (73031) ESP_HID_GAP: BLE GAP KEY type = ESP_LE_KEY_LENC
I (73031) ESP_HID_GAP: BLE GAP KEY type = ESP_LE_KEY_LID
I (73091) ESP_HID_GAP: BLE GAP AUTH SUCCESS
I (75011) whisk3r::ble: Connection requested for NuPhy Halo75 V2-1 (c7:22:ce:f3:d8:d6)
I (75021) whisk3r::pairing: Trusted device saved: name=NuPhy Halo75 V2-1 addr=c7:22:ce:f3:d8:d6 type=1
I (75021) whisk3r::ble: Connected to NuPhy Halo75 V2-1
I (75021) whisk3r::ble: Device summary: name=NuPhy Halo75 V2-1 addr=c7:22:ce:f3:d8:d6 vid=0x19F5 pid=0x3246 usage=GENERIC

И…узреть котюбаса живьем:

Паббааааам! На видео видно, что сейчас RGB-лента полностью повторяет LED YubiKey, это и хорошо, и плохо. Хорошо, потому что просто и честно. Плохо, потому что юбик моргает им и при передаче данных, и при запросе пальца - меняется только паттерн. Возможно, переделаю позже, время покажет :)

А на сегодня у меня всё. Всем (づ˶•༝•˶)づ♡