朝日薫 / K.Sato

[MULTIX UPDI4AVR Programmer] avrdude.conf 修正の要点

Switch Language (en-US) (ja-JP)

古い avrdude に付属している conf ファイルには、 最新のデバイスを操作するには欠けている設定がいくつかあります。 正しく制御できない場合は下記の情報を参考に修正してください。

programmer “updi4avr” の追加

UPDI4AVR は JTAG2UPDI 互換ですが、-p 指定用の設定を追加すればより高速に動作します。 baudrate-b オプションの省略時規定値です。

programmer
    id                     = "updi4avr";
    desc                   = "JTAGv2 to UPDI bridge";
    type                   = "jtagmkii_updi";   # jtagmkii_pdi before v7.1
    prog_modes             = PM_UPDI;           # v7.2 or later
    connection_type        = serial;
    baudrate               = 230400;
    hvupdi_support         = 0, 1, 2;           # v7.2 or later
;

avrdude 6.x 以前(それはArduino IDEに付属しているものです)では jtagmkii_updiが定義されておらず、 代わりにjtagmkii_pdiを指定する必要があります。 この場合各partセクションにhas_updi = yes指示がなければなりません。 またeeprom設定にはpage_size = 1指示が必要になります。

JTAG2UPDI の最高速度は -b 115200 でそれ以上は推奨されません。

UPDI4AVR 自体は -b 1000000 でも動作しますが、 実際に使用できる最大速度は PC側の処理性能に依存します。 処理性能が不足していると通信タイムアウトが多発、あるいは中断されます。

memory “boot” 設定の不足

avrdude 6.x 以前でこの設定が不足していると、 Flash書き込み時に「”boot”設定がない」という余分な警告が表示されることがあります。 これを避けるには memory "boot"size = 0 を与えてください。

part
    id    = ".avr8x";
    desc  = "AVR8X family common values";
    has_updi  = yes;
    nvm_base  = 0x1000;
    ocd_base  = 0x0F80;

    memory "boot"
        size = 0;               # HERE
        offset = 0x4000;
    ;

AVR128Dx シリーズでの load_ext_addr 設定不足

avrdude 6.x 以前でかつ、フラッシュ容量が 128KiB 品種の場合、 このload_ext_addr設定が不足しているとフラッシュ領域の上位アクセスに際し、 avrdude コマンドがアドレスオーバーフローによって正常動作しないことがあります。

part parent    ".avrdx"
    id        = "avr128da64";
    desc      = "AVR128DA64";
    signature = 0x1E 0x97 0x07;

    memory "flash"
        size      = 0x20000;
        offset    = 0x800000;
        page_size = 0x200;
        readsize  = 0x100;
        load_ext_addr   = "  0   1   0   0      1   1   0   1",
                          "  0   0   0   0      0   0   0   0",
                          "  0   0   0   0      0   0   0 a16",
                          "  0   0   0   0      0   0   0   0";
    ;

アドレスオーバーフローが発生していると前半 64KiB領域に、 avrdude は後半64KiB領域を 上書きしようとします。 その結果、領域内容は不正に破壊されて、検証にも失敗します。

少なくとも avrdude 7.1 以降では追記する必要はないはずです。 追記しても害はありません。

適切な EEPROMページ粒度

特に AVR_Dx シリーズ以降で EEPROM領域が正しく書けないない場合は、 memory "eeprom"セクションのpage_size値が小さすぎるか、大きすぎます。 AVR_DA/DB/DD シリーズでは 1 か 2 を、 AVR_EA/EB シリーズでは 8を、それぞれ指定してください。

memory "eeprom"
    size      = 256;
    offset    = 0x1400;
    page_size = 2;      # HERE
    readsize  = 256;
;

tinyAVR シリーズでは 32 が、 かつ一部の品種では 64 が、 megaAVR シリーズでは 64 が推奨値です。 これらの違いは対象AVRに搭載されているNVMCTRL制御器の特性に依存します。

制限範囲を超える値では warning: timeout/error communicating with programmer がレポートされるでしょう。 これは avrdude 側の送信後受信待機タイムアウト制限時間内に 一回の書込操作が終わらなかったことを意味します。 同時にそれは1バイト単位の低速動作へフォールバックするでしょう。 この問題を解消して可能な限り早く効率的に書き込むには、 page_sizeを適切な大きさまで小さくしなければなりません。

tinyAVR と megaAVR シリーズではNVMCTRL制御器が SRAMとは別の十分大きな独自の緩衝メモリを持っているため、 他のシリーズより大きなブロックサイズを一回の操作で書くことができます。 ただしメモリアライメントを跨ぐ場合は操作を分割しなければなりません。 従って有効なpage_sizeの最大値は 32か 64になります。 なおこれらのシリーズではuserrowに対しても同様です。

AVR_DA/DB/DD シリーズはNVMCTRL制御器が緩衝メモリを持たず、 1バイト単位でeepromを書き換えるしかないため、 他のシリーズに比べて低速にならざるを得ません。 多くの場合その上限は 16です。

AVR_EA/EB シリーズではNVMCTRL制御器の持つ EEPROM用の緩衝メモリが8バイト(メモリアライメント)であるため、 一回の操作は8バイトまでにしなければなりません。

どのシリーズでも確実に動作するであろうpage_sizeは1です。 しかしabrdude.confを他の書込器と共有する場合、 page_size=2以上でなければその書込器が正常動作しない場合があります。 これはpage_size=1が暗黙のFUSE書換動作として実装されている場合に生じます。

memory “data” 設定不足

現在のファームウェアはこの情報を参照しなくなりました。

Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/

Copyright (c) 2023 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/