早速やらかしました。Pro Microが文鎮化しました! ことの発端は、QMKのMouse Keysページを見ていて、便利そうじゃんっと思っておもむろに有効化したことだった…。 ファームウェアのサイズが大きくなりすぎて、ブートローダ領域をぶっ壊しうんともすんとも言わなくなったのであった。
途方に暮れていたら、以下の記事を見つけた。 幸いHelixは2つのPro Microを使うのと、片側はまだ正常であったために、試してみることにした。
AVR ISPとは
まずなんでこんなことしないといけないかということから調べた。 Helix(QMK)のファームウェアは、直接これがブートされるわけではなくて、Arduinoのブートローダが前段にいる。 電源が入るとこのブートローダが呼び出されて、Helix(QMK)のファームウェアが起動される。 リセットを押すと、LEDが点滅してファームウェアが書き込めるようになるのもArduinoのブートローダがよしなにやっているからなのであった。 このブートローダは、Helix(QMK)が置いてあるフラッシュメモリ領域に保存されているため、Helix(QMK)のサイズが大きくなるとブートローダ領域に浸食しぶっ壊れるのであった。
で、ブートローダが壊れるとUSBをPCに刺してもうんともすんとも言わなくてなる。。 こうなると、直接AVRマイコンにアクセスしてファームウェアを書き換えるしかにない。 この書き換えには、AVRライターが必要になるのだが、AVRマイコンをライター化するファームウェアがAVR ISP(In-circuit Serial Programmer )である。 Pro MicroをAVR ISP化して、文鎮化したPro Microに直接ファームウェアを書き込もうというのが、先述の記事である。
母艦Pro MicroのAVR ISP化
ここからが本題。 作業の前に必要なものは以下の通り
まず、Arduino IDEをDL。ファームウェアとavrdudeがあれば不要ではあるが、AVR ISPのファームウェアがどこにあるか分からなかったので、Arduino IDEを使った。 なお、DLにはかなり時間がかかる。
https://www.arduino.cc/en/main/software
DL後実行したら、まず、母艦Pro MicroをAVR ISP化する。 メニューの[ファイル]->[スケッチ例]->[11.AurduinoISP]->[AruduinoISP]を選択する。すると、新しいウインドウが開いて中にスケッチ(コード)が書かれている。
次にデバイスの設定を行う。 デフォルトではPro Microのボード情報は入っていない?ので追加する必要があると公式ドキュメントに書いてあるのでそれに従う。 メニューから環境設定画面を開き、[追加のボードマネージャのURL]に以下のURLをコピーする。
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
入力を完了したら、スケッチ画面に戻りメニューより[ツール]->[ボード]からSpark Fun Pro Micro
を選択する。
一覧にない場合は同メニューのボードマネージャからPro Microを選択すると、メニューに追加される。
ボードを選択したら、同じく[ツール]メニューの[プロセッサ]からATmega32U4(5V,16MHz)
を選択する。
ここまでできたら、母艦Pro MicroをPCにつなげ、一旦リセットを押す。 ファームウェア書き込み用のUSBモデムが見えている間に、メニューの[ツール]->[シリアルポート]から母艦Pro Microのポートを選択する。
選択が出来たらファームウェアを書き込む。 メニューの[スケッチ]->[マイコンボードに書き込む]を選択すると書き込みが開始される。 初回はファームウェアのビルドが走るので少々時間がかかる。 ビルドが終わり、ファームウェアの書き込みが走る直前に、再度母艦Pro Microのリセットを押す。 このタイミングが絶妙すぎるので、いい感じに調整する…。
無事書き込みが出来るとLEDが何度か点滅する。 そして、リセットボタンを押さなくてもUSBモデムが見えている状態なっているはず。
文鎮Pro Microへのブートローダ書き込み
ここまで来たらあとは簡単。 一旦母艦Pro MicroをPCから外し、以下のように配線する。
母艦Pro Micro | 文鎮Pro Micro |
---|---|
VCC | VCC |
GND | GND |
14 | 14 |
15 | 15 |
16 | 16 |
10 | RST |
問題がなければ、再度母艦Pro MicroをPCに接続する。
Aruduino IDEに戻り、メニューの[ツール]->[書き込み装置]からAruduino as ISP
を選択したら、同メニューよりブートローダを書き込む
を選択すると、書き込みが開始される。
問題がなければ正常に文鎮Pro Microにブートローダが書き込まれるはず。
おわりに
文鎮化したPro Microを復活することができてよかった! 組み立てて一週間も経たずに壊すところであったw
とはいえ、どのくらいのサイズまでならOKであるか知りたい…!
っと思っていたらavr-size
というズバリそのものなコマンドがあった。
このコマンドを使うとHexファイルが実際に何byteになるのかわかるのであった。
たとえば、以下はHelixデフォルトのファームウェアで試した例である。
$ avr-size .build/helix_rev2_default.hex text data bss dec hex filename 0 17540 0 17540 4484 .build/helix_rev2_default.hex
17540byteであることがわかる。 ちなみに、Arduinoのブートローダ(Caterina-promicro16.hex)は4090byteである。
$ avr-size Caterina-promicro16.hex text data bss dec hex filename 0 4090 0 4090 ffa Caterina-promicro16.hex
Helixに使われているPro Microは32KBのフラッシュメモリを積んでいるので、ブートローダ分を除外すると28,678byte
つかえることがわかる。
今後はファームウェアアップデート前にavr-sizeを確認して、この数値を超えていないかチェックするようにしようと思ったしだい。
2018/03/06 追記
qmk_firmwareを最新にしたらファームウェアサイズのチェックがされるようになっていた! これで文鎮化する人が減るんやなって・・・