Posts
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をタイムアウト付きバージョンに書き換えるとか。
所詮このバージョンはfaked&faked。
トラブっても自分で何とかするしかなぁい!
というバージョンですが、3.6Mbpsに肉薄できる(であろう)USBのComClassドライバです。
カーネルモジュールなのでかなり危険ですが、お試しいただけるようであれば幸いです。
前出のモデムスクリプトも、drikinさんのご厚意によりアップローダを貸していただけました。
インストール方法は
1. モデムスクリプトをDLし、展開。 /Library/Modem Script 以下にコピー。
http://homepage.mac.com/koh/.Public/misc/EM-ONE%20GlobeTrotter%20Module%203G%2B%20Modem%20Script%20(fake).zip
2. USBドライバをDLし、展開後パッケージをインストール。
http://homepage.mac.com/koh/.Public/misc/EM-ONE_USB_Driver_ver01.zip
3. 再起動
となります。
既にモデムスクリプトを使用されている場合でも、最新にしたほうが色々良いことがありますのでお勧めします。
既に最新だよ、という方や他のモデムスクリプトを使うよという方は1 を端折って 3 も端折れます。
再起動したくない方は
sudo kextload /System/Library/Extentions/EM-ONE_ModemDriver.kext
でモジュールのみをロードすることが可能です。
微妙なのは、他の方が作成された/自分で作ったUSBドライバが既にある場合。
多分大丈夫と思うのですが何か問題ある場合はアンロードしてください。
アンロードは/System/Library/Extentions/の下の問題のkextを削除して再起動か
sudo kextunload /System/Library/Extentions/問題の.kext
となります。
削除する際はくれぐれもお気をつけを。
PPPも設定しちゃってください。
パスワードは隠蔽されてますが、ご存じemです。
ポート名が EM-ONE SHS01SH Modem Port と当たらずとも遠からずになっていますが、
これは僕が初期のバージョンのドライバでtypoをやらかした痕跡であって
別に
「SH01Sだっけ?S01SHだっけ?まぁ両方に付けておけばいいや」
と、のび太/のび犬的な発想をしたわけではありません。
普通は EM-ONE S01SH Modem Port と出るはずです。
(PPPの設定で問題が出たようですが、leopardでも動作するらしいです)
その他TIPS:
1. スピードが出ない場合
こちらで試したところ、早朝くらいに3.2Mbpsを記録しました。
EM-ONE側のバッテリが残り1レベルになると急速に速度が低下します。
これは仕方がないことでしょう。ACをつなぐと復活しました。
当然ですがアンテナレベルにも多大な影響を受けます。
個人的にはアンテナレベル3で、(2007年4/15現在。東京都23区。深夜-早朝)2.3Mbpsオーバーを納得のラインとしています。
速度をお望みなら、拙作のモデムスクリプトを使われたほうがよいと思います。
Windows版の設定に近いはずです。
2. 接続しているはずがパケットが来なくなる
実はUSBドライバ側では検出してないのですが、EM-ONE側の都合で接続が切れていることがあります。
system.logによると、しっかりネットワーク環境がlocalなものに切り替わっています。
しかしPPPは生きていて、ドライバにもイベントが飛んでこない場合があり、検出できていません。
地味に一番嫌な問題だと思ってるのですが、対処法がわかりません。
3. Macが不安定になった
カーネル空間で動作するモジュールですから、正直そういうことが起こる可能性もあります。
このモジュールは開発版で、何かよくないことが発生するとシステムログにエラーを吐きます。
cat /var/log/system.log | grep EM\-ONE
でドライバの吐くエラーを抜き出せます。
4. 接続が不安定
電波状況や電力状況によっては不安定になることがありますが、その場合
何が悪いのか少々切り分けが難しいです。
EM-ONE側が突然だんまりを決め込むこともしばしばあります。
現象は、突然データが来なくなり、ダイヤルアップを切断しても
「接続解除中」のままになる状況です。
これが一番悩ましい。
ドライバ的にはI/O要求を投げたまま終了待ちになっているのですが。
対処法としては、USBを一端挿抜することでReadのまま固まったI/Oをキャンセルし
復帰することが出来ます。
EM-ONE用のUSBドライバは、既に存在しています。
http://sourceforge.jp/projects/emoneusbmac/
USBで使う時にはこれを使わせていただいていたのですが
Windows版と比べてパフォーマンスが出ないのが悩みでして
BTと比べてもあまり違いがない。
せっかく線で繋いでるのだから、もっと出ないものか、と煩悶しました。
ただこちらのリポジトリにはソースコードがなく、Macで使えそうな
USBスニッファもよく解らないということで、Windows上でUSBドライバの挙動を追っていたのですが
これならなんとか作れそうだということで、自分でW-ZERO3のドライバをベースに書き換え
テストをしてみました。
結論は
Windows版でも1.2Mbpsを大きく超える値は見たことがないです。
何か間違っているんじゃないかと疑う程。
(emobileの名誉のために言っておくとCFスロット版は普通に出てるそうです)
まだ調整中なので細かい値は書けませんが、パフォーマンスが出ない第一の理由は
(endpoint毎のパイプの設定が違うとかではなくて)
どうやらカーネルにmapするバッファのサイズではないかと思っています。
そこを調整したらこのスピードが出るようになりました。
これが小さすぎると割り込みが激しくなり、CPUも食うしパフォーマンスも出ないという
悲劇的な事態を起こすのでしょう。
darwinのことは良く知らないのですけどページサイズ(おそらく64KBくらい?)を
超えるような設定しても副作用があるのかないのかが気になるところ。
まぁ、カーネルモジュールとして常駐する以上、小さければ小さいほうがいいのでしょうけど
極端に小さくてもメモリ管理的には影響がないでしょうから、
ページを超えないギリギリが望ましいのではないかと。
とはいえ他にロードしたいカーネルモジュールがあるわけではないので、パフォーマンス優先で
試しております。
しかしながらさすがに、このタイミングで妙なカーネルモジュールを配ってしまうのは
後々恐ろしいものがあるので、今回は「一報」ということで。
(emoneusbmacプロジェクトの方、もしこちらに気付かれましたらsourceforgeにソースを上げていただけると
非常に嬉しいです)
とりあえず、Macで使える良いUSBスニッファって何かないものですかねぇ。
久々のエントリです。
EM-ONEを買いました。
僕はMacBookProを持ち歩いているので、EM-ONEもMacで使いたい。
そもそもモバイル属性があんまりないので、モデムにならなきゃ嫌だと。
Macは一応EM-ONEの公式サポートに入ってないのですけど
モデムくらいなんとかなるだろうということで買ってきました。
http://fomausbosx.sourceforge.jp/ こちらのUSBドライバに含まれるモデムスクリプトを改造して
BTで使えるようにしました。
僕はMac使うようになって日が浅いのでありがたいことです。
ちなみに、データレートの設定とか、本当に正しいのかは疑問の余地があります。
何か不利益が発生しても僕のせいにしないでね。
本スクリプトは野良のものです。ご自身の責任のもと楽しんでいただければと思います。
/Libraty/Modem Scripts/ 以下に、次のテキストファイルを適当なファイル名でぶち込んでください。
Macをリブートするとそのファイル名が、モデムの一覧にそのまま現れますので
モデムっぽい名前を付けたほうがいいでしょう。
USBで使いたい人は http://sourceforge.jp/projects/emoneusbmac/ こちらも参考にどうぞ。
! ----------------------------------------------------------------------
! EM-ONE GlobeTrotter Module 3G+ Modem Script (fake)
!
! Based on FOMA USB for Mac driver (http://fomausbosx.sourceforge.jp/),
! thank you!
! ----------------------------------------------------------------------
@ORIGINATE
@ANSWER
note "EM-ONE GT3G+ Modem Script (fake) activated" 3
! serreset 230400, 0, 8, 1
! serreset 460800, 0, 8, 1
! serreset 576000, 0, 8, 1
! serreset 678500, 0, 8, 1
serreset 921600, 0, 8, 1
hsreset 0 0 0 0 0 0
settries 0
!
! Get the modem's attention
!
matchclr
matchstr 1 3 "OK\13\10"
! write "AT\13"
write "AT&F\13"
matchread 30
jump 101
!
! Setup the modem for the following:
! Reset to factory defaults (&F)
! Echo off (E0)
! Return result codes (Q0)
! Verbose responses (V1)
! Tone detection on (X4)
! DCD/DTR settings (&C1&D2)
! Detailed result codes (\V1)
! Flow control (+IFC=2,2)
! Turn off answering (S0=0)
!
@LABEL 3
matchclr
matchstr 1 13 "OK\13\10"
matchstr 2 101 "ERROR\13\10"
write "AT&FE0V1&D2&C1S0=0\13"
! remote peerの状況に依りそうだが、5秒は長い
! pause 5 -> 2
pause 2
matchread 90
inctries
iftries 3 101
!
! Reset the Modem on setup failure
!
DTRClear
pause 2
DTRSet
flush
! pause 90 -> 5 リダイアル規制は不要
pause 2
jump 3
!
! Originating a call.
!
@LABEL 13
ifANSWER 32
!
! If varString6 is set to 1, set up the phone to dial without
! confirmation of dialtone detection.
!
ifstr 6 19 "0"
matchclr
matchstr 1 19 "OK\13\10"
write "ATX1\13"
matchread 30
jump 101
!
! Dial
!
@LABEL 19
! Display the full dialstring contained in Varstring 1
note "Dialing ^1" 3
!
! Varstrings 7, 8 and 9, contain dialstring fragments
! Long phone numbers may need to be split into smaller groups
! for the modem to use
!
! Varstring 8 == blank (dialstring in varstring 7)
! Varstring 9 == blank (dialstring in varstrings 7 & 8)
! Otherwise (dialstring in varstrings 7, 8 & 9)
flush
ifstr 8 21 " "
ifstr 9 20 " "
!
! Write dialstring in varstrings 7, 8 & 9
!
write "ATD^7^8^9\13"
jump 32
!
! Write dialstring in varstrings 7 & 8
!
@LABEL 20
write "ATD^7^8\13"
jump 32
!
!
! Write dialstring in varstring 7
!
@LABEL 21
write "ATD^7\13"
!
! Parse the modem's response.
!
@LABEL 32
matchclr
matchstr 1 33 "CONNECT "
matchstr 2 80 "CONNECT\13\10"
matchstr 3 88 "RING\13\10"
matchstr 4 105 "NO CARRIER"
matchstr 5 105 "ERROR\13\10"
matchstr 6 103 "NO DIALTONE\13\10"
matchstr 7 107 "BUSY\13\10"
matchstr 8 109 "NO ANSWER\13\10"
matchstr 9 105 "RESTRICTION\13\10"
matchstr 10 111 "DELAYED\13\10"
matchread 700
ifANSWER 32
jump 101
!
! Determine the connection rate.
@LABEL 33
matchclr
matchstr 1 39 "2400"
matchstr 2 40 "4800"
matchstr 3 41 "9600"
matchstr 4 42 "14400"
matchstr 5 43 "19200"
matchstr 6 44 "1800000"
matchstr 7 45 "3600000"
matchstr 8 46 "7200000"
matchread 30
jump 80
!
@LABEL 39
note "Communicating at 2400 bps." 2
CommunicatingAt 2400
jump 81
!
@LABEL 40
note "Communicating at 4800 bps." 2
CommunicatingAt 4800
jump 81
!
@LABEL 41
note "Communicating at 9600 bps." 2
CommunicatingAt 9600
jump 81
!
@LABEL 42
note "Communicating at 14400 bps." 2
CommunicatingAt 14400
jump 81
!
@LABEL 43
note "Communicating at 19200 bps." 2
CommunicatingAt 19200
jump 81
!
@LABEL 44
note "Communicating at 1800000 bps." 2
note "Communicating at 1800000 bps." 3
CommunicatingAt 1800000
jump 81
@LABEL 45
note "Communicating at 3600000 bps." 2
note "Communicating at 3600000 bps." 3
CommunicatingAt 3600000
jump 81
@LABEL 46
note "Communicating at 7200000 bps." 2
note "Communicating at 7200000 bps." 3
CommunicatingAt 7200000
jump 81
!
@LABEL 47
note "Communicating at 64 kbps." 2
CommunicatingAt 64000
jump 81
!
@LABEL 48
note "Packet communication at 384 kbps down/64 kbps up." 2
CommunicatingAt 384000
jump 81
!
@LABEL 80
note "Communicating at an unknown rate." 2
note "Communicating at an unknown rate." 3
jump 81
! -- Normal exit after "CONNECT" --
!
! This modem has been setup to do CTS handshaking,
! and we assume that a CTS handshaking cable is being used.
@LABEL 81
! Turn on RTS/CTS handshaking.
HSReset 0 1 0 0 0 0
ifANSWER 87
!pause 30
pause 2
@LABEL 87
exit 0
! ----------------------------------------------------------------------
!
! Answer calls
!
! A RING result from the modem when in ANSWER mode claims the
! serial port and answers the phone.
!
@LABEL 88
ifORIGINATE 32
userhook 1
note "Answering phone..." 2
write "ATA\13"
jump 32
! ----------------------------------------------------------------------
!
! Hang up and reset modem
!
@HANGUP
@LABEL 90
settries 0
HSReset 0 0 0 0 0 0
!
! Escape from data to command mode
!
@LABEL 92
flush
pause 1
write "+++"
pause 1
matchclr
matchstr 1 96 "OK\13\10"
matchread 30
!
! Force a hangup
!
@LABEL 94
! IO-DATA USB-CFADPのCCLではflushなし
! HANGUP時に無限待ちするのと関係ある?
! flush
matchclr
matchstr 1 98 "NO CARRIER\13\10"
matchstr 2 98 "OK\13\10"
matchstr 3 98 "ERROR\13\10"
matchstr 4 98 "0\13\10"
! write "ATH\13"
write "ATH E1\13"
matchread 150
!
! Try to get control of the modem by toggling DTR
!
DTRClear
pause 5
DTRSet
flush
!
! Try the hangup sequence three times otherwise declare and error
!
inctries
! retry 3 -> 1
iftries 1 101
jump 92
!
! Pause between data and command mode
!
@LABEL 96
! pause 50 -> 10 長過ぎる
pause 10
jump 94
!
! Recall the factory settings
!
@LABEL 98
! pause 15 -> 5
pause 5
matchclr
matchstr 1 99 "OK\13\10"
write "AT&F\13"
matchread 30
jump 101
@LABEL 99
exit 0
! ----------------------------------------------------------------------
!
! Error messages
!
!
! Modem Not Responding
!
@LABEL 101
write "AT&F\13"
pause 10
exit -6019
!
! No Dialtone
!
@LABEL 103
matchstr 1 104 "OK\13\10"
write "AT&F\13"
matchread 30
@LABEL 104
exit -6020
!
! No Carrier or Error
!
@LABEL 105
matchstr 1 106 "OK\13\10"
write "AT&F\13"
matchread 30
@LABEL 106
exit -6021
!
! Busy or Delayed
!
@LABEL 107
matchstr 1 108 "OK\13\10"
write "AT&F\13"
matchread 30
@LABEL 108
exit -6022
!
! No Answer
!
@LABEL 109
matchstr 1 110 "OK\13\10"
write "AT&F\13"
matchread 30
@LABEL 110
exit -6023
!
! Delayed
!
@LABEL 111
note "DELAYED"
pause 20
exit -6008
! ---------------------------- ここまで -----------------------------
トラックバック張れないのかな、vox
http://blog.seesaa.jp/tb/37454534
==================
2007/4/10 追記
==================
あちこちに紹介されるにあたって多少まともにしました。
変更点は、
1. 設定を強めた
2. 接続速度が表示されるようになった
(ただしサーバーのリプライが3600000の時のみ・・・。マッチ文字列ってどうやって取るんだろう?)
3. デバッグ向けに多少ログを吐くようにした
4. HANGUPの時のATコマンドを多少弱めた
1について。
別に本物のシリアルポートじゃなし、Macに付いてるモデムを操作するんじゃなし、ということで
比較的いい加減に設定してきましたがちゃんと効いているようです。
あまり無茶なボーレートを設定するとカーネルに跳ねられるかと思ったのですが、
結構いけるようなので強めてみました。
BTで使うときにはあまり意味がないように見えるのですが、USB接続の際にはかなり効きます。
2はかなりいい加減な実装なので、常に「3600000bpsで接続」と表示され、却って苛立ちを煽る結果に
なるかも知れません。
PPPのピアから、一体どんな設定が帰ってくるのか不明でもありますし。
部分一致文字列を得る方法がわかればいいんですが、よく解りませんでして申し訳ないです。
4.はHANGUPの時にHコマンドを送っていたのですが、ただのモデムじゃないので少しビビッてしまい
&Fくらいにしておくことにしました。
(結局、Windows版と同じ設定にしてあります)
たまにEMONE側から切断されると、どうにもならなくなることがあるのですが、これは少し様子見です。
==================
2007/4/12 追記
==================
・Macがモデムの応答を待ち続けるバグの修正
・タイムアウト値の調整
モデム側の都合で切断されたとき、Mac側でバッファをflushしようとして待ち続けるバグが直りました。
これで切れまくってもストレスが低減されると思います。
以前のバージョンを使われている方がいらっしゃいましたら、更新をお勧めします。
EM-ONEのUSB接続では動作を確認しております。
Windows版と比べるとパフォーマンスが出ないように見えます。(BTではあまり違いなし)
多分USBドライバのバスプローブに秘密があるのでしょう。
(Com系のクラスだとISOかと思いきや、バルク転送が使われていたりする?)
CFスロットやPCI−eのe-mobileのモデムですが、動作確認された方いらっしゃいましたら
コメント頂けるとありがたいです。
今月は発売ラッシュです。
「超」怖い話 怪コレクション Vol.3 の校了が終わったと、
編集の加藤さんから発表がありました。
11/28日にはコンビニから売られるらしいです。
毎月に渡って発売されてきた怪コレクションはひとまずこれで完結となります。
これまで通りの傑作選とは別に、未発表の新作が何作も突っ込まれている模様。
超-1のフィルターが存在しないので非常に迷いましたが
僕もすべらない怖い話を、それもかなりイヤな話を5話セレクトして
投入させていただきました。
お楽しみいただければと。
2006/11/11 AM7:00。やっと一区切りを迎えました。
おめでとうございます。
本当に大変でした。
皆様、お疲れ様でした。
やはりこれを買わないようではいけないということで
実地の感触を掴むのも兼ねて有楽町ビックカメラに並びました。
前日、有楽町で飲み会をやった後、2時くらいから。
しかし現場は予想以上の大混乱と激しい雨で過酷な状況でした。
割り込む奴。騒ぐ奴。暴れる奴。店員の指示を理解できない奴。
列の先頭の方はかなりの割合を転売屋に締められていて
一触即発の状態。
パニックの恐ろしさといいますか、一歩間違えば将棋倒しがすぐ起きる恐怖といいますか、
あるいは単に東横線のような窮屈さといいますか。
死ぬかと思いましたが色々と勉強にはなりましたよ。ええ。
列は最初横4人ずつで余裕だったのですが、店員の「詰めてください」でほぼ崩れてしまいました。
横8人も9人もいます。
その状態で前も後ろも余白ゼロの状態ですから、列が一歩進むごとに将棋倒しの危険があるわけです。
さらに、狭い道に日テレのワゴンが止まっていたために、通行する一般車と行列は擦れ違えなくなっており
店員の「車通ります」の声のたびに悲痛な声が聞こえておりました。
一方で列の後ろのほうはかなり平穏だったようです。
ようやく買えたのが10時過ぎ。
販売開始から3時間が経過したころでした。
僕は割と先頭のほうだったので、まさかあれから3時間もかかるとは思ってませんでした。
そう、一つ学んだことは転売屋の方々はポイントカードを持っていないが
ポイントをもらわないとギャラが出ないということ。
つまり最初に転売屋の手先が並ぶと、列が異常に進まなくなるということです。
けが人が出なくて本当によかった。
いや、本当は目の前で殴りあいしてた奴がいたんですがね。
結局列に戻ったくらいなので、多分怪我まではしてなかったのでしょう。
・・・さて、非常に大変な目に遭って手に入れたPlayStation3ですが。
家に帰って起動してみると、感動も一入ですね。実感も沸きます。
今すぐ反省すべき点も多いですし、当初の理想とは違うかも知れないけれども
それは今後の課題と。
2年近くの長かった戦いがやっと(最初の)終わりを迎えそうです。
祝! PlayStation3発売!
ついに明日発売です。
コレやアレが明日の朝には一般家庭に届くのかと思うともうね・・・。
しかし・・・入手できるんですかね??
それからBDって本当にもう買えるの?
「超」怖い話シリーズ
怪コレクション vol2 が発売になりました。
発行日はもう少し先ですが、既にコンビニなどには出回っている模様です。
またしても献本が届かないのでまだ読んでないのですが・・・。
前作と併せてどうぞ。
http://www.amazon.co.jp/%E3%80%8C%E8%B6%85%E3%80%8D%E6%80%96%E3%81%84%E8%A9%B1%E8%B6%85-1%E6%80%AA%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-VOl-2-2/dp/4812429013/sr=1-4/qid=1161929887/ref=sr_1_4/503-8200634-1675137?ie=UTF8&s=books