自作キーボード初心者がfirmware書き込みで躓いたこと集

# 概要
初めて自作キーボード作成時にfirmware書き込みで結構躓いたので、躓いた箇所を記載していこうと思います。。

# キーボード・環境
- Keyboard: ErgoDash
- OS: Ubuntu 18.0.4

# 最終的に実行した手順
※ErgoDash/rev1のdefaut設定を書き込みの場合です。
※dockerを利用して書き込みを行いました。

1. `sudo apt install -y gcc-avr avr-libc binutils-avr avrdude` (dockerを使用するならいらないかも？）
2. `git pull git@github.com:qmk/qmk_firmware.git`
3. `cd qmk_firmware`
4. lufaを手動で取得（後述）
5. `sudo systemctl stop ModemManager.service`（後述）
6. `sudo ./util/docker_build.sh ergodash:default:avrdude`を実行（sudoに関して後述）

# 躓いた箇所
firmwareの書き込み（`./util/docker_build.sh ergodash:default:avrdude`）で躓いた箇所を記述していく。

## lufaが無いと言われる

```shell
QMK Firmware 0.8.58
WARNING: Some git submodules are out of date or modified.
 Please consider running make git-submodule.

Making ergodash/rev1 with keymap custom and target avrdude

tmk_core/protocol/lufa.mk:14: lib/lufa/LUFA/makefile: No such file or directory
make[1]: *** No rule to make target 'lib/lufa/LUFA/makefile'.  Stop.
Make finished with errors
make: *** [Makefile:579: ergodash:custom:avrdude] Error 1
```

`ls lib/lufa/`でわかるのだが、lufa配下が空である。

#### 対応
```shell
$ cd qmk_firmware
$ make git-submodule
```

## 「reset your controller now」表示後リセットを押しても反応しない
`Detecting USB port, reset your controller now...`と出た際にキーボードのリセットボタンを押しても反応しない。

#### 対応
usbケーブルを変更する。変更したらリセットボタン押下後すぐ次の処理に移るようになった。（駄目なほうのusbでもpc microのランプはちゃんと点灯していたのでusbケーブルの問題を軽視していた。。）

## 「Waiting for /dev/ttyACM0 to become writable」から進まない
`Waiting for /dev/ttyACM0 to become writable....`と無限にドットが続いて、先に進まない。試しに、`avrdude`コマンドを実行してみるとpermission deniedとなる。

```shell
# 拾ってきたコマンドでなんのコマンドなのかわかってない（笑）
$ avrdude -p m128 -c stk500 -e -U flash:w:diag.hex
avrdude: ser_open(): can't open device "/dev/ttyS0": Permission denied
```
#### 対応
`sudo`で実行する。

```shell
sudo ./util/docker_build.sh ergodash:default:avrdude
```

## 「avrdude: Error: butterfly programmer uses avr_write_page() but does not provide a cmd() method.」とエラーになる。
下記のようなエラーになる。

```shell
 ***failed;
 ***failed;
 ***failed;
 ***failed;
avrdude: Error: butterfly programmer uses avr_write_page() but does not
provide a cmd() method.
 *** page 27 (addresses 0x459c - 0x461b) failed to write

Writing | ################################################## | 100% 5.44s

avrdude: 17948 bytes of flash written
avrdude: verifying flash memory against .build/ergodash_rev1_default.hex:
avrdude: load data flash data from input file .build/ergodash_rev1_default.hex:
avrdude: input file .build/ergodash_rev1_default.hex auto detected as Intel Hex
avrdude: input file .build/ergodash_rev1_default.hex contains 17948 bytes
avrdude: reading on-chip flash data:

Reading |                                                    | 0% 0.00savrdude: butterfly_recv(): programmer is not responding
Reading | #                                                  | 2% 5.01savrdude: butterfly_recv(): programmer is not responding
Reading | ################################################## | 100% 10.14s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0020
         0xff != 0x0c
avrdude: verification error; content mismatch

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

avrdude done.  Thank you.

tmk_core/avr.mk:207: recipe for target 'avrdude' failed
make[1]: *** [avrdude] Error 1
Make finished with errors
Makefile:560: recipe for target 'ergodash:default:avrdude' failed
make: *** [ergodash:default:avrdude] Error 1
```

#### 対応
ModemManagerってのがシリアルポートを塞いでいるらしい。。
下記コマンドを実行してModemManagerを止める。

```shell
$ sudo systemctl stop ModemManager.service
```

再起動しても動かないようにするには

```shell
sudo systemctl disable ModemManager.service
```
参考: https://arduino.stackexchange.com/questions/61359/avrdude-error-butterfly-programmer-uses-avr-write-page-but-does-not-provide

# その他困ったこと
自作キーボードでは当たり前のことかもしれないが、事前に知っておきたかったことをおまけとして記す。

- firmwareの書き込みはあまり時間がかからない。（時間がかかるようなら何か問題が起きている可能性がある。）
- ErgoDashのようなセパレートタイプは左側も右側も同じ内容を書き込む。
- firmware書き込み時はまだTRRSケーブルを接続する必要はない。

# まとめ
調べた感じだとやはりfirmwareの書き込みでつまずく方が多い印象。（そして自分もハマった一人。。）だからと言ってあまり多くの情報がネットに上がっているわけではないので、少しでも役にたてばと願います。
誤り、不足などあればご連絡ください。