LUFA MassStorage Bootloaderを使う

環境

開発者がすること

  1. ProMicroをArduino as ISPに繋ぐ

  2. cd qmk_firmware/lib/lufa/Bootloaders/MassStorage

  3. 40% Keyboards: Self Flashing Planck に沿ってmakefileを書き換える
MCU          = atmega32u4
ARCH         = AVR8
BOARD        = LEONARDO
F_CPU        = 16000000

FLASH_SIZE_KB         = 32
BOOT_SECTION_SIZE_KB  = 4
  1. BootloaderMassStorage.c を適切に書き換える
    • #if (BOARD == BOARD_LEONARDO) から#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))までの間に書く
    • PORT がプルアップ, DDRが出力, PINが入力値を表す?(わかってないけど雰囲気で書き換えたら動いた)
    • 適当にビット演算して代入してください

col0がF4, row0がB1であり, ダイオードがcol2rowのときの例:

    #if (BOARD == BOARD_LEONARDO)
        PORTF |= (1 << 4); //F4を入力にしてプルアップ
        DDRB  |= (1 << 1); // Set pin B1 as low B1をGNDに
        PORTB &= ~(1 << 1);
        Delay_MS(25);

    JumpToApplication = ((PINF & (1 << 4)) != 0); //F4がfalseならブートローダーを起動
    /* Disable pull-up after the check has completed */
    PORTF &= ~(1 << 4);
  1. make
  2. Arduino as ISPでフューズビットを書き込み

Arduino as ISP/dev/ttyACM0 のとき

avrdude -p m32u4 -c avrisp -P /dev/ttyACM0 -b 19200 -e -v
avrdude -p m32u4 -c avrisp -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xff:m -U hfuse:w:0xd8:m -U efuse:w:0xc9:m -v
  1. Arduino as ISPブートローダーを転送
avrdude -p m32u4 -c avrisp -P comXXX -b 19200 -B 4 -U flash:w:"BootloaderMassStorage.hex" -v
  1. qmk_firmwaremake keyboard:keymap:flashbinとしてmake
    • FLASH.binができる
  2. ユーザーにFLASH.binを渡す

ユーザーがすること

  1. FLASH.binを受け取る
  2. 指定されたキーを押しながらキーボードを接続
    • LUFA BOOT として認識される

Ubuntu

  1. FLASH.binsudo dd if=FLASH.bin of=/dev/sdb seek=4 で転送(LUFA BOOT/dev/sdb1のとき)
  2. LUFA BOOT をアンマウントする

Windows

  1. FLASH.bin をドラッグ&ドロップする
  2. LUFA BOOT を「安全に取り外し」
  3. キーボードを抜いて再度接続する

まとめ

Ubuntuドラッグ&ドロップで転送する方法を見つけられなかったのが悔しい。

ツールをインストールすることなくOS標準のコマンドで転送できるだけで価値があると思う。

.binを作るWebアプリを誰か作ってください(他力本願)

参考

Ubuntuでmbedファームウェアを更新する方法 | Mbed