C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Pro Micro と qmk_firmware と WSL-Ubuntu と avrdude のメモ

自作キーボードを Windows 10 な PC で楽しみたいけど WSL-Ubuntu でにゃんにゃんしたいメモ。

WSL-Ubuntu での AVR 開発環境の準備

sudo apt install -y gcc-avr avr-libc binutils-avr avrdude

WSL-Ubuntu での qmk_firmwaremake によるビルド

git clone git@github.com:qmk/qmk_firmware.git
cd qmk_firmware
make lets_split:default

開発環境に問題がなければ待っているだけ。

ls -la .build/*.hex

.hex ができていなければ開発環境の install に何か忘れているか、 alias なりシェル関数なり PATH の優先順位なりで何かがおかしい。エラーログが出ていれば読んでどうにかする。

-rwxrwxrwx 1 usagi usagi 54K 2019-02-11T08:35:44 .build/lets_split_rev2_default.hex

WSL-Ubuntu での avrdude による Pro Micro への .hex のアップロード

執筆時点の WSL では次のようにポートを指定せず qmk_firmwaremake に全自動でお任せしようとすると ERROR で期待動作しない😂

# これは失敗する例
make lets_split:default:avrdude

ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using AVRDUDE, AVRDUDESS, or XLoader.

と、いうわけで、 Pro Micro を RESET しつつ avrdude を手打ちする。長いコマンドになるので予め入力して ENTER するだけにしてから Pro Micro を RESET して素早く ENTER する。 avrdude-P 引数で指定すべき /dev/ttyS 系のポートが具体的にどれなのかはちょっとした注意が必用(後述)。

# これは成功する例
avrdude -p atmega32u4 -c avr109 -P /dev/ttyS4 -U flash:w:/mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex

(note: -U の引数は先に作った .hex のパスへ読み替えて下さい。必用なら pwd とかで確認してね♥ )

↓アップロード成功のログが流れてくれれば成功😃

Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
    Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.

Programmer supports the following devices:
    Device code: 0x44

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9587 (probably m32u4)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex"
avrdude: input file /mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex auto detected as Intel Hex
avrdude: writing flash (19566 bytes):

Writing | ################################################## | 100% 1.61s

avrdude: 19566 bytes of flash written
avrdude: verifying flash memory against /mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex:
avrdude: load data flash data from input file /mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex:
avrdude: input file /mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex auto detected as Intel Hex
avrdude: input file /mnt/c/Users/usagi/tmp/GitHub/qmk_firmware/.build/lets_split_rev2_default.hex contains 19566 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.58s

avrdude: verifying ...
avrdude: 19566 bytes of flash verified

avrdude: safemode: Fuses OK (E:FB, H:D8, L:FF)

avrdude done.  Thank you.

WSL の /dev/ttyS 系と Pro Micro の RESET の注意点

例えば、Pro Micro の初期状態あるいはファームウェアを再設定するなどして Arduino としてブートしている Pro Micro を PC へ挿しているとき、 WSL の外の Windows のデバイスマネージャーの Ports (COM & LPT)COM5 として認識されていたとしよう。この状態では Arduino IDE で遊んだりする時には COM5 をポートに設定して扱える。

しかし、この状態の Pro Micro へ qml_firmware をアップロードしようと avrdude-P する場合に WSL 内で /dev/ttyS5 とすると接続できずに失敗する。

これは Pro Micro は RESET 状態では別の COM ポートへ認識されるためで、例えば、デバイスマネージャーを凝視しながら Pro Micro を RESET すると COM5 だった認識がリセットで解除された直後は COM4 として認識され、書き込み可能時間が経過するとまた認識が解けて COM5 へ再認識される動作を確認できる。

f:id:USAGI-WRP:20190211090901p:plain

↑RESET直後に再認識された COM4 の Pro Micro

と、いうわけで、この場合は avrdude-P 引数には /dev/ttyS4 を渡してあげると期待動作し、 WSL-Ubuntu だけで意図通り qmk_firmwareavrdude でアップロードできる😃

参考