ファームウェアのビルドと書き込み
ベースはQMKファームウェアです。QMK自体の使い方については公式ドキュメントを参照してください。最新のQMKと乖離している場合があるため、Quantizer用リポジトリのdoc/
フォルダ以下も参照することをおすすめします。
環境構築
QMKの導入手順にしたがって必要ソフトをインストールしてください。 Pro Microを使う場合とは異なり、arm-none-eabi-gcc
とその関連ソフトも必須です。
- BLE Micro Pro用のQMK Firmwareを
qmk_firmware_bmp_vial
という名前でclonegit clone --depth 1 -b dev/ble-micro-pro https://github.com/sekigon-gonnoc/vial-qmk.git qmk_firmware_bmp_vial
- ビルドに必要なツールをインストール
cd qmk_firmware_bmp ./util/qmk_install.sh
- uf2ブートローダを使わない場合、nrfutil もインストール(要Python3.6–3.8)
pip install nrfutil --user
編集する
ファームウェアを編集する場合、keyboards/sekigon/quantizer/kqb/
以下を編集してください
ビルドする
uf2ファイルを生成する
事前にUF2ブートローダを書き込んでいないとこの方法は使えません
uf2ブートローダが起動するとQuantizerがマスストレージとして認識されます。uf2ファイルをこのドライブにコピーすることでファームウェアを更新できます。
以下のコマンドでuf2ファイルが生成されます。
make sekigon/keyboard_quantizer/kqb:default:uf2
CLIからdfuコマンドでブートローダを起動し、KQB_BOOT
という名前のドライブが表示されたらuf2ファイルをコピーしてください。
nrfutilで書き込む
以下のコマンドでnrfutil用のzipファイルを生成し、書き込み待機状態になったらQuantizerをPCに接続してください。
make <keyboard>:<keymap>:nrfutil
自分でレポートパーサを実装する
サンプル
- Thinkpad trackpoint keyboard専用のパーサを実装したサンプル
編集するファイルと関数
- 自分で用意したパーサを使用するにはkeymap.cへの関数の実装が必要です
keymap.c
void report_descriptor_parser_user(uint8_t interface, uint8_t const* desc, uint16_t len)
- 受信したレポートディスクリプタを解析する
- サンプルでは特定のキーボードの種類を想定しているのでレポートディスクリプタは解析不要のため、空の関数
void on_disconnect_device_user(uint8_t device)
- Quantizerからデバイスを抜いたときに実行する関数
- サンプルではキーが押しっぱなしにならないように受信したデータをクリアしている
bool report_parser_user(uint8_t const* buf, uint16_t len, matrix_row_t* current_matrix)
- 受信したレポートを解析しキーマトリクスを更新する。戻り値はマトリクスの更新の有無
- サンプルではVID:PIDがトラックポイントキーボードと一致した場合は専用の関数を、それ以外では6KROキーボード用の関数を呼び出している
レポートの形式を調べる
CLIのデバッグ機能を使ってどんなレポートが送られてくるか調べられます。CLIからQuantizerに接続したらdebug on
を送信し、Quantizerに接続したキーボードやマウスを動かしてください。ホストICがデバイスを認識できていれば下記のようなメッセージが表示されます。
- キーを押したりマウスを操作したときのレポートを確認
- 先頭10バイトはホストICが付加したヘッダ
- サンプルの場合以下の三種類
# Aキーを押したとき Receive: device:0, ep:1 08 00 04 06 00 01 EF 17 47 60 00 00 04 00 00 00 00 00 #<------ header ----->|<-------report--------> # カーソルを動かしたとき Receive: device:1, ep:2 06 00 04 02 01 02 EF 17 47 60 01 00 00 02 00 00 #<------ header ----->|<----report-----> # 横スクロールしたとき Receive: device:1, ep:2 03 00 04 02 01 02 EF 17 47 60 16 FF 00 #<------ header ----->|<report>
- device0はキーボード
- device1のID0はマウス(横スクロールは除く、xyは8bit)、ID0x16は横スクロール