2007年12月22日土曜日

NetBSDでEmobile D02HWを使う(1)

イーモバイルD02HWが手元に来たので、NetBSDで動かせるようにしてみた。今回はそのあたりの話を書いてみることにする。
D02HWはD01HWとほとんど同じハードウェアで、HUAWEIE220のOEM製品である。今回も手をつける前にとりあえずgoogleとかしてみると、動いたとか動かないとかどうも歯切れがわるい。NetBSDの場合ではcurrent-usersという最新版の開発ブランチのkernelに関する話題を扱うメーリングリストがあるのだが、いくつかのスレッドがあった割には実際のコードには反映されていない状態だった。
まあ、手元に実際のデバイスがあるから、と手をつけてみることにした。

D02HWはUSBのHSDPAモデムだが、モデムの機能の前にデフォルトではUSBストレージデバイスとして認識されるようになっている。たとえば、なんの設定もしていないNetBSDではumassデバイスとして認識・アタッチされて、CDROMとして中身をmountできるようになる。中身はwindows用のデバイスドライバ群で、NetBSDでモデムとして使おうとして思っているときには何の役にもたたない。差し込みのたびにumassとして認識されるのもうるさかったので、まずそのへんをdisableする。umassのdevice driverはsys/dev/usb/umass.cあたりにある。中身をざっと見てみると特定のデバイス毎の特別な設定を書くためのhookが用意されていて、sys/dev/usb/umass_quirks.cに追加できるようになっている。今回は単純にattachされないようにするだけなので、Static const struct umass_quirk umass_quirks[] = {の中に

{ { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 },
0, 0, 0, 0, 0, NULL, NULL
},

というエントリーを追加した。これで、USBのベンダIDがHUAWEIでプロダクトIDがE220のデバイスはUSBストレージデバイスとして認識されなくなる。NetBSDでは、専用のドライバが存在しないデバイスはugen(汎用USBデバイス)としてattachされるので、umassをdisableすると次からはD02HW(E220)はugenとして認識されるようになる。

このあたりでugenとして認識されたD02HWをユーザーランドからlibusbをつかってなんか操作できないかと、数時間時間を費やしてみたが、得たものは

  • NetBSDのlibusbはugenとして認識されたデバイスしか触れないということを認識
  • libusbを使った基本的なプログラムの書き方と経験
だけで、今回のデバイスドライバつくりに特に役に立つことは(その時点では)なかった。今思えば、あの段階でうまくugen&libusbを使うことで不明なUSBのコマンドを探すような場合に役にたつかも、と思えるようになったので、まあ費やした時間は無駄ではなかった(ことにした)。

と、ここからが本題となる。まずは先人達が到達したところまで追い付かなければならない。ベースとなっているUSBシリアルドライバはubsaドライバ(sys/dev/usb/ubsa.c)なので、このドライバがD02HWのドライバとなるように、Static const struct usb_devno ubsa_devs[] = {


/* HUAWEI E220 / Emobile D0[12]HW */
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 }

と追加する。この段階でkernelをつくってD02HWを接続すると

ubsa0 at uhub0 port 2
ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2
usbd_set_config_index: illegal index
ubsa0: failed to set configuration: INVAL

と表示される。確かに問題がある、というところで概ねこのデバイスを触る準備が整った気になる。ちょっと一休み。

具体的な料理の方法は次のエントリーで説明する予定。

0 件のコメント: