Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ

RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ

[Fukuoka.rb #397 〜RubyKaigi 2025の機運〜](https://fukuokarb.connpass.com/event/345164/) のLTで発表した内容です。

- HHKB Studio
- https://happyhackingkb.com/jp/products/studio/

- Fusuma
- https://github.com/iberianpig/fusuma
- fusuma-plugin-thumbsense
- https://github.com/iberianpig/fusuma-plugin-thumbsense

iberianpig

March 21, 2025
Tweet

More Decks by iberianpig

Other Decks in Programming

Transcript

  1. HHKB Studioを手に馴染ませたい • HHKB Studioの親指クリックがしっくりこなかった • タッチパッド + ThumbSenseに慣れすぎていた •

    手癖で F でクリックしようとして誤爆 スペースキーの下にある正規クリックボタンはやたらといい位置にあるので ALTキー と SHIFT キーになりました
  2. HIDRaw • 生のHIDイベントをユーザー空間で扱える ◦ デバイスから産地直送イベント • 汎用のデバイスドライバでカバーされないもの ◦ 高機能なジョイスティックやマイナーなデバイスなど •

    アプリケーション側でHIDを喋る必要がある Steamで高機能コントローラ使ったり、汎用ドライバ未対応の加速度センサー扱ったり
  3. イベントの流れ • 汎用デバイスドライバ経由 ◦ カーネル側でデコード ◦ evdev I/F ▪ /dev/input/eventX

    ◦ Libinput ▪ Wayland Compositor ▪ Fusuma ◦ Application ▪ Terminal, Browser… • HIDRaw経由 ◦ HIDRaw I/F ▪ /dev/hidrawX ◦ Application側に実装 ▪ HID Reportのデコード ▪ Evdev相当のイベント
  4. HIDRawを読む 一般ユーザーは /dev/hidrawX や /dev/input/eventX へのアクセス権がないので、udev rule が必要です デバイスパスの取得(/dev/input/eventX ->

    /dev/hidrawX) レポートディスクリプタを取得(HIDIOCGRDESC) report_id, 構造体定義に沿ってHIDレポートをデコード 2 3 1
  5. HIDRawを読む レポートディスクリプタを元にデコード Report Descriptor ↑Report Descriptorをデバイスから取得 HID Report • Report

    Descriptorでバイト列の区切りが決まる ◦ HID Usage Tables に仕様が記載 https://usb.org/sites/default/files/hut1_6.pdf • この場合は8ボタン同時押しを検知できることがわかる hidapiバインディングをいくつか試したけど動かなかったのでPure Rubyで書きました BluetoothはUSB接続時と違ってデバイスが統合されるのでレポート構造が違ってハマりました