USBドライバの移植…手も足も出ない…

カードサービスまではできたものの、その次、USB HCIのドライバを移植しようとしたのだが…
このUSB側の方が本体なのだが、どう手を付けたらいいのかさっぱり。
Kernel 2.4と2.6ではデバイスドライバのモデルが大きく異なるので、なんともならない。
ザウルス用のCF-USBカードのドライバのソースコードを見てみたら、こっちの方が素直そうな気がしたので、これをベースにVMB5000のハードウェアのアドレスとかを入れたらなんとかならんかな、と思ったのだが、そもそも、デバイスへのアクセス方法がまったくわからない。IOをmmapでマッピングするんだと思うのだが、ベースアドレスとかどうゆう風になってるんですかね?
うーん、まったくさっぱりわからん。
もう、ずいぶんとあきらめムードになってきた。
NetFront 3.0だと、Hotmailも開けないしなあ。
OpenZaurusかAngstrom+OPIEにしようかなあ。

カードサービスまではできた

D01NXドライバ(VMB5000ドライバ)のSL-C860向けの移植、とりあえず、カードサービスとして登録できるところまでは確認されました。
イー・モバイル純正のドライバ(SL-C3000など用)をインストールあとに、作成したモジュールを、/lib/modules/2.4.18-rmk7-pxa3-embedix/pcmcia/vmb_usb.o としてコピーしてやれば、地球アイコンまで出るようになりました。
当初は、dummy_cs.c のコンフィグをそのまま使っていたのだけれど、それだとインスタンスが作れていない、とかゆうエラーがpcmcia/ds.c の中で出ていたようで、ちゃんと、VMB5000のドライバの中身に従って、変更。IRQの属性を、IRQ_TYPE_EXCLUSIVE から RES_SHARED に変更しただけだけど。
で、現在のところ、CFカードのリソースが登録できただけで、まだUSB部分については未実装。
ここからは、急激にハードルが高くなるなあ。
まずは、usbcoreのAPIをコールして初期化するのかな?

VMB 2.6ドライバから2.4へのバックポート開始

PCMCIA CSの2.6と2.4ではずいぶんとドライバの作りが違う。
といって、手元にあるLINUXデバイスドライバは2.4用。2.6でできてるドライバのバックポートなんかできるんかしら?
策として、2.4と2.6で両方にあるドライバを比較してみることにした。そうすれば、同じ処理をどう2.4と2.6で実現しているかがわかるはずだ。それをもとに、2.6から2.4へバックポートしよう。
サンプルにはorinoco_cs.c を使うことにした。PCカードタイプの無線LANカードね。
まず、初期化部分。ドライバの登録方法から違う。とはいえ、attach/detachがprobe/removeに変わったようなもの。あとは、引数が違う。
まず、初期化部分。vmb_cs_probeという関数が初期化を行っていることはわかった。引数が違うが、2.4用に変えて、dummy_csの初期化と同様にすれば良さそう。
とりあえず、vmb_cs_attachという関数に作り替えて、初期化はできた、かな?
実機では試していないけれど。

D01NXドライバをのぞいてみる

PCMCIAカードサービスを作るための下準備はできた。
しかし、これをどうUSBホストアダプタとして作ればいいのやら?
USB関連の関数をなんか呼ばなくちゃならんのだろう、とゆうことはわかるのだけど、どの関数を呼べばいいのかな?
ということで、まずは、既存のD01NX用vmb_usb.oをarm-linux-nmで解析。stripされていないから、シンボルが残っていてありがたいなあ。
USB関連のAPIは以下のものが使われている様子。
U usb_alloc_bus
U usb_alloc_dev
U usb_check_bandwidth
U usb_claim_bandwidth
U usb_connect
U usb_deregister_bus
U usb_disconnect
U usb_free_bus
U usb_free_dev
U usb_new_device
U usb_register_bus
うむ、よくわからん。
RFX-CF1のドライバのソースコードでも見た方がわかるかな?
一方、arm-linux-stringsで文字列リソースをのぞいてみたところ、
../vmb_usb_cs.c
../vmb_usb_hcd.c
というのが見つかった。
VMB5000のドライバが、vmb_csとvmb_hcdからできていたけれど、やっぱり同じソースからできているのかな?

D01NXが届いた

EMチャージでD01NXが届きましたよ。
さっそく、SL-C860にイー・モバイルからドライバをダウンロードして、再起動してから刺してみたけれど、CFアイコンすら出ない。
カーネルにusbcoreとacmを組み込んだものを使っても、うまくいかない。地球アイコンが出てこないから、接続も出来無い。
やはり、SL-C860で動かすには、2.4.18用にドライバを作るしかないのかね?
とりあえず、pcmcia-csのdummy_csからダミーのドライバを作ってみた。
D01NXを刺したら、ダミーのドライバを読み込むところまではできた。
ここから、vmbの2.6用ドライバを参考にして、USBドライバに仕立てていけばいいのだが、簡単にはいかないだろうなあ、いくら、ソースがあるとはいえ。
ところで、EMチャージの時は、APNとやらを標準のものから変えないといけないらしいが、ザウルスでのAPN設定方法が書いてないけれど、どうしたらいいんだろう?

Angstromを試してみる

SL-C860のカーネルを2.4.20に入れ替えるのは、ちょいとした努力ではできなさそうだ、と思った。やっぱり、カーネルの起動の知識とか必要だね。デバッグが出来無いことには、どこまでできているのかもわからないし。
では、vmbドライバを2.4.18用に作成するか、ということになりそう。
オライリーの「Linuxデバイスドライバ」第2版を図書館で借りてきたけれど、さて、できるかなあ?と思うわけで。2.6.13以降用の書かれたカーネルだから、2.4.18へのバックポートは容易じゃないんじゃないかと。
一方、OpenZaurusとその後継プロジェクトAngstrom(本当はウムラウトが入る、オングストローム)では、2.6系カーネルが採用されていて、D01NXに必要なvmbドライバのビルドができるらしい。それに、X11が使えるので、Firefoxなんかも移植されているらしい。おお、こっちの方が面白そうだ。
ということで、Angstromを試してみた。
OpenZaurus-jaで公開されている最新のものを使ってみた。インストールは手順通りにすれば問題なし。ただ、大きな問題が…うちの無線LANカード(D-Link DCF-650W)が動かない。PCMCIAカードとしては認識されているけれど、ドライバがつながらない。よって、無線LANが使えない。
それと、このX11を使ったROMは、空きメモリが2MBぐらいしかないので、ほとんど何もできなさそう。SWAP必須らしい。それも困るなあ。
一方、OpenZaurusを最終版の方を試してみた。
GPE版(X11を使っている)では、無線LANがやっぱり設定できなかった。設定できているような気はするのだけれど、IPv6のアドレスだけ設定できて、IPv4のDHCPが動かない。staticにしたけど駄目。なんで?
一方、OPIE版(Qtopiaと同等)の方では、無線LANが動いた。カーネル同じなのにね。ヘンなの。
メモリ量とかからすると、OPIE版の方がよさそう。ただ、WebブラウザがKonquerer-Embeddedなんで、その辺が不満かしら。Operaを動かす方法もあるようだけど。
ということで、OPIE版OpenZaurusをベースに、D01NXが動くものを作ろうかと思うところ。

D01NX注文

イー・モバイルのオンラインストアでEMチャージで注文した。11980円で10000円分のチャージ付きのキャンペーン価格。本体実質1980円。
イー・モバイル端末さえあれば、SIMカードの入れ替えでプリペイドに使えるらしいので、D01HWの白ROMでも探せば…(苦笑)
と、白ROMでググったら、D01NXの白ROMを6000円で買い取ってくれるところがあったわ。D01HWも同じ値段と言うことは、そんなに安く白ROMは転がっていないか。
支払い方法が代引きのみ、ってのが面倒だなあ。でも、ヤマトだから代引きにクレジットカードが使えるのか。念のため、現金をおろしておいた方がいいかな?

bootを入れ替えてみたが駄目だった

SL-C3000用の arch/arm/boot をSL-C860用で置き換えてみたのだけれど、まず、ビルドが通らなかった。アセンブラコードの定数(マクロ定数かな?)が見つからない、とか言われる。
#MACH_TYPE_CORGI だと駄目で、 #MACH_TYPE_CORGI & 0x00ff だといい、ってのはどうゆうこと?armのアセンブラを勉強しろと言うことでしょうかねえ。
続いて、SL-C860用でビルドした arch/arm/boot/compressed 以下を利用して、SL-C3000用のvmlinuxからzImageを作ることにした。make zImageの最後の方で行っていることを、手動で行ったところ、zImageはできあがった。
さっそく、このイメージを焼き込んでみたのだけれど、やっぱり起動しない。
うーん、どうも、ブート部の問題ではないような気がするなあ。
起動時のメッセージが詳細に出せれば、デバッグができるのかもしれないけれど、kernelにデバッグオプションを付けたら、シリアルコンソールに起動時のデバッグメッセージとか出力されるのかな?そこまで至らない可能性もあるけど。

2.4.20カーネルを焼いてみたけれど

SL-C3000用のカーネルをSL-C860用にビルドして、焼いてみた。
カーネルのアップデートはできたけれども、まったく、うんともすんとも言わなくなった。
コンソールが出る以前の問題なので、カーネルがブートできていないのだろう。
Linuxカーネルのブート手順とゆうのをよく知らないので、こうゆうことになっているのだと思うが、そういえば、ブートストラップがあるようなことを読んだことがあるような気がするので、SL-C860とSL-C3000ではハードウェアが違うから、メモリ配置とかも違っていて、ブートストラップも違うのだろう。
SL-C860用のブート部をSL-C3000のソースに入れてやったら、動くんじゃないかな?そんなに、ブート部はカーネルのバージョンが上がっても変わらないんじゃないかな?
まずは、調査のために、すっぴんの2.4.18と2.4.20のarch/arm/boot を比較してみた。
diffで違いのあるファイルを探したら、以下の通りだった。
arch/arm/boot/Makefile
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/head-epxa10db.S
arch/arm/boot/compressed/head-mx1ads.S
arch/arm/boot/compressed/head-shark.S
arch/arm/boot/compressed/head.S
arch/arm/boot/compressed/misc.c
arch/arm/boot/compressed/ofw-shark.c
ざっと見たところ、新しいアーキテクチャに対応した様子。
細かなバグも修正されているのかな?
これなら、置き換えでそのままいけないかな?

SL-C860用に2.4.20カーネルをビルドしてみる

D01NXをSL-C860で使うには、SL-C3000などで使っている2.4.20カーネルを使うのが簡単と考えた。
SL-C860の2.4.18系のカーネルに、2.4.20のパッチを当てる、という方法も考えたけれど、そもそも、SL-C3000のカーネルがSL-C860用にビルドできないものかと考えた。
まずは、ビルド環境の構築。VMwareのおかげで、新しくPCを用意しなくて良くなったというのはいい時代になったものだなあ。開発環境の動作確認が取れているRedHat 7.1JのISOイメージをダウンロードして、簡単なビルド環境をVMで作った。
続いて、SL-C3000のカーネルをザウルスサポートステーションから入手。ビルドの手順書に書いてあるとおり、3つのツールも入手してインストールする。
まずは、SL-C3000のカーネルがビルドできるかの確認。
configファイルを読み込ませるところで、spitz-jとゆうコードネームが出てきて、懐かしかった。
手順書通りにビルドを開始。しかし、エラーが出てビルドできない。エラーメッセージを見ると、GNU Assembler (as) がエラーを出している。ARM用のオプションが認識できないらしいが、クロスコンパイル用のarm-linux-as ではなく、x86用のasが使われている。どうやら、binutilsがインストールされていないのが原因の様子。これもザウルスサポートステーションにあるので、ダウンロードしてインストールする。そしたら、ビルドができた。
続いて、SL-C860用の設定ファイルを読み込ませて、ビルドをさせてみる。読み込ませるファイルは、arch/arm/def-configs/boxer-j 。ボクサー犬。
ビルドを始めたら、エラーが出て止まった。 debug2_printk がundefinedだという。
定義ファイルを探したら、arch/arm/mach-pxa/sharpsl_battery.c というファイルの中で、 CONFIG_ARCH_PXA_SPITZ のスイッチの中で定義されていた。このdebug2_printkがspitz用のコード以外で使われてしまっているのが問題。ほんの一ヶ所なんだけれど。コメントアウトしたらビルドができた。デバッグ出力を解除しただけだから、大きな問題はなかろう。
イメージはできたので、焼いてみよう。
果たして、焼けるかな?