- Next »
- « Previous
メモ:USBドライバの問題
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をタイムアウト付きバージョンに書き換えるとか。
Comments
急いで公開します。
ドライバ側の問題でPPPコネクションが切れてしまう問題は回避できたのですが
それでも(おそらくは)EMONE側の問題でもっと根の深い、PPPは生きてるけど通信不可の状態になる問題があります。
この状態はドライバ/カーネル的には完全にエラーでない状況なので
うまく扱う方法がなく苦しんでおります。
これ、たしかにWindowsでは起きないのですが僕の手元のWinマシンで試すと
高々1.4Mbps程度しか出ないせいのような気がしています。
もし2.5Mbps以上高速通信が可能で、Windowsでは問題ないという方
いらっしゃいましたら教えていただけると助かります。
僕のところだと、skypeとoperaを同時に使ってる状況でEM-ONE単体でも
起きたことがあります・・・。
調子がいいと2時間でも3時間でもいけるんですけどねー。
断線の症状がひどく、一度接続して何かを見た後に、また違うところ見ようとすると、既に断線しているという事の繰り返しで、一分の接続に耐えられない日々が続き、なんとかつながっても30分で切れてしまうという事があったのですが、これを回避する方法を素人ながらに考えました。
リンクが確定した瞬間に、iTunesのラジオを聞き続けるだけです。
ビットレートは一番低い24kbpsで。
今のところ3日ぐらいこの方法で試していますが、すべて6時間フルで繋がっています。
これもドライバがあってこそのことなので、本当にありがとうございます!!