ちなみに、TypeA はプログラム領域が余っていたのでプロトコルの追加で問題ないのだが、TypeB は、AVR910 プロトコルの部分を削らないと入らない...それはすでに USB910 とはいい難いのだが、typeJ44 として作ることにした。この、AVR910 プロトコルを削ってしまったものは、'S' コマンドが返すソフトウェア名を USB910B ではなく SERJTAG に変更した。
Linux での性能評価
同じバイナリ(usb910j44.hex) 4072 バイトの書き込みにどれぐらい時間がかかるか、評価を兼ねて調べてみた。
書き込み ベリファイ 実効性能(bps)
FT245R 版 (SERJTAG) 1.27 秒 0.27 秒 482607
USB910A AVR910 3.99 秒 1.41 秒
USB910A SERJTAG 7.00 秒 6.39 秒 20391
注)実効性能 は、バイト数 x 4 バイト/ベリファイ時間
これを見ると、SERJTAG が全然遅い。AVR910 での書き込みでは、2 バイトの送信 + 1 バイトの受信なのだが、SERJTAG では、4 バイトの送信になる。
また、ベリファイでは、AVR910 は、1バイトの送信と 2バイトの受信で 2 バイト読める。それに対して SERJTAG は 1バイトを読むのに、4 バイトの送信と 4バイトの受信が必要。転送性能が限界の場合 4 倍ぐらい遅くとも妥当ではある。
Windows での性能評価
Windows でも同じような傾向なのだろうか? FT245R 版 SERJTAG と一緒に Windows で評価してみることにする。
準備1: ドライバのインストール
FT245R 版を動かすにはドライバが必要。VCPドライバをダウンロードして展開しておく、ハードウェアウイザードが出たら、展開したディレクトリを指定してインストールする。
準備2:avrdude のビルド
avrdude もビルドする。前に 高速化 USB910 版を作ったが、それに SERJTAG のパッチを当ててビルドした。
さて準備はできた。同じ 4072 バイトのバイナリを書き込んでみる。
書き込み ベリファイ 実効性能(bps)
FT245R 版 (SERJTAG) 1.03 秒 0.73 秒 178498
USB910A AVR910 4.72 秒 1.66 秒
USB910A SERJTAG 2.66 秒 3.55 秒 36705
AVR910 は、Linux より遅くなったが、SERJTAG は速くなった。特にWrite は速く Linux AVR910 より速い。Windows では、転送性能には余裕があり、遅延が性能ネックだったことを示している。
FT245R 版については、書き込みが若干速くなったものの、ベリファイは 2 倍以上遅い結果になった。AVR のプログラマとしては問題ないぐらい速いが、JTAG Cable としては、速ければ速いほど良く Linux より 2 倍も遅いのは問題だ。
送信と受信が ずれ N の値は 10 にしているが、これをさらに大きくすればどうなるか調べてみた。
N
10 0.73 秒
20 0.50 秒
30 0.47 秒
40 0.41 秒
50
60 0.38 秒
70 0.31 秒
80 動作せず
10 から 70 まで増やせて、性能がゆるやかに上がっていく結果になった。しかし、0.27 秒に肉薄するほどの性能にはならない。
ドライバの設定をみてみることにする。デバイスマネージャからドライバのプロパティを開き、Port Settings の Advanced を開いて見ると ... Read/Write のバッファサイズは 4096 バイトで、Latancy Timer は 16ms だった。ちなみに N = 80 で動作しないのは、受信バッファが FULL になったためだろう。
Latancy Timer を 5ms にしてみる
Windows で遅いのは、遅延が原因なので、16 ms を 5ms にしたらどうなるか見てみた。
まず、書き込み時間が 1.03 秒 から 0.5 秒まで高速化した。
N
10 0.73 秒 0.44 秒
20 0.50 秒 0.36 秒
30 0.47 秒 0.34 秒
40 0.41 秒 0.34 秒
ベリファイ時間も短くなる。Timer を 5ms にするのは有効だ。ただし、N=30 程度で頭打ちになっていてこれ以上性能は上がらなさそうだ。
どうも遅延を短くすると、スループットが落ちる。良いところ取りはできないらしい。一般的にいってもそうだが、USB でもまたそうであった。
ソースコード
最新版 usb910-0.6.tar.gz と usb910-0.6.zip あと更新した serjtag-0.2.tar.gz と serjtag-0.2.zip
今回から、avrdudeのパッチと Windows 版 avrdude バイナリを同梱することにした。serjtag にも同じものを同梱する。
USB910-0.6 での変更点
o typeA SERJTAG プロトコルの追加
o typeJ44 サポート
(typeB ハードの AVR910⇔SERJTAG 入れ替え版)
o AVR-CDC のバージョンダウン
0.5 でバージョンアップしたが、不具合が出たので、
バージョンダウンして、パッチを notyet/verup.patch に
置くことにした。
o (AVR910) 初期化での SCK クロック自動変更をやめた。
初期化で SCK クロックを変更してたまたま動いても、
意味がないことがわかったのでクロックを妥当な値で固定。
222 kHz で 8M RC x 1/8 向け。(それ以下は危険。)
o avrdude-5.3.1 へのパッチの同梱(Windows 版バイナリも)
おわりに
FT245R 版 SERJTAG は、なかなか高速で良いものができたと思う。このプロトコル用に JTAG のソフトウェアをそろえていきたい。
まずは、DWM付録用を xilprg でなんとかして、あと玄箱の FLASH 書き換え用もなんとかしたい。ちなみに 玄箱用の JTAG ソフトであれば、OpenWinCE のJTAGツール を改造したものが実績がある。→ FLASH 書き換え成功 (MOTOUJTAG未使用)。以前FLASH を書き換えたときは、この記事を見て、某所から CVS 版を落として... 自作のシリアルJTAG変換ケーブルに対応させて... とやったのだが、ひょっとしたら今はもっといいものがあるかも知れない。