外付けAVRライタ無しでBootloaderを書き込む

Kimio Kosaka


2008.07.27 05:48(JST)

 


Arduino Diecimilaにブートローダを書き込むとき,DiecimilaのICSPにAVRライタを接続して書き込みますが,今回,外部にAVRライタを接続しないでDiecimila自身でブートローダを書き込む方法を見つけました。(Arduino NG,Arduino Duemilanove でも実行可能です)


日本語    English


  1. BitBang Mode AVR-Writer

    Arduino Dicimila/NG/DuemilanoveにはUSB-SerialブリッジとしてFT232RLが搭載されています。このFT232RLには BitBang Mode という各信号線を個別に制御する機能があります。

    すz氏が「すzのAVR研究」で BitBang Modeを使うavrライタソフトavrdude-serjtag を公開されています。 このavrduse-serjtagを用いればFT232RLがAVRライタとして働くので,FT232RLとICSPを接続すればDiecimila自身でブートローダを書き込むことができます。


  2. Diecimilaの加工

    Diecimilaの基板上FT232RLの近くにX3と書かれた空きパッドがあります。(この空きパッドはFT232RLの制御ピンに接続されています)
    この空きパッドのハンダを吸い取り,ピンヘッダーを挿入してハンダ付けします。

     

    diecimila_befor_1      diecimila_after_1


  3. avrdude-serjtagのインストール
    serjtag-0.3をダウンロードします。
    serjtag-0.3.zip mirror site
    serjtag-0.3.tar.gz mirror site
    serjtag-0.3.zip original site (http://suz-avr.sblo.jp/article/4438871.html)
    serjtag-0.3.tar.gz original site (http://suz-avr.sblo.jp/article/4438871.html)
    Windowsの場合は展開してすぐに利用できます。
    • 【注意1】

      avrdude-serjtag を Linux や Mac OS で動かすには,パッチを当てたり使用する環境に適合させて再コンパイルする必要があるようです。 FT245R/FT232R で avrdude (Linux)BitBang Mode AVR-Writer on Macのプロジェクトにその手順が書かれています。

      また,Linux や MacでVMwear上にWindowsをインストールしてDiecimilaの動作環境を構築すればWindows版avrdude-serjtagがそのまま稼動します。

    • 【注意2】

      avrdude-serjtaをArduino-IDEに組み込んで[Tools]→[Burn Bootloader]から動かすことはできません。単独で手動操作します。


  4. avrdude-serjtagの設定

    serjtag-0.3\avrdude-serjtag\binary\avrdude.confのprogrammerセクションに次の記述を追加挿入します。

    #arduino diecimila
    programmer
      id="diecimila";
      desc = "FT232R Synchronous BitBang";
      type = ft245r;
      miso = 3;  # CTS X3(1)
      sck = 5;  # DSR X3(2)
      mosi = 6;  # DCD X3(3)
      reset = 7;  # RI X3(4)
    ;

  5. 動作のテスト
    • 配線

      写真のようにX3のピンとICSPのピンを配線します。(写真をクリックすると大きく表示されます)

      connecting    connecting_p


    • DiecimilaとPCをUSBケーブルで接続します
    • avrdude-serjtagの起動

      ここでは,serjtag-0.3.zipをC:\に展開したと仮定して解説します。
      コマンドプロンプトを開き次のように操作します。

      カレント・ディレクトリを移動します。
      C:\Documents and Settings\admin>cd C:\serjtag-0.3\avrdude-serjtag\binary
      avrdude-serjtagを低速クロックで起動します
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t -B 4800
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 4800 -> ft baud 2400
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      signetureの戻り値が0x1e9406 (ATmega168 device code)であれば正しく動作しています。
      avrdude-serjtagを終了します
      avrdude> quit
      >>>quit
      avrdude: safemode: Fuses OK

      avrdude done. Thank you.

      C:\serjtag-0.3\avrdude-serjtag\binary>

      正しく動作していないときは次のように表示されます。
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t -B 4800
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 4800 -> ft baud 2400
      avrdude: ft245r_program_enable: failed
      avrdude: initialization failed, rc=-1
                  Double check connections and try again, or use -F to override
                  this check.

      avrdude done. Thank you.

      C:\serjtag-0.3\avrdude-serjtag\binary>

      高速クロックで起動してみます。
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 230400 -> ft baud 115200
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      avrdude> quit
      >>>quit
      avrdude: safemode: Fuses OK

      avrdude done. Thank you.

      C:\serjtag-0.3\avrdude-serjtag\binary>

  6. Bootloaderを書き込む
    • ヒューズビットを読む
      Dicimilaに積んでいるATmega168のヒューズビットの値を読み出してメモします。
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 230400 -> ft baud 115200
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      avrdude> d efuse
      >>> d efuse
      0000  00

      avrdude> d hfuse
      >>> d hfuse
      0000  dd

      avrdude> d lfuse
      >>> d lfuse
      0000  ff

      avrdude> d lock
      >>> d lock
      0000  0f

      avrdude>avrdude> quit
      >>>quit
      avrdude: safemode: Fuses OK

      avrdude done. Thank you.

      C:\serjtag-0.3\avrdude-serjtag\binary>

    • ブートローダのコピー
      フォルダarduino-0011\hardware\bootloaders\atmega168\のATmegaBOOT_168_diecimila.hexを
      フォルダserjtag-0.3\avrdude-serjtag\binary\にコピーします。

    • 新しいチップの装着
      USBケーブルをDiecimilaから外します。
      ATmega168チップを外します。
      新しいATmega168チップを装着します
      USBケーブルをDiecimilaに接続します。

    • ヒューズビットの書き込み (ロックビットを除く)
      arvedude-serjtagを低速クロックで起動してメモしておいたヒューズビットを書き込みます。
      注意!新品のチップは高速クロックに追従できません。必ず低速クロックで起動してください。
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t -B 4800
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 4800 -> ft baud 2400
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      まず,チップを初期化(erase)します
      avrdude> erase
      >>> erase
      avrdude: erasing chip
      ft245r: bitclk 4800 -> ft baud 2400
      各ヒューズビットを書き込みます
      avrdude> w efuse 0 0x00
      >>> w efuse 0 0x00

      avrdude> w hfuse 0 0xdd
      >>> w hfuse 0 0xdd

      avrdude> w lfuse 0 0xff
      >>> w lfuse 0 0xff

      各ヒューズビットを読み出して正しく書き込まれていたらquitします

      高速クロックで動作するか確かめます。ヒューズビットが正しく書き込まれていたら高速クロックで動作するはずです。
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 230400 -> ft baud 115200
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      avrdude> quit

      コマンド・ライン・モードでブートローダを書き込みます。(-t オプションを外します)
      C:\serjtag-0.3\avrdude-serjtag\binary> avrdude -c diecimila -P ft0 -p m168 -U flash:w:ATmegaBOOT_168_diecimila.hex
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 230400 -> ft baud 115200
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
                  To disable this feature, specify the -D option.
      avrdude: erasing chip
      ft245r: bitclk 230400 -> ft baud 115200
      avrdude: reading input file "ATmegaBOOT_168_diecimila.hex"
      avrdude: input file ATmegaBOOT_168_diecimila.hex auto detected as Intel Hex
      avrdude: writing flash (16154 bytes):

      Writing | ################################################## | 100% 8.75s

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

      Reading | ################################################## | 100% 4.05s

      avrdude: verifying ...
      avrdude: 16154 bytes of flash verified
      avrdude: safemode: Fuses OK

      avrdude done. Thank you.

      C:\serjtag-0.3\avrdude-serjtag\binary>

      ロックビットを書き込みます
      C:\serjtag-0.3\avrdude-serjtag\binary>avrdude -c diecimila -P ft0 -p m168 -t
      avrdude: BitBang OK
      avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
      avrdude: drain OK
        ft245r: bitclk 230400 -> ft baud 115200
      avrdude: AVR device initialized and ready to accept instructions
      Reading | ################################################## | 100% 0.00s
      avrdude: Device signature = 0x1e9406
      avrdude> w lock 0 0x0f
      >>> w lock 0 0x0f

      avrdude> quit

      以上でブートローダの書き込みは終了です。

    • 動作確認

      一旦,DicimilaからUSBケーブルを外します。

      X3とICSPの配線を外します。

      再度,DicimilaにUSBケーブルを接続します。

      リセット・ボタンを押します。

      Arudino-IDEを起動しサンプル・スケッチのBlinkをDiecimilaにアップロードして見てください。 どうでしょうか?外付けAVRライタ無しでブートローダを書き込むことができました。


  7. デモ・ビデオ


  8. DicimilaをAVRライタとして使う

    写真のようなICSPケーブルを作ればDicimilaを汎用のAVRライタとして使えます。(写真をクリックすると大きく表示されます)

    avr_writer    icsp-cable


  9. 秋月のUSB-Serial変換モジュール(AE-UM232R)でBootloaderを書込む

    AE-UM232R はDicimilaと同じFTDIのチップを使っているので,これを使ってもBootloaderを書き込めます。

    ブレッドボードなどを使って下のように配線しDicimilaを用いる場合と同じようにavrdude-serjtagを操作します。 詳細はこちら


謝辞

BitBang Mode AVRライタソフト「avrdude-serjtag」を作られた すz氏 に感謝の意を表したいと思います。 世界中のArudino Diecimilaユーザに「avrdude-serjtag」を紹介し すz氏 の研究を讃えたいと思います。 Kimio Kosaka


[もどる]          [Arduino Diecimilaを使う]         

upload 2008.07.27 05:48(JST)

update 2008.11.07

Creative Commons License