1 post tagged “usb driver”
EM-ONE用に作ったCommクラスドライバが不安定な件のメモ。
速度の出ない件は、各パイプのバッファを増やしてやればOKです。
WZERO3版は64バイトとかになっていますが、カーネルにマップされるメモリですので
ページサイズを超えなければそれほど無駄ってことはないでしょう。
EM-ONEはUSBのコンフィギュレーションフェイズで64KB寄越せと言って来てますので
この通り与えてあげましょう。
これに伴ってリングバッファも128KBとかに増やします。
これが少ないとReadのI/O要求の際にバッファがあふれ、その結果、
カーネルスレッドを作って待つという動作をします!
128KBあればまず溢れません。
厳密な割り込みではありませんので遅延される可能性があり、
しゃれにならないくらい遅いマシンだとひょっとすると溢れるかも知れない。
(そうはいっても高々3.6Mbps程度ですので・・・)
現状、溢れた際のコードはまったくいじっていませんが問題になるようなら、
コマンドキューに突っ込んで処理を遅延させるように書き換えようかと。
途中でだんまりを決め込む件(=カーネルパニックの原因?)についても原因は解明。
Write要求の際の処理がまずく、Writeがエラーを起こし内部バスへのアクセスがタイムアウトしています。
Writeするデータ長がページサイズ(64KB)で割り切れると、0バイト書こうとしてやばくなります。
これはゆりこさんのドライバでは起きないと思われます。
なぜならWriteするバッファの大きさがページサイズよりも小さいので決して割り切れない。
そもそもここでページサイズにあわせる意図がよく分からないのですが
おそらくWZERO3で使われている頃から通ってない部分でしょうから
ここはざっくり書き換え中です。
忙しいので少々追いついてませんが土日くらいには更新版を出せるかも知れません。
I/O要求の終了ハンドラでまたI/O要求を出すところとか、一見するとかなり面食らうけども
どの道Gate経由なのだからこういうテクニックなんだろうと割り切って
あまり大きな変更はしない予定。
ただしIOUSBPipeのAPI周りは新しいIOKitの仕様に合わせて書き換え済み。
Read/Write/GetStatusをタイムアウト付きバージョンに書き換えるとか。