小さな会社のプチシステム管理者をしている私は、社外での作業用にイーモバイルのD01NXを使っています。いつでもどこでも(でも都市部限定笑)必要な作業が快適にこなせてとっても重宝しているのですが、Windowsでしか動作しないのが玉に瑕。ザウルスでも動いてくれたら、ポケットに入るシステム管理環境が手に入って便利なのにな…と思うのですが、D01NX用のPDAドライバは全く出る気配がありません。半年以上経ってもWindows Mobile版すら出ていないので、ザウルス用ともなるともう望み薄々です。
いつものどおり『
ないものは作る!』と言いたいところですが、さすがに1からドライバの開発なんて無理…と半ば諦めモードに突入していると、自称『
外人にクレームをつけるのが得意』な
kenyaくん@試作が、何とElan社から直接ドライバをもらってきてくれました!すげ〜!
D01NXをLinuxで動かす(ためにがんばる人募集) ― Proto_Type001http://comomo.shacknet.nu/blog/154と言うわけで、びっくりするようなところから手に入ったD01NXのLinuxドライバ。こいつを頑張って動かしてみたいと思います。いきなりザウルスだと敷居が高すぎるので、まずはx86なLinuxで動くことを目指します。用意した環境はこんな感じ。
・InterLink MP-XP3210 (Celeron 650MHz / 386MB)
・Gentoo Linux 2006.1 (Kernel 2.6.22)まずは以下のサイトからドライバをダウンロードします。
http://www.elandigitalsystems.com/eng/drivers/vmb5000/vmb5k_usb_linux.tar.gzドライバをダウンロードしたら、
/tmpあたりに適当に展開します。普通に
make出来そうな感じだったのでやってみると、普通に怒られました。
# make
ci: RCS/Makefile,v: no lock set by root
ci: RCS/README.TXT,v: no lock set by root
ci: RCS/PROBLEMS.TXT,v: no lock set by root
make: *** [rcs] Error 1
RCSとやらでこけている様子。調べてみるとRCSはバージョン管理用のツールみたいです。う〜ん、とても開発中の香り。とりあえず今はバージョン管理など必要ないので、RCSディレクトリの中身を消してしまいましょう。
# for targ in `find . -name RCS`
> do
> rm -f $targ/*
> done
これでRCS問題は解消。もう一度
makeしてみます。するとこんなエラーが。(抜粋&改行追加)
CC [M] /tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.o
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c: In function 'print_queued_urb':
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c:112: error: 'struct urb' has no member named 'bandwidth'
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c:132: error: 'struct urb' has no member named 'bandwidth'
cc1: warnings being treated as errors
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c: In function 'vmb_probe':
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c:1491: warning: 'deprecated_irq_flag' is deprecated
(declared at include/linux/interrupt.h:66)
/tmp/vmb-driver-1.4/vmb_hcd/vmb_hcd.c:1491: warning: 'deprecated_irq_flag' is deprecated
(declared at include/linux/interrupt.h:66)
はてな?と思うが早いか、kenyaくんがさくっと調べてくれました。
ひとつめの"bandwidth"がどーたら、っていうのは、とりあえずデバッグコード
っぽいので一旦削除して逃げる。
んで、2つめのdeprecatedっていうのは、IRQまわりの定義が変わったらしく、
< retval = usb_add_hcd(hcd, irq, SA_INTERRUPT | SA_SHIRQ);
---
> retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
てなかんじでSA_*を新しい定義で置き換えればOK。
IRQ周りの定義は、コンパイルエラーにちゃんと出てきて、
include/linux/interrupt.hに明確に書いてあって、以下抜粋。
/*
* Migration helpers. Scheduled for removal in 1/2007
* Do not use for new code !
*/
#define SA_INTERRUPT IRQF_DISABLED
#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM
#define SA_SHIRQ IRQF_SHARED
というわけで、置き換えればOKとすぐにわかりました。
ちなみにbandwidthのエラーは、これまたinclude/linux/usb.h内に書いてある
struct urbの中に、
int bandwidth
ていうのがあったんだけど、新しいヘッダではその定義がなくなったようです。
それだけ。
さすがはミスターLinuxです。と言うわけで、教えてくれたとおりにプログラムを変更します。
ついでにカードの情報もドライバに記述します(全然ついでじゃないですね)。このドライバは何らかの開発ハード用のドライバと思われるので、そのままだとD01NXのドライバとして動作してくれないからです。この辺の話は
以前の話題に詳しいのでそちらを参照してみてください。
まずは
pccardctl ident。
PRODID_1="NetIndex"
PRODID_2="D01NX"
PRODID_3=""
PRODID_4=""
MANFID=c036,1003
FUNCID=254
続いて
modalias。私の環境では以下の場所に作成されていました。
/sys/devices/pci0000:00/0000:00:09.0/0.0/modalias
中身はこんな感じ。
pcmcia:mC036c1003fFEfn00pfn00paF2BA4352pb73BB32C2pc00000000pd00000000
この2つを元に、
vmb_cs/vbm_cs.cの中身を以下のように修正します。
static struct pcmcia_device_id vmb_ids[] = {
PCMCIA_DEVICE_MANF_CARD(0xc036, 0x1003),
PCMCIA_DEVICE_PROD_ID12("NetIndex","D01NX",0xF2BA4352,0x73BB32C2),
PCMCIA_DEVICE_NULL,
};
改めて
makeすると、無事ドライバが作成され、私の環境では以下の場所に配置されました。
/lib/modules/2.6.22-gentoo-r9/extra/vmb_cs.ko
/lib/modules/2.6.22-gentoo-r9/extra/vmb_hcd.ko
この状態でD01NXを差し込むと、自動的に
vmb_cs、
vmb_hcd、
cdc_acmの3つがロードされました。
/dev/ttyACM0も作成され、なんかうまく行ってそうな感じです。しかし
cuで接続しようとすると
cuがハングアップ。あとkenyaくんも
まとめに書いているように(そしてPROBLEMS.TXTにも書いてあるように)、カードの取り出しも
rmmodもうまく行きません。こうなるとドライバ自体をデバッグしていくしかないのですが、そのスキルがなくて止まってしまっているのが現在の状態です。
デバッグと言えば、このドライバは大量のデバッグコードが出力されます。しかしその止め方が分からない!ソースコード上で
pc_debug=0とすればデバッグスイッチはOFFになる(とREADMEに書いてある)はずなのですが、該当箇所を修正しても効き目なし。Makefileの
-DPCMCIA_DEBUGを外すとコンパイルすら通らなくなってしまうので困ったものです。まぁとりあえず動かすことが優先なので今はいいんですけど。
カードを刺してから抜くまでのデバッグメッセージを
ここに置いておきます。読んで理解できる方、大募集中です。個人的に気になった箇所を以下に抜粋しておきます。
cs: pcmcia_socket0: unable to apply power.
パワー足りてない?
cardmgr[4791]: unsupported card in socket 0
あんさぽーてっどかーど!!(涙)
pcmcia: request for exclusive IRQ could not be fulfilled.
pcmcia: the driver needs updating to supported shared IRQ lines.
ドライバ側でIRQ共有に対応してなくてうまく行ってない?
vmb_cs: index 0x35: Vcc 3.3, Vpp 3.3, irq 11, io 0x0100-0x0107, mem 0x60001000-0x60001fff
そうは言ってもIRQ11できちんと割り当てられているっぽい。
vmb_hcd vmb_hcd: new USB bus registered, assigned bus number 3
vmb_hcd vmb_hcd: irq 11, io mem 0x60001000
usb usb3: configuration #1 chosen from 1 choice
hub 3-0:1.0: USB hub found
hub 3-0:1.0: 2 ports detected
USBホストコントローラとハブを認識。
usb 3-1: new full speed USB device using vmb_hcd and address 2
usb 3-1: configuration #1 chosen from 1 choice
cdc_acm 3-1:1.0: ttyACM0: USB ACM device
USBの先にあるUSB ACMデバイスを認識。
そしてこれ以降ものすごい勢いでデバッグログが出現。
pccardctl ejectを実行。
pccard: card ejected from slot 0
API:vmb_remove(d4beb090)
vmb_hcd vmb_hcd: remove, state 1
usb usb3: USB disconnect, address 1
usb 3-1: USB disconnect, address 2
USBの取り外しまでは行ってるっぽいんだけど、何でハングしちゃうんだろ?
一緒に頑張ってくれる方、募集中です。
いつかはザウスルでも(もちろんLinuxでも)D01NXを!