DFU Bootloader
AVR32のマイコンボードを作りました。
このマイコンは出荷時に、DFU Bootloaderというプログラムが書き込まれています。DFUでブートすると、USBデバイスとしてパソコンに認識されて、USB経由でプログラムを書き込むことができます。
DFU Bootloaderを消してしまった
Atmel ICEがあるので、JTAG経由でプログラムを書き込んでみました。その際に普通にマイコンを消去してしまいました。消去したとしても、PA13をLowにしてリセットすれば再びDFU Bootloaderが起動するだろうと思っていました。
ところが、PA13をLowにしてRESETしても、書き込んだプログラムが実行されてしまい、DFU Bootloaderが起動しません。
あらら。DFU Bootloaderは、マイコンを消去してしまうと、一緒に消えてしまうんですね。DFU Bootloaderを使ったプログラムの書き込みもやってみたいので、DFU Bootloaderをなんとか元に戻したいです。ところが、簡単に戻せると思ったら、結構難しかったです。わかってしまえば簡単。折角なので、戻し方をご紹介します。
DFU Bootloaderはどこにあるの?
DFU Bootloaderのプログラムとデータは、0x80000000から8kB分の領域にBootloaderが、Flash User Pageの0x8008001FCにもGP Fuse Bitsというデータがあります。あとはヒューズビット。これら3つが必要なのですが、マイコンを初期化するとこれら全部含めて消えてしまいました。
DFU Bootloaderを吸い出す
AVR32のマイコンボードを2つ作ってあるので、何も手をつけていないもう一台のAVR32から、これらのデータを吸い出すことにします。吸い出すにはAtmel ICEが必要です。AVR32とAtmel ICEをJTAGで接続して、Atmel ICEをUSBでパソコンに接続します。
AVR32に対して書き込みや読み出しを行うには、atprogram というコマンドラインのソフトを利用します。GUIを使ったAteml studioのDevice Programingでは正しく書き込めませんでした。
atprogramはAtmel Studioをインストールすると、一緒にインストールされています。コマンドプロンプトを開いて、まずはその場所へ移動します。
Bootloader
最初にBootloaderを吸い出します。コマンドラインで
と実行します。AtlemICEのJTAG経由で、AT32U3B064というマイコンの、0x80000000から0x2000バイト分のデータを、hexファイルとしてC:¥at32uc3b-flash.hexに出力しなさい。というコマンドです。マイコンがAT32U3B256でしたら、-d at32uc3b256と置き換えてください。
Bootloaderのファイル、at32uc3b-flash.hexができました。Cのルートにファイルがありますが、このファイルは後で使うので、atprogramのある、\Program Files (x86)\Atmel\Studio\7.0\atbackend にコピーしておきます。
GP Fuse Bits
続いてGP Fuse Bitsを読みだすために、Flash User Page全体を読み出してみます。
at32uc3b-user.hexができました。このHexファイルを見てみると、最後に929E0D6Bとあるだけで、その他の領域は全てFFでした。
Flash User Pageは何も書かれていないということです。GP Fuse Bitだけ、アドレス0x808001FCに、0x929E0D6Bを書き込めばいいことがわかりました。
ヒューズビット
Atmel Studioの[Tools]->[Device Programing]を開き、ヒューズビットを確認します。
ヒューズビットは0xFC07FFFFでした。
DFU Bootloaderを書き込む
消去してしまった方のAVR32に、これらの情報を書き込みます。書き込みにもatprogramを使います。これには順番が重要でした。
- マイコンを消去する
- GP Fuse Bitを書き込む
- Bootloaderを書き込む+ヒューズを書き込む
の順番で書き込んでいきます。
まずは消去します。
続いてGP Fuse Bitを書き込みます。
最後にBootloader+ヒューズビットを書き込みます。
このヒューズビットを書き込むアドレスが、ハマるポイントでした。ネットでは
というように、アドレス0xFFFE1410に書き込む方法がほとんどでした。現在のatprogramは、仕様が変更されてしまい、0x0を指定するそうです。
DFU Bootloader復活
リセットするとDFU Bootloaderが起動します。デバイスマネージャで確認すると、AT32UC3Bというデバイスが追加されているのがわかります。
Bootloaderのファイル
DFU Bootloaderのファイルは、吸いださなくても、at32uc3b-isp-1.0.2.hex や at32uc3b-isp-1.0.3.hex で検索するとネットで見つかります。DFU Bootloaderは現在たぶん1.1.0が最新のようです。ネットにあるのはバージョンよりも、私が吸い出した最新と思われるDFU Bootloaderファイルをここに置いておきます。
もし、消去してしまった場合には、これをお使いください。
DFU Bootloaderが復活してよかったです。戻し方がわかったので、心置きなく書き込みができます。
コメント