キーマップ変更ツールをいい加減作りたい
概要
デバイス側
(QMKで言うところの)HID RawでPCと通信する
アプリのことを考えると他のほうが楽かも
usb cdcならめちゃくちゃ楽だけどCOMポート増えるの嫌問題
vendor classでlibusbするのも楽だけどQMKコアに手を入れたくない
出来ればeepromを用意したい。
atmega32u4のeepromは1kあるので余裕ある!
stm32の場合はeeprom載せても良いかも
エミュレーションでも十分かも
ない場合は何らかの方法でflashを一部書き換える。
stm32ならflash書き換えが簡単
atmegaでも出来るはず
アプリ側
もろもろが楽なのでWebアプリにしたい
キーボードにぶら下がったHID RAWが読めるのか?
実装されるまではとりあえずelectronで作る(node-hid)
API周りのチェックはpythonでやろうかな
webdfuはSTM32で動いたからhexがあればファームウェア更新できそう pre compiledなhexを書き換えてwebdfuで流し込む
TODO
プロトコルを決める
キーボードへの設定書き込みが伴うものにはCRC-8か16で誤り検出したい
既存のキーボードの対応をファームウェアだけでしたい
atmega32u4のeepromは1kあるので余裕ある!
問題
単一のキーだけを書き換えるときflash書き換えだとpage eraseなので効率が悪すぎる
stm32のeepromエミュレーションなら許容範囲
EEPROM載せたい
なくてよさそう
既存のキーボード…
OLED載ってるものならそこからi2c取れるので直接くっつくモジュール作れば良さそう
プロトコル案
認証は(一応ユニークであるはずの)VID/PIDと名前の取得で行う
command(1Byte), Data(nByte)をアプリから送って、キーボードからSize(11byte), Dataを返す
little endian
table:プロトコル
commnad(1byte) Data Return Name
0x01 なし 'k' 'b' 'd' "protocol version" PING
0x02 なし "keyboard name("helix/rev1")" GET_NAME
0x03 なし "X" "Y" GET_KEY_SIZE
0x04 なし "layer count" GET_LAYER_COUNT
0x05 layer X Y "keycode" GET_KEYCODE
0x06 layer X Y keycode 0 or 1 SET_KEYCODE
0x07 "keycode" GET_KEYCODES
0xF0 0 or 1 RESET_EEPROM
0xF1 Address length "data" DEBUG_DUMP_EEPROM
EEPROM データ構造
eeconfigの設定はMCU内蔵EEPROMから動かす気はないけど余裕を持ってオフセットしておきたい
0xF0~
サイズの都合で変更するかも
atmega32u4の都合でオフセット含め1024byteに収まるようにする
little endian
table:EEPROM
(0xF0から)
address size data
0x00 2 0xFEED magic number
0x02 2 "protocol version"
0x04 1 "layer count"
0x10 n "keymap"