Switch Language (en-US) (ja-JP)
古い avrdude に付属している conf ファイルには、 最新のデバイスを操作するには欠けている設定がいくつかあります。 正しく制御できない場合は下記の情報を参考に修正してください。
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側の処理性能に依存します。 処理性能が不足していると通信タイムアウトが多発、あるいは中断されます。
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;
;
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 以降では追記する必要はないはずです。 追記しても害はありません。
特に 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
書換動作として実装されている場合に生じます。
現在のファームウェアはこの情報を参照しなくなりました。
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/