2007年12月10日

usb162-0.1

いままでのコードは、とりあえず動くことだけを目指したものだった。そろそろ動いてきたので、リリースに必要だと思う変更をして version 0.1 として usb162-0.1.tar.gzを公開する。

ライセンス

とりあえずライセンスは、GPL にした。もっと自由に使ってもらえるライセンスにしたいとも思ったのだが、全部を自分で作ったわけでもないので、無理かも知れない。

それ以前に、勝手に AVR-CDC の ID を使用している。まずいかも。

構造の変更

いままでのコードをベースに、できだけきれいな構造にした。



desc.h    -- デスクリプタ定義で使う define など
desc_cdc.c -- CDC 用 デスクリプタ定義

cdc162.h -- CDC の API 定義 (usbcdc_init など)
cdc162.c -- CDC の処理

usb162.h -- USB 一般の 定義
usb162.c -- USB コントロール処理

usbconfig.h -- 全体の定義



こんな感じ。ちなみに usb162 の処理は、(できるだけ)ディスクリプタ自体をみて処理をするようにしている。グローバルな定義の数を減らすのが目的。

ソフトリセット

実はこれが最も大変な話だった。いままで USB RESET がくると CPU もリセットするようにしていたが、EEPROM を使ったデバッグをしたりすることで、遅延が大きくなり Windows で認識されにくくなっていた。

そのため、USB RESET での CPU リセットをしないようにして、RESET の処理を作り直すことにした。

まだ変な気もするのだが、一応動いているので、とりあえず FIXしておく。

初期化のシーケンス(Windows XP)


aa aa aa aa USB RESET
aa aa aa aa USB RESET
80 06 00 01 GET_DESCRIPTOR (Device)
aa aa aa aa USB RESET
00 05 02 00 SET_ADDRESS
80 06 00 01 GET_DESCRIPTOR (Device)
80 06 00 02 GET_DESCRIPTOR (Config)
80 06 00 02 GET_DESCRIPTOR (Config)
80 06 00 03 GET_DESCRIPTOR (String)
80 06 02 03 GET_DESCRIPTOR (String)
80 06 00 03 GET_DESCRIPTOR (String)
80 06 02 03 GET_DESCRIPTOR (String)
80 06 00 01 GET_DESCRIPTOR (Device)
80 06 00 02 GET_DESCRIPTOR (Config)
00 09 01 00 SET_CONFIGURATION
a1 21 00 00 COMM_GET_LINE
21 22 00 00 COMM_SET_CONTROL


初期化のシーケンス(Linux 2.4.31)


aa aa aa aa USB RESET
aa aa aa aa USB RESET
00 05 3b 00 SET_ADDRESS
80 06 00 01 GET_DESCRIPTOR (Device)
80 06 00 01 GET_DESCRIPTOR (Device)
80 06 00 02 GET_DESCRIPTOR (Config)
80 06 00 02 GET_DESCRIPTOR (Config)
00 09 01 00 SET_CONFIGURATION
00 09 01 00 SET_CONFIGURATION
21 22 00 00 COMM_SET_CONTROL
21 20 00 00 COMM_SET_LINE


Windows は、まずは GET_DESCRIPTOR を行って、エンドポイントのサイズを取得する。その後 いったん USB RESET を行ってから設定に入る。Linux では、GET_DESCRIPTOR を行わずに SET_ADDRESS し、それから 8バイトで GET_DESCRIPTORを行い、エンドポイントのサイズを知り、再度取り直している。Linux がなぜ 2回 SET_CONFIGURATION をしているのかはまだ判らない。

POWERON RESET そのものや、EEPROM の 初期化をしているので、USB RESET は最初に1回来るのはやむを得ないのだが、2 回目の理由はわからない。Linux の dmesg を見ると、SET_ADDRESS を投げているはずなのだが、USB162 側は認識していない。

EEPROM_DEBUG を undef するとレスポンスが速くなってエラーなしに接続できているようだ。でも情報が取れないので正確なところは判らない。


サンプルプログラム

サンプルはいままでどおり echo するだけの test1.c と 定期的にサンプリングする test2.c の2つ。それぞれの性能を測定するプログラムを perf/perf_test.c と perf/perf_test2.c に付けている。

おわりに

実用として使えるプログラムは、まだない。いままで Windows の性能ばかり書いて Linux の性能を書いていないことも関係するのだが、Linux(2.4.31) の ACM-CDC ドライバの性能がすごく悪い問題がある。

そもそも AT90USB162 を使う理由は、高速なものが作れることを期待したため。高速でなければ、AVR-CDC でも良いわけだ。そういうわけで、Linux でも高速に使えるものでなければ、実際の装置を作る気がしない。

次のステップは、Linux の ACM-CDC ドライバの性能がなぜ悪いのかを調べててチューニングする。その結果 速くなれば、CDC を使った実際の装置を作ろうと思う。そうでなければ、速くできる方法を探すつもり。
posted by すz at 23:57| Comment(0) | TrackBack(0) | USB162
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30760433
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック