背景
久しぶりに自作キーボード(ErgoDash mini)のキーマップをいじろうとしたらハマったため共有です。
ErgoDash miniに限らず、Pro Microを使用した自作キーボード(というよりはArduino互換ボードを使用したデバイス全般)をLinux環境で扱う際に発生しうる事象です。
事象としては、QMK Firmwareをクローン済のディレクトリにて、以下のコマンドでキーマップの書き込みを行おうとしたところ、
$ sudo make ergodash/mini:[キーマップのディレクトリ]:avrdude
以下のようなエラーが発生し書き込みに失敗しました。
avrdude: Error: butterfly programmer uses avr_write_page() but does not
provide a cmd() method.
発生時の環境情報は以下の通り。
$ uname -vrpm
4.15.0-76-generic #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 x86_64 x86_64
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
とりあえず結論
LinuxのModemManagerの割り込みによってキーマップの書き込みが失敗していました。
以下の通りModemManagerを停止させた後、書き込みを再実行して成功しました。
※必ず、ModemManagerを利用していないことを確認してから実行してください。モバイルブロードバンド接続していたら怪しいので、踏みとどまりましょう。
$ sudo systemctl stop ModemManager.service
解説
ModemManagerは、モバイルブロードバンドでの接続をよしなに制御してくれるデーモンです。
モバイルブロードバンド接続で利用するモデムは、USB接続のものが多く存在します。
そのため、当然ですが、ModemManagerはUSBポートを開くことができます。
キーボード(というよりも、Pro Micro)が接続されているUSBポートも例外ではなく、キーマップ書き込み処理中にModemManagerによる割り込みが発生すると処理が失敗します。
有名な問題のようで、QMK Firmwareのリポジトリでも対応するためのissueが起票されています。
見たところ、対応策は「フラッシュ処理を実行する際にModemManagerが実行中だったら警告を出す」といったものになりそうなので、やらなきゃいけないことは変わらなさそうです。
停止したModemManagerは、利用しないのであればそのまま放置で問題ないです。
絶対に利用しないということであれば、以下コマンドで自動起動設定を無効化しても良いでしょう。
$ sudo systemctl disable ModemManager.service
「そうはいっても、起動していたものだから、元に戻したいな...」ということであれば起動し直しても良いでしょう。
$ sudo systemctl start ModemManager.service
参考にしたページ
Helix キーボードキットを組み立てた - FOHTE.NET
avrdude: Error: butterfly programmer uses avr_write_page() but does not provide a cmd() method - Stack Exchange
#877024 modemmanager should ask before messing with serial ports - Debian Bug report logs