スポンサーサイト

.-- -- スポンサー広告 comment(-) trackback(-)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

libusb for Windows

.22 2010 AVR-USB comment(0) trackback(0)
久々の自作AVRライタの話題です。FPGAライタを「FT245R + AVR」で作ろうと思ったのですが、そのAVRをとりあえずはWindowsで開発することにしました。
UbuntuだとISEがしょっちゅう落ちて面倒なのでとりあえずWindowsで動作確認をしたいからです。

そんなわけでlibusb for windowsの最新版を落としてinf generatorを起動するとなぜかフリーズ。
仕方がないので一つ古いバージョンを落として再チャレンジ。

infファイルを生成し、デバドラを指定してやると…
デバドラの設定ファイルは見つかったけどバイナリ本体が見つからないというようなエラーがでます。

生成されたinfファイルを良く見るとlibusb-$(version)/binに置かないといけないような感じだったのでもう一度そこに生成し、再チャレンジ。
漸くデバドラをインストールできました。

続いて、ubuntuで動いたライタ制御のソースコードを一部Windows用に変更してコンパイル。

謎のエラー。

typedef struct { ... } DEVICEDATA;

このstatementでエラーが出ていました。

よくわかりませんがDEVICEDATAという型はすでにどこかで定義されているようです。
適当に名前を変えたら通りました。

また、Windowsにはstat関数などがないようで、ファイルサイズを調べるのがちょっと面倒です。
これは想定外。

あとはsleepあたりをすこし弄ってWindowsへの移植完了。

適当にテストボード用に簡易Night Riderを作って動作確認完了。

書き込み速度は多分linuxのときと同じです。
gettimeofday関数がWindowsで使えないので正確な計測はしていませんが。
スポンサーサイト

AVRライタ汎用化(2)

.25 2010 AVR-USB comment(2) trackback(0)
試験前なのに何やってんだか…

とりあえずコードをちょっと整理してついでにtiny2313以外のデバイスにも簡単に対応できるようにしてみました。
(1行追加するだけで大抵のデバイスに対応できるはず)

で、せっかくMega328Pにも対応してみたので書き込んでみました。

6634byte(約6.5KB)の書き込み時間
WriteVerifyErase + Write + VerifyALL(デバイスリセット等を含む)
1141ms845ms2009ms2.5s前後
あれ?単純に4KB書き込みの時間に換算すると2000 * 4 / 6.5 ≒ 1230 < 1500で純正品越えてね?

と思ってよく考えたらデバイスによってページサイズが違い、ページサイズが大きいほうがページ書き込みコマンドを発行する回数が減るのでその分速くなるわけです。
(tiny2313(page size = 32byte)で2kB書き込みに930msでもmega328p(page size = 128byte)だと640msで完了した)

たしか純正品はページサイズ64byteのデバイスに4KB書き込むのにかかった時間が1.5secだったと思うのでMega88あたりで実験しないと比較にならないわけです。

まぁそれでも今の段階で純正品とほぼ同じ速度が出ていると思われます。

で、さらに高速化したいわけですが…

それは試験後にします。

とりあえず速度的に純正品に並んでいたという報告でした~

AVRライタ高速化(8)

.24 2010 AVR-USB comment(0) trackback(0)
前回の段階で2kB書き込みにかかる時間は983msでした。

今回はこれを高速化します。

まず、busy checkをライタデバイス側で自動的にやるようにしました。

その結果2kB書き込みにかかる時間は771msまで短縮されました。

さらにbusy checkの間に前に32byteデータを送るようにしてbusy checkの時間を短縮したところさらに640msまで短縮できました。

というわけで今の「Erase + Write + Verify」時間はこんな感じです。
WriteVerifyErase + Write + VerifyALL(デバイスリセット等を含む)
640ms258ms930ms1.3s前後
すべてあわせた書き込み時間が結構長いのはライタ検出、デバイス検出、デバイスリセットあたりがそれなりに時間を食っているからなんでしょうね。
正確な計測は次の機会に。

純正品との比較には「Erase + Write + Verify」時間を使っています。
ちなみにこの段階では純正品の80%程度(750 / 930)の速度が出ています。

純正品の速度まであと少しですがそろそろおとなしく試験勉強始めるのでしばらくAVRライタ高速化は凍結です。

AVRライタ高速化(7)

.21 2010 AVR-USB comment(0) trackback(0)
さて、手始めにrx bufferを32byteにしてみました。が、ほとんど速くなっていないようです。
本当にbuffer追加されたのか?ということで確認してみましたが、ホストからの32byte書き込みに対してNAKを返したら殺すというデバッグで一回も落ちなかったのでbufferの追加方法自体には問題なさそうです。
要するに内蔵bufferを大きくしても今の段階では効果が得られないということです。


ちょっとホスト側のコードを弄ってみたところほんの少し速くなったので今の速度を一旦メモします。
下表は約2kBのコードに対する時間をgettimeofdayで計測した結果です。(ALLはtimeコマンドでの計測。)
WriteVerifyErase + Write + VerifyALL(デバイスリセット等を含む)
983ms258ms1258ms1.5s前後
純正品は4kBに対してErase + Write + Verifyが1.5s程度とのこと。要するに今の段階では純正品の半分くらいの速度しか出ていないということです。
結局ネックになっているのはUSB通信のような気がするのでとにかくパケット量を減らす、もしくは1フレーム(1ms)で送る量を増やす等の工夫で速度がかなり変わる気がします。

書き込み完了待機の間に次の書き込みデータ32byteを送ってしまい、SPIバスとUSBのレイテンシをオーバーラップさせてしまうことで高速化(書き込み時間-30%くらい)できる気がしてきたのでそのうちやってみます。

AVRライタ開発再開準備

.19 2010 AVR-USB comment(0) trackback(0)
今日はなんとなくAVRな気分なので前回までの段階で、何ができて何ができていないのかを今一度整理してみたいと思います。
  • できていること
    • 一通りの書き込み、読み出し(Program Memory, Fuse)
    • Windows, Linuxのサポート
  • できていないこと
    • ライタAVR側で大き目のバッファを用意していないのでそれなりの速度(純正品の1/3)しか出ていない
    • ソースコードの整理
TODO:
  • avr-gccの出力ファイル(elf32-avr形式)をbinaryにobjcopyしてライタに渡す簡単なMakefileを用意する。これがあるだけで開発効率がかなり変わるはず。
  • 【優先度高】Device Resetに失敗する場合がある。全点灯プログラムのようにターゲットデバイスが書き込みに必要なポートに対してHを出力していた場合に確認された。
    • 修正済み。SCL = 1のときに/Rstを0にして書き込みを開始しようとした場合、失敗する。このときは一旦「ターゲットデバイス側から見て」最低2CPUclkだけRstを解除してやる必要があった。
      ターゲットデバイスを1MHzとするとライタから見て24clkなのでそこを修正したら直った。
  • 上記2点が完了したら高速化する。多分full-assemblyにして必要なスタックサイズの計算、SPI-busがidleにならないための最低限のbuffer-sizeの計算をする羽目になりそう。
  • 暇だったらソースコードの整理と将来的なメンテナンスのためのコードのコメントを書く。
週末までに終わらせてそろそろ試験対策でもしようかと。
 HOME 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。