D01NX の Zaurus ドライバ改良


EMOBILE が CF カードタイプ端末 D01NX の Zaurus 用ドライバを発表したので早速契約して試してみました。 通信に関しては問題なく、 移動体通信としては結構高速の thruput を得られてまずは満足です。 しかし、 唯一の難点は接続の際に失敗することが多いということです。 特に、 標準搭載の各種 Qt アプリから自動接続を行なおうとすると、 ほぼ確実に失敗してしまいます。
これは、 D01NX 用のデバイス /dev/ttyJACM0 が、 Qtopia の枠組から接続を行なう libusb.so というプラグインの想定外の挙動を行なう点に起因しています。

このプラグインは、 確保されたデバイスに対して pppd を起動させて接続を確立するまでを担っています。 ところが、 デバイス準備の完了を待たずに接続を開始し、 接続の完了を待たずに終了してしまいます。 このため、 カードを挿した直後でまだデバイスが準備出来ていないのに接続しようとして失敗したり、 もしくは接続が完了しないうちに制御を他のアプリに移してしまって通信エラーを誘発したりという不具合が発生するのです。
この libusb.so は Trolltech 社の Qtopia-free の一部である libdialup.so をベースにしており、 「KX-HA10 + KX-HV200でインターネット接続する (2)」というページで紹介されているのと同様の手法により、 デバイスを決め打ちにするという変更を加えただけのものです。 先日ソース (d01nx_dialup_plugin_src_Zaurus.tar.gz) が公開されたので改めて確認してみましたが、 それ以外の変更は全くありませんでした。
通常の通信用デバイスの場合は、 pppd による接続の際に途中経過を標準出力に出力させることが出来るため、 libusb.so もオリジナルの Qtopia プラグインも、 pppd からの出力文字列を確認することで接続の確立を確認しています。 ところが D01NX 用ドライバの場合は、 OS 非標準のデバイスを利用するために pppd からの出力が得られず進捗状況を確認出来ません。 また、 pppd が接続を確立させてから IP アドレスを得られるまでの時間が一般的な通信デバイスと比べて極端に遅いために、 通信の確立が通信準備完了を意味しないという問題もあります。

前者の問題に関しては設定ファイルの書換えで対応可能です。 D01NX 用のドライバをインストールしてマニュアル通りに接続設定を完了させると、 /etc/ppp/peers の下に USBxxxxxxxxxx というファイルが作成されます。 「xxxxxxxxxx」の部分は UNIX time を示す 10 桁の数字ですので適宜読替えて下さい。
このファイルを編集するのですが、 /etc/ppp/peers 自体が root がないと読めなくなっているので、 何らかの手段で root 権限を確保してからエディタを開いて下さい。 エディタを開いたら「updetach」という一行をどこかに追加するだけで、 pppd の出力を監視することが出来るようになります。 この設定変更だけでも、 接続したのに通信出来ないという支障はかなり減る筈です。

/etc/ppp/peers/USBxxxxxxxxxx:
updetach

後者の問題に関しては、 libusb.so 自体を作り直す必要があります。 しかも、 設定変更により前者の問題をクリアしたところで、 後者のタイムラグは予想以上に大きいので本質的な問題解決には至れないのです。
私はかねてから libdialup.so をベースにマイ libusb.so を作成して使っていたのですが、 libusb.so のソースが公開されたのを機にこちらをベースにマイ libusb.so を作り直してみました。 と言っても、 libusb.so ソースは殆ど libdialup.so と同じなので、 コメントとか改行コードとか直した程度なんですけどね。
ここでは取り敢えずオリジナル libusb.so からの patch (d01nx_libusb.patch) とコンパイル済のマイ libusb.so (libusb.so.1.0.0) を公開しておきます。 libusb.so は strip 済なのでオリジナルよりサイズが小さくなっています。 また、 ソースからのビルドには Qtopia-free-1.5.0 のソースと開発環境が必要になるので、 その辺は各自で用意して下さい。 リクエストがあれば ipk 形式も用意して構わないのですが、 EMOBILE 側がドライバの全ソースを公開していないので、 libusb.so 以外のファイルを含むパッケージは作成しづらいと思います。 どういうライセンスなんだか不明ですから。
私の変更分は継承性によって GPL の適用を受けますから、 これを EMOBILE (実際のドライバ開発は NetIndex) 側で勝手に採用して新ドライバとしてリリースしてくれれば十分なんですけどね。

さて、 この改良版では、 上記の問題を解消するために以下のような改良を加えています。

  1. /dev/ttyJACM0 という D01NX 用デバイスが作成されるまで待つ。 (但し 10 秒でタイムアウト)
  2. pppd を起動した後、 インタフェース「ppp0」が確立するまで待ってから終了する。 (但し 20 秒でタイムアウト)

尚、 ビルド済の libusb.so.1.0.0 をインストールする際には以下の点に気をつけて下さい。

  1. 以下の全作業は root 権限で行なう。
  2. /opt/Qtopia/plugins/network/libusb.so.1.0.0 を libusb.so.1.0.0.old に改名する。
  3. ビルド済の libusb.so.1.0.0 を /opt/Qtopia/plugins/network/ にコピーする。
  4. /opt/Qtopia/plugins/network/libusb.so.1.0.0 のファイルモードやオーナを libusb.so.1.0.0.old に合わせて変更する。
  5. Zaurus 本体を再起動する。

この改良版ドライバにより、 接続までにかかる時間が長くなってしまいますが、 オリジナルドライバは実際に接続が完了していないうちに接続したことにしてしまっているだけのことで、 実際に通信が可能になるまでの時間は変わりません。 また、 pppd の成否は見ていないので、 接続待ちが 20 秒でタイムアウトした後になって接続が確立することがままあります。 この場合は、 Qtoipa 的には接続に失敗したと見なされるので、 再接続を試みて下さい。
そもそもキャリアの検出に失敗して接続出来ないことが結構多いので、 その辺を改良しようとしたらモデムドライバの acm.o の方を直さないといけないんでしょうね。 この辺りはハードウェアにも依存するので難しそうです。 まぁ、 再試行すればいつかは繋がってくれるので、 今回の quick hack はここまでということで。


苦情・問い合わせはこちらまで。 shirai@unixusers.net

トップページ