LinuxでDocker(compose)を使ってQMKファームウェアのビルドと書き込み

QMKファームウェア書き込みは今まではQMK Toolboxを使ってたが、Linuxだと素朴にはQMK Toolboxは使えない認識で、かといってWindowsを起動するのもめんどくさい。
LinuxでQMKファームウェア書き込みをやる、また、環境を汚さないためにDockerを使う。

docker composeでqmk cliを使う

docker composeでqmk cliを使うことでQMKファームウェアの書き込みをやるようにした。
github: https://github.com/kefi550/qmk_firmware/blob/kefi/compose.yml

services:
  json2c:
    image: ghcr.io/qmk/qmk_cli
    working_dir: /qmk_firmware
    volumes:
      - .:/qmk_firmware
    environment:
      JSON_PATH: keymap_json/ergodash/rev1/keymaps/kefi550/keymap.json
      KEYBOARD: omkbd/ergodash/rev1
      KEYMAP: kefi550
    command: /bin/bash -c "qmk json2c $${JSON_PATH} > keyboards/$${KEYBOARD}/keymaps/$${KEYMAP}/keymap.c"

  compile:
    image: ghcr.io/qmk/qmk_cli
    working_dir: /qmk_firmware
    volumes:
      - .:/qmk_firmware
      - ./.build:/qmk_firmware/.build
    environment:
      KEYBOARD: omkbd/ergodash/rev1
      KEYMAP: kefi550
      SKIP_GIT: true
    command: /bin/bash -c "qmk compile -kb $${KEYBOARD} -km $${KEYMAP}"

  flash:
    image: ghcr.io/qmk/qmk_cli
    working_dir: /qmk_firmware
    privileged: true
    volumes:
      - .:/qmk_firmware
      - /dev:/dev:rw
    environment:
      KEYBOARD: omkbd/ergodash/rev1
      KEYMAP: kefi550
      SKIP_GIT: true
    command: /bin/bash -c "qmk flash -kb $${KEYBOARD} -km $${KEYMAP}"

  flash_from_json:
    image: ghcr.io/qmk/qmk_cli
    working_dir: /qmk_firmware
    privileged: true
    volumes:
      - .:/qmk_firmware
      - /dev:/dev:rw
    environment:
      JSON_PATH: ./keymap_json/ergodash/rev1/keymaps/kefi550/keymap.json
      SKIP_GIT: true
    command: /bin/bash -c "qmk flash $${JSON_PATH}"

基本的に json2c, compile, flashといったqmk cliのコマンド(自分が使うやつ)をそのまま書き下しただけのような感じ。
flash では、ProMicroをPCにつなげたときのデバイス(自分の環境だと /dev/ttyACM0)をコンテナから触れるようにするために /dev をマウントしてる。

とはいえほぼ、flash_from_json しか使わない。
qmk flash はqmk configurator等で作った、キーボード情報を含んだjsonを与えるだけでビルド、書き込みまでやってくれるらしい。
https://github.com/qmk/qmk_firmware/blob/fa98117a3e10afed347f16b2614e4e8a9e26cd32/lib/python/qmk/cli/flash.py#L73
flash_from_json ではそれを使うことで、jsonを使ってProMicroへの書き込みまでを行う。

主な使い方

qmk/qmk_firmwareをcloneしてdocker compose yamlを置く

git clone --recursive-submodules https://github.com/qmk/qmk_firmware.git
cd qmk_firmware
# qmk_firmware ディレクトリ下に↑のdocker composeのyamlを置く
curl https://github.com/kefi550/qmk_firmware/blob/kefi/compose.yml -o compose.yml

qmk configuratorでキーマップJSONを作る

https://config.qmk.fm/
いつもお世話になっております。

キーマップを編集してQMK keymap jsonファイルを上記qmk_firmwareディレクトリ下にダウンロードする。

compose.yml内のJSON_PATHを書き換える

      JSON_PATH: ./keymap.json

flash 実行

ProMicroをPCにケーブルで接続して以下を実行。

docker compose up flash_from_json

以下のようにProMicro等の接続を待ちはじめるので、この表示になったらProMicroをリセットする(リセットボタン等)。

flash_from_json-1  | Waiting for USB serial port - reset your controller now (Ctrl+C to cancel)..........