😺

QMK Firmwareでキーマップがズレるときの対処法

に公開

前提

QMKでファームウェアを作った→なぜかキーマップがおかしい!という時に何が発生している(可能性がある)のかを割り出す作業の一環

この事象はKeyboard Layout Editorでマトリクス値のx,yまで書いておき、そこからQMK KLE to JSON Conveterを利用したときに発生しやすい(KLEで自由に配置したマトリクス値が影響するため)

対策

keymap.c

keymap.cの配置は昔のQMKがキーマップ変更のたびにコンパイルを毎回行っていた都合で物理配列に合わせることが推奨されている
これが諸悪の根源である
が、実際物理配列に合わせた方が見やすいのでそのままにする

keyboard.json(info.json)

keymap.cの配置を左上から右方向に読んでいき、その順番に対応するようにlayoutのキーを入れ替えていく
GL516系の倍マトリクスだと次の画像のようになる

{"matrix":[0,0], "x":0, "y":0},
{"matrix":[0,1], "x":1, "y":0},
{"matrix":[0,2], "x":2, "y":0},
{"matrix":[4,1], "x":11.5, "y":0},
{"matrix":[4,2], "x":12.5, "y":0},
{"matrix":[1,0], "x":0, "y":1},
{"matrix":[1,1], "x":1, "y":1},
{"matrix":[1,2], "x":2, "y":1},
{"matrix":[5,0], "x":10.5, "y":1},
{"matrix":[5,1], "x":11.5, "y":1},
{"matrix":[5,2], "x":12.5, "y":1},

GL516は左右でマトリクスの向きを入れ替えているが、左のRowをすべてスキャンし終わってから右のRowをスキャンするために左上→左中→左下→右上→…………という順番でRowの数値が遷移する
なので、左上→右上→左中…………となるようにLayoutの順番を書き換えておく

要するに

keyboard.jsonの

"layouts": {
        "LAYOUT": {
            "layout": [
                        ...
]}}

の中身は上から順に読むが、keymap.cの

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT(
    _______, _______, _______, 
    ...
    _______, _______, _______
),

の中にあるキーコードは左上から右行の順で読んでいる
読み込みの順番を合わせてあげれば問題なく機能する

Discussion