ものは、avrdude-serjtag04e.zip (最低限のテストはしたけど何か問題があるかも。)
最新版(暫定リリース): avrdude-serjtag04n.zip
注意: USBasp の改造が含まれていますが、オリジナル USBasp で動作しない問題があります。ft245r BitBang ライタも未テスト。
注意2: USBasp の新版がリリースされています。永らく更新がなかったので、もう更新されないだろうと思い、好き勝手にプロトコル拡張してしまいました。新版と競合しますので、オリジナル USBasp を使用している方は、04n のバイナリを使用できません。
もともとは、自作ライタのプロトコル SERJTAG を avrdude に対応したときのおまけだったが、広く使われるようになったので、独立させた。serjtag の名前がユニークなので そのまま使うことにして、申し訳程度に SERJTAG にも対応している。
今頃になって、バージョンアップしたのは、自分の環境整備の一環。最近は、AT90USB162 で遊んでいるので、ライタがいらなかったのだが、USBaspLoader の移植とかはじめたので、必要になってきたため。
変更点(リリース関係)
- ベースバージョンを 5.3.1 → 5.8 に 上げた。
新しいデバイスの定義が最初から入っているため。できるだけ新しいのを選択。
(+ m168p (ATMEGA168P) が入っていなかったので conf に 追加) - libusb-0.1.12.2 をリンク
USBasp も使うので、リンクするようにした。ただし、ドライバや DLL は同梱していないので、使う場合は別途入手するか、WinAVR -20090313 の環境を使う必要がある。 - ftd2xx.dll の添付をやめた。
ドライバをインストールすれば dll もインストールされるので不要。 - avrdude.conf のサーチを変更。
exe ファイルを avrdude-xx.exe と変更した場合、avrdude-xx.conf をまずサーチするようにした。 - usbasp の動作を変更 (非互換なので注意)
終了時の動作を -E オプションで決めるようにした。
-E reset ( リセットする )
-E noreset ( リセットしない → デフォルト )
Vendor名、Product名を指定できるようにした。
-P [Vendor名]:[Product名]
Vendor名、Product名 のどちらかは省略可 。省略した場合
Vendor名 = www.fischl.de
プロダクト名 = USBasp
※ライタ/ブートローダ の デバッグ用。
Mac OS X / Linux で も使えることが分かったので。
変更点(ft245r 機能)
- デバイス定義の追加と見直し。
以下の 3 タイプ 5 種類にした。
ft245r : sample configration for FT232R/FT245R
ft232r0 : FT232R channel 0
miso : D1/RXD
sck : D2/RTS
mosi : D0/TXD
reset : D4/DTR
diecimila : Arduino Diecimila or clone
ft232r1 : FT232R channel 1
miso : D3/CTS
sck : D5/DSR
mosi : D6/DCD
reset : D7/RI
breakout : sparkfun FTDI Basic Breakout
miso : RXI (2)
sck : CTS (5)
mosi : TXO (3)
reset : DTR (1)
推奨は、diecimila = ft232r1。ft245r は、TXD ⇔ RTS を入れ替えた。serjtag-0.3 で間違えたので直したかったのだ。
(秋月 AE-UM232R を使った例。XTAL1 と LED については↓参照)
追記 2011/1/22 ft232r0 を使ってくれている人を発見。
Tiny 系だと 書き込みと ソフトシリアル を配線を切り替えずに使えて便利だそうだ。ただし、シリアルで接続すると 普通 DTR が L になるので リセットがかかる。対処するには、FT_PROG(または MProg)で DTR の極性を反転させるのが良いとのこと。 - -P ポートの指定方法の追加
通常 1つしかないと思うので、ft0 で良いのだが、複数になると 混乱するので、シリアル番号や プロダクト名も使えるようにした。
シリアル番号や プロダクト名は、Mprog ユーティリティで自由に変更できる。ちなみに シリアル番号は数字である必要はなく 文字列。
例:
プロダクト名:AVR-Programmer
シリアル番号:AE232001
ついでに書いておくと、CBUS の機能を変更できて、6MHz,12MHz,24MHz,48MHz のクロック出力にできる。(クロック出力には、一応 CBUS4 を推奨)
外部クリスタルに変更したチップも、XTAL1 にクロックをつなげることで、プログラムできる。 - 終了時の状態設定の見直し。
いままで、sck , mosi, reset は出力のままで、reset は L レベルだった。この 3 つ以外は入力。
まず、sck , mosi は 終了時 入力(HI-Z) にすることにした。
reset は 出力 L を維持するが、-E reset で 入力(HI-Z)にする。
PC が、シリアルポートを Open するまでは、この状態が維持されるはず。Open した場合でも 出力は、TXD , RTS, DTR のみだから、diecimila = ft232r1 なら 出力がぶつかるような問題はでない。
入力はどうなんだろう? 検討してなかった。
フロー制御なし(デフォルト)なら、CTS は関係ない。DSR/DCD/RI は、モデム制御だから モデムの設定をしない限り関係ないような気がする。ポートの詳細設定に ドライバ固有の設定があり、いくつか項目があるようなので、変更すれば良いのかも。
実際のところよくわからない。
sck, mosi の制御について
終了時は、入力にしたので、-E reset で書き込んだプログラムを実行しても出力がぶつかることはない(はず)。
初期化時は、どうなのか検証してみた。
手順は次のようになっている。
- (1) Synchronous BitBang Mode にできるかどうか確認する。(全ピン入力)
- (2) モードを一旦リセット
- (3) Synchronous BitBang Mode にする。(全ピン入力)
- (4) sck = L, mosi = L, reset = L を出力して出力の初期状態を設定。
- (5) sck, mosi, reset を出力に。
- (6) sck = L, mosi = L, reset = L を出力
- (7) reset = H→L を出力 (パルス幅 1.2 ms)
データシートには、
- sck = L にした後、reset = L にする。
- リトライ時には、reset に 正パルスを入れる
というようなことが書いてある。時間に関する記述は、デバイスによって違う。
で、出力がぶつかる可能性があるのは、
- (7) の期間中に、AVR が起動してしまって、プログラムが出力したとき。
たぶん、これだけ。AVR で 14CLK でリセットから抜ける高速起動の設定をして、できるだけ早くポートに出力するようなプログラムをわざわざ書くと 最大 1.2 ms だけ出力がぶつかる可能性がある。
ただ、(2) モードを一旦リセット としているので、ft232r0 を使った場合 ひょっとしたら設定が元にもどって mosi,sck が出力になっているかも知れない。デフォルトでも入力の ft232r1 なら関係ないはず。
電流制限抵抗について
出力がぶつかる可能性がある場合、sck,mosi に電流制限抵抗を入れた方が良い。
ただし、ブレットボードで組むような場合、へたに抵抗を入れて接触不良になったり抵抗自体がショートしたりして失敗する危険性を増やすぐらいなら、ダイレクトに接続したほうがマシ。
それでも安全性を少しでも求めるなら、抵抗入りケーブルを作ったら良いと思う。
さて、抵抗値は、どれぐらいが良いのだろう。
FT232R のデータシートを見ると、絶対最大定格は、24 mA だそうだ。AVR は、40mA ぐらい。ただし、1 つのピンのみに電流を流した場合。
出力がぶつかった場合、それぞれのデバイスの内部抵抗で電圧降下とかが起きると思うので、電圧差 = 電源電圧ではないはずだが、仮に 3.3V の電圧差で 24mA 流すとすれば、138 Ω。5.0V なら 208 Ω。
一応 220 Ωを入れとくのが安全とは言える。ただし、抵抗値が大きいと波形が鈍り、高速クロックに対応できない場合が出てくる。
どれぐらい鈍るかについては、入力側にコンデンサがあって、電流制限抵抗 とコンデンサで RC ローパスフィルタになっていると考えれば良い。
コンデンサの容量がいくつか分からないのだが、仮に 10 pF だとして 電流制限抵抗 が 100 Ωだとすると cut-off 周波数は 160 MHz 。 220 Ωなら 72 MHz 。この 1/10 以下なら安全? ビットレートは デフォルトが 0.230 Mhz , 最大でも 0.460 MHz なので 220 Ωでも まぁ問題なさそう。
- ちなみに、74HC シリーズの入力容量は、5 pF 程度だそうだ。AVR ではよくわからないものの Mega88PA の TWI の 入力容量は、最大 10 pF だそうだ。
ビットレートについて
新品の AVR をはじめてつかう場合、-B 4800 として ビットレートを 4.8 KHz にした方が良い。.... としている。
それについての考察。シリアルプログラミングでは、CPU クロックの
(訂正) HI/LO とも 2CLK 保証しないといけない = 3CLK 必要 。
デフォルトのビットレートは 230K Hz で、CPU クロックが 1MHz 以上なら問題ない。最近の普通の AVR は、8 MHz 内蔵 RC クロック + 1/8 分周 で、一応条件を満たすはず。
ただ、以前 これを作ったとき テストに ATtiny2313V を使ったのだが、全然ダメだった。クロックをだいぶ落として認識できた覚えがある。
Tiny系 には、128 kHz 内蔵 RC クロックがある。 これに設定してしまうと 32 KHz が最大のビットレートになる。忘れてしまったが、Tiny2313V がダメだったのは、これに設定されていたからかも。
こういうことがあるので、よくわからないものを使う場合、サポートしている最低のビットクロックである 4.8 KHz に設定するのを推奨している。
- ATmega168P を 試してみた。
新品の状態では、内蔵 8MHz 1/8 分周 = 1MHz 。最近の AVR は 1MHz が多いので 標準的な 周波数。
この場合、デフォルトの 230400 (Hz) では動作しなかった。115200 もダメ。動作する最高の ビットレート は、 76800 だった。
1/8 分周 しないようにヒューズビットを書き換えると、 460800 Hz でも OK 。
-B 4800 は、ちょっとひどすぎるかも知れない。これからは、-B 76800 を推奨しよう。
ところで、1MHz でも -B 76800 だとすれば、128KHz 1/8 分周 = 16 KHz ではどうなるのだろう? 比率だけで判断すると、-B 1200 。04e では、そこまでビットレートを落とせるようにしてある。
(追記) -B の値について
-B は、SCK の周波数のつもりで設計しましたが、実際の(最大の)周波数は、もっと高い値のようです。
(ちなみに、平均の 周波数 は、-B の値 前後です)
最大周波数は、おそらく -B の値の 4/3 です。
-B の値 最大周波数 AVRの最低周波数(x6)
76800 102.4 KHz 614.4 kHz
115200 153.6 KHz 921.6 kHz
-B 115200 が AVRの最低周波数 をクリアしているのに動かない理由は、AVR内蔵オシレータの精度の問題と、えるむ:AVR内蔵オシレータのジッタの問題の 2 つの要素があるためだと思います。ジッタのため、随分(20-30% ?) CLK パルス幅が変動するようです。
追記:avrdude-serjtag04e.zip
- 変更点:
- 最低ビットレートを 1200 Hz に引き下げた。
- ISP に入るときの手順を厳格化
- led 制御を入れてみた。
次のように指定すると 機能が使えるようになる。ただし、PIN番号には、0 (D0 / TXD ) は指定できない。
buff = PIN番号;
rdyled = PIN番号;
pgmled = PIN番号;
- rdyled の制御は、初期化すると 入力(Hi-Z)→L になる。終了時 RESET を H にする指定(-E reset)で 入力(HI-Z)。noreset (デフォルト)の場合は L のまま。
- pgmled は、FLASH の upload 中 L 。終了で、入力(HI-Z) 。
プログラムをアボートさせた場合、点等したままになる場合があるが、RESET を H にする指定(-E reset)で消灯できる。入力(HI-Z)。 - LED は L で点灯。通常
VCC(3.3V) - 電流制限抵抗 - LED - LEDピン
とする。VIO が 3.3V 〜 5V の場合、問題はない。電流制限抵抗は、270 Ω。Vf が高い LED を使用するときは、より小さくても良いが、6mA 程度で設計すること。
VIO は、1.8V まで下げられる。この場合 電圧差が 1.5V ある。課赤LEDでも Vf は 1.7V なので LEDピンを通して VIO に電流は流れ込む問題はないはず。... だが一応は、より Vf が高い LED を使用するのを推奨しておく。
buffer を入れたい場合、rdyled を VCC(or VIO) にプルアップして、buffer 制御に使用できるよう設計した。( buff = PIN番号 は、別の用途に使用するので 使えない )
PIN番号 の指定には、8-11 が指定できる。8(CBUS0) .. 11(CBUS3)
の意味。
CBUS を使うためには、MProg で CBUS の設定を I/O に変更する必要がある。CBUS は、終了時に自動的に入力(HI-Z)になるようだ。
設定しなければ、なにも起きないので、デフォルトで CBUS2 に rdyled を割り当ててある。
(設定例:TX LED を TX & RX LED に変更して、RX LED を I/O mode に変更。ついでに CBUS4 を 12MHz のクロック出力に)
追記:avrdude の USBasp 改造について
最近 USBaspLoader を移植しているのだが、実に具合が悪い。
avrdude のオリジナルでは、必ず reset する。-- avrdude.exe を動かすたびに reset してアプリケーションを動かそうとする。
ライタの USBasp は まだ良い。USBaspLoader でアプリケーションを実行すると、必ず 手でリセットしなければならなくてとても面倒なことになる。
それが嫌ならば、ブートローダのスイッチを操作するようにするとかしなければならない。
... というわけで、デフォルトでは reset せずに -E reset を指定した場合のみ reset するようにした。
まぁ、気に入らない人もいると思うが、基本は自分用なので 強引に変更することにした。
気に入らない人は、WinAVR の環境に上書きせずに、avrdude.exe と avrdude.conf を avrdude-serjtag.exe と avrdude-serjtag.conf にリネームしてからインストールして欲しい。
追記: 書き込みできるデバイスについて(04e)
senshu さんが評価してくれました。
-- 90Sシリーズ
× AT90S2313(認識せず)
△ AT90S8515(ちょっと不安定)
〇 AT90S4433
-- Tinyマイコン
〇 ATtiny26L
〇 ATtiny2313
-- Mega
〇 ATmega88
〇 ATmega168
〇 ATmega328P
〇 ATmega644P
〇 ATmega128
もともと 128KB までの tiny/mega シリーズしか意識していなかったので、90S シリーズの結果はやむなしという所です。
ですが、動いたり動かなかったり、惜しい所までは行っている模様。
古いソースを見てしまいました。間違い。
senshu さんの指摘どおりで、古いデバイスでは、同期が取れない 場合 1 bit づつずらして 32 回までリトライせよと データシートに書いてあります。(新しいデバイスは RESET からやり直せば良い)
一応作ってみた → ft245r.c 。
90S シリーズも OK になったそうです。
というわけで 暫定リリース → avrdude-serjtag04f.zip
- 変更点:
- AT90S2313,AT90S8515,AT90S4433 に対応。
- -E reset の仕様変更 (bitbang モード自体もリセットする)
→ (windows 版では)シリアルが使用可能に (senshu さんの改良)
注意点: パッチと avrdude.exe を差し替えただけ。バイナリも動作未確認。
追記:avrdude-serjtag04g.zip
こちらの環境(Windows XP, Linux) でテストしてみたところ 問題なさそうなので、暫定リリース。
変更点 (avrdude-serjtag04e.zip から)
- AT90S2313,AT90S8515 など古い AVR の対応
- flash/eeprom の read のバグ修正
- flash/eeprom の read の高速化
- eeprom の write の高速化
- LatancyTimer を デフォルトから 2ms に変更
- pagewrite はあきらめ、コード削除
以上 senshu さん とのやりとりで修正 (コメント参照)
-B オプションについて
-B 38400 での 16KB の読み込み でテストすると
ft245r: bitclk 38400 -> ft baud 19200
という風に 19200 bps を設定しています。マニュアル通りならば 19200 x 16 / 2(H/L) = 153k bps になるはずですが、実際にやってみると
- Windows XP 16.67 秒
- Linux 16.39 秒
となります。1 バイトの読み込みに 4 バイト分 32 クロック必要なので、平均クロックは
16 * 1024 * 32 / 16.67 = 31450 (Hz)
ということになります。-B 4800 とすると 4800 bps にかなり近い値になるので、マニュアルのほうが間違っていると判断しています。
追記: 上にも書きましたが -B は、低速での平均クロックの目安です。実際の ビットクロックは、
-B の指定値 x 4/3
だと思われます。また、内蔵 RC 発信器を使用する場合は、ジッタのためかなりのマージンを取る必要があります。
追記:avrdude-serjtag04l.zip (2011/06/14)
pgmled を CBUS に割り当てると動作しないというバグレポートがあり修正。
バージョン番号が飛んでいますが、04f - 04k までは、USBasp の改造が主で ft245r には修正がありません。
その間に関する記事は、『Teensy(1.0)互換ボード』『TPI/PDI』『AE-UM232Rピン互換ボード』あたり。
紹介すると、自作 ATMEGA32U2/ATMEGA32U4 ボードで USBasp プロトコル を拡張した ライタを作っています。 USBasp プロトコル 対応 のブートローダも作成済み。USBasp プロトコル の拡張は、XMEGA の PDI と TINY10 の TPI に対応したこと。ライタ側の ファームウェアは、あと一息で完成というところで放置状態になっています。
04L では、この USBasp プロトコル 拡張が 入っています。
修正したのは、次の機能。この機能を使わないならば、影響はありません。
rdyled/pgmled 次のように指定すると 機能が使えるようになる。
rdyled = PIN番号;
pgmled = PIN番号;
PIN番号の割り当て
# FT245R FT232R
0 D0 TXD
1 D1 RXD
2 D2 RTS
3 D3 CTS
4 D4 DTR
5 D5 DSR
6 D6 DCD
7 D7 RI
8 - CBUS0
9 - CBUS1
10 - CBUS2
11 - CBUS3
(注意)rdyled/pgmled は 0 (D0 / TXD ) を指定できない。
この機能の定義を次のように変更し、PIN番号の割り当ての条件も変更します。
rdyled :
ライタを 操作すると 点灯。(点灯中は、シリアルが使えません)
-E reset で 消灯。(シリアルが使える状態)
D1 - D7 を割り当てた場合 書き込み中 消灯(点滅します)
pgmled:
D1 - D7 を割り当てた場合 書き込み中 点灯(点滅します)
PIN番号の割り当て:
rdyled : 1-11
pgmled : 1-7
信号の操作:
点灯: L
消灯: Hi-Z
(注意) 仕様が変わったので、rdyled は、buffer 操作には使えなくなりました。FT232R/FT245R の場合 VccIO(VIO) を使うことで、1.8V 〜 5V まで対応できるので外付け buffer は不要なはずで、外付け buffer を使う人はいないと考え、非互換は気にしないことにしました。
仕様を変えたのは、1 つの LED で rdyled と pgmled の役割を果たすためです。D0-D7 のうち 通信に 3 本 / ライタに 4 本 使うとして 1本だけ空いています。
"diecimila" の設定を使うなら
# FT245R FT232R
2 D2 RTS
RTS が空いています。これに LED を付けることを想定しています。M_Prog/FT_Prog の設定なしに使えるので、お勧めかも。
追記:avrdude-serjtag04m.zip (2011/06/18)
pgmled の 定義変更 : アクセスランプ ということにした。
pgmled/rdyled を 1-7 (DBUS) に割り当てたときの操作を L(点灯)/H(消灯)とした。
(-E reset での終了時は Hi-Z にするのは従来通り)
詳しくはコメント参照。
追記:avrdude-serjtag04n.zip (2011/06/24)
テスト版(動作しないかも)
内部の delay を ft232r_delay で実装。delay 中は、pgmled 点灯 (コードは点滅 だが周期が長すぎて 点灯で終わる) (6/24 バグ修正)
read/write 中は pgmled 点滅 (page mode がある AVR のみ)
write のロジック変更 (USE_INLINE_WRITE_PAGE enable)
FT232H/FT2232H 向けにチューニング。(6/24 新規)
FTDI のドキュメントを見て、1 回に Write する単位が重要だと分かったので対応。
まず 12 Mbps の FT232R は、62 バイトの整数倍が良いらしい。いままで 512B としていたところを (62 * 4) に変更。
FT2232H では、FIFO が 4KB あり (62 * 64) = 3968 の整数倍が良いらしい。あまり大きくとるのもどうかと思うので、バッファを 3968 バイトにすることにした。
ちなみに、FT232H は、1KB 。記述はないが (62 * 16) の整数倍だろう。FT2232Hと区別しないでも問題ない。
別件で FT2232H の テストをしたところ 最大 2.3 MHz の平均ビットクロックになった。 512B 単位だと 最大 0.55 MHz だった。 使用できた帯域は、480 Mbps に対して 76 Mbps (2.3 M x 32 x (64/62)) ほど。
もっと高い性能を出すには、FT_SetUSBParameters() を使って InTransferSize を 64KB にまで大きくして、1 回の Write サイズも (62 x 64 x 16) にすれば良いらしい。ただ、 AVR で 2 MHz 以上のビットクロックは無用 なのでそこまではやっていない。
追記:PDI サポートの可能性
どうも avrdude-5.8 は、PDI をサポートしているようだ。avrdude.conf に XMEGA の 定義がある。
コードさえ書けば、avrdude-serjtag で PDI をサポートできるかも知れない。
ただ、PDI は、信号線である PDI_DATA が 双方向 になっている、Synchronous BitBang は 入出力の切り替えが遅いので、どうしようと思っていたのだが ... PDI には、REPEAT 命令があって、同じ操作を N 回繰り返すことができるらしい。-- FLASH の読み書きなどでは、入出力の切り替え を頻繁にしなくても良いように設計しているような気がする。
それであれば、なんとかなりそう。
ちなみに、PDI では、ISP のソケットは 普通の AVR とおなじものを使う。接続は、reset = PDI_CLK, miso = PDI_DATA , mosi と sck は NC 。
あと、クロックパルスが約 10kHz以下になると自動的に PDIモードを終了するらしい。連続して操作する場合は問題ないと思うが、ターミナルモードとかだと、接続しなおさないとダメ。なんか処理が面倒そう。
PDI のことをちょっと調べた。
まず、基本は、 startbit=1,dara 8bit, parity even 1bit, stopbit=2 でやりとりする。シリアルと違うのは、クロックが必要なのと、入出力が 1 本なこと。あと、パリティも 普通とちがうところがちょっとあるらしい。
LD で データの前に、0xDB(P=1) が来る場合がある。そのときは、読み飛ばす。REPEAT 命令だと、命令毎に 0xDB(P=1) が来る場合も。
で、コマンドを送ってデータを受け取るようなやり取りをするわけだが、コマンドは 8 種類ある。
4bit 2bit 2 bit
LDS 0x00 | addrwidth-1 | datawidth -1 | 直接アドレス指定
STS 0x40 | addrwidth-1 | datawidth -1 | 〃
LD 0x20 | ptr | datawidth -1 | 間接アドレス指定
ST 0x60 | ptr | datawidth -1 | 〃
LDCS 0x80 | | cs |制御レジスタ指定
STCS 0xc0 | | cs | 〃
REPEAT 0xa0 | | datawidth -1 |
KEY 0xe0 | |
ptr: 0 *(ptr), 1 *(ptr++), 2 ptr
cs: 0-2 register N
KEY は enable にするための命令。あとは、LDS(STS), LD(ST) で空間を読み書きする。この空間のなかに、NVM という装置があり、 間接アドレス指定用の ptr も NVM の中にある。NVM のアドレスは、0x01c0 。制御レジスタは PDI 自体を制御するためのもので LDCS(STCS) で読み書きする。
制御レジスタの#2 には、GUARDTIME がある。送受信の切り替え時に挿入するクロック数で、制御のしかたによっては、先ずこれを設定しないとマズい。
USART で使う場合は、XCK を常に出力しておいて ... 送信が終わったら、(必要なら)受信に切り替える。GUARDTIME を大きな値にしておけば、タイミングの制御が楽になる。
逆に、BitBang のような処理だと、startbit 検出しないといけないのでかえって面倒。
NVM: base addr 0x1c0
+0 ADDR0
+1 ADDR1
+2 ADDR2
+10 CMD
+11 CTRLA
+12 CTRLB
+15 STATUS
+16 LOCKBITS
ポインタは、NVM の ADDR0-ADDR2 レジスタ。ここに STS で書き込むこともできるが、普通は ST で ptr(2) を指定して書き込むのだろう。あとは、LD(ST) の *(ptr++)で連続領域の読み書きができる。
REPEAT 命令は、REPEAT, 繰り返し回数-1, 命令, を送った後、 繰り返し回数 だけデータの送受信をする。ただし、NVM の CMD に適切な値をセットしないといけない。
こんな感じ。
さて、初期化のシーケンスについて
- 初期状態は、clk = H, data = H 。この状態を数クロック分?保ち、clk を 16 回(以上?) ↓↑する。
これで、制御レジスタにはアクセスできるようになるらしい。 - STCS 1 + 0x59
CPU を RESET 状態にする。(= 止める)。 - STCS 2 + 0x07
GUARDTIME を 0 にする。 - KEY コマンド + 0xFF 0x88 0xD8 0xCD 0x45 0xAB 0x89 0x12
NVM を enable (?) 。
これを一気に送ってしまえば、良い。
シグネチャ読み出し。
avrdude.conf に
memory "signature"
size = 3;
offset = 0x1000090;
;
なんて定義があるので、それを見て、LD すれば良い。定義には、
memory "eeprom"
memory "application"
memory "apptable"
memory "boot"
memory "flash"
memory "prodsig"
memory "usersig"
memory "signature"
memory "fuse0"
memory "fuse1"
memory "fuse2"
memory "fuse4"
memory "fuse5"
memory "lock"
がある。読み出すのは簡単で、REPEAT + LD を使えばいい。
書き込みはちょっと面倒。PAGE 分書いたら、なんか操作しないといけない。
こんな感じだから、作るのにはそれほど苦労しなくて良さそう。
XMAGA64A4 を共立で買って対応してみようと思う。