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用のコード以外で使われてしまっているのが問題。ほんの一ヶ所なんだけれど。コメントアウトしたらビルドができた。デバッグ出力を解除しただけだから、大きな問題はなかろう。
イメージはできたので、焼いてみよう。
果たして、焼けるかな?

D01NXを購入しようかな

嫁さんの実家がBフレッツをやめてしまった。
今度、お留守番に行くことになっているのだが、その間、ネットにつなげなくなってしまう。
近くには無線LANを使ってそうな人たちもいるのだが、さすがに、WEPを解析してパスフレーズを手に入れて、ただ乗りするってのは犯罪になってしまうので、それはやめておこう。
FONネットワークでもないかしら、と探してみたけれど、ちょっと離れたところにあった。路上でアクセスしてるのも怪しいしなあ。
Netbookを買うついでに、イー・モバイルを契約する、という選択肢もありかな、と思ったのだけれど、スポットで使うだけにしては高いなあ、と。ミニマムの無料通信分だけでは3MB程度じゃないですか。これなら、契約増やすより、
一方、イー・モバイルにはエムチャージとかゆうプリペイドサービスがあるらしい。1日630円で使い放題。使い方によっては、長期契約より安くていいね。
アウトレットでUSBタイプのが端末実質1980円と安くて良さそうだったので、買おうかな、と思っていたら、買おうとしたときには売り切れていた。毎度こんなのばっかりだなあ。
今売ってるのは端末実質7980円。下り速度は上がるけど、ほとんどワンタイムで使うだけだしなあ。
と、考えていて、ふと、CFタイプのがあることに気づいた。
メインマシンはMacBookなのでCFは使えない。けれど、嫁さんのノートPC(Actius PC-A800、シャープの北米モデル)がPCMCIAスロットを備えている。Pentium II 366Mhzの貧弱ノートだけど、テンポラリにはいいんじゃない?と思った。
さらに、CFならザウルスSL-C860もあるじゃないか!前に、bitWarpを使っていたときに、iptableを書き換えて、ザウルスをルーターにしたて接続をした、ということがあったけど、同様にすれば、CFスロットのないMacBookでもイー・モバイルが使えるジャン!とゆうか、ザウルス単体でもたいていの場合オッケーじゃないかしら?ああ、じゃあ、これでいこうかな、と思った。
イー・モバイルのページには動作確認済みザウルス、と書いてあるので、こりゃ大丈夫だろう、と思っていたら、SL-C3000以降のUSB搭載ザウルスのみ動作確認済み、とのこと。なんでかしらん?
ぐぐってみても、SL-C860での動作実績は見あたらず。
ドライバのipkを展開して、中身を見てみたら、libusbが入ってる。単純なシリアルデバイスではないのね、これ。PCMCIA->USB->シリアルと変換しているらしい。
再びググってみると、いろいろ試している方々がいるらしい。
わかったこととしては、公式公開されているドライバは、4桁ザウルスに搭載されているKernelが2.4.20なのに、SL-C860に搭載されているのが2.4.18であるために、ドライバが正しく動作できなさそう、ということ。usbcore.oがあれば、とりあえず、ロードまではできるらしいのだが。vmb_usbというドライバさえ、2.4.18環境でビルドされれば、動くであろう、ということ。
vmb_usbの開発元が2.6系カーネルのドライバソースコードを公開しているようなので、これを、2.4.18にバックポートできれば、動作も可能になるんだろうけど。
ふと思ったのだけれど、公式ドライバを動作させるには、4桁ザウルスと同じ2.4.20カーネルを入れたらいいんじゃない?ということ。ざっと見た感じでは、2.4.20カーネルをSL-C860に入れる、というアプローチをとっている人はいなさそう。できるのかな、カーネルのアップデート?ザウルス用カーネルに、パッチで2.4.18->2.4.20にしたらビルドできないかな?いや、4桁ザウルスのカーネルをSL-C860用にビルドできないのかな?できそうだよなあ。
オラ、ワクワクしてきたぞ!
なんか、挑戦がいのあるデバイスだなあ。
きっと、挑戦している間に、誰かがオリジナルカーネルで動くドライバを作ってくれそうだけど(苦笑)、楽しめそうな気がする。カーネルビルドの練習にもなるかな。
ということで、買ってみようかな。
なんか面白そうだし。
とりあえず、Windows 2000で使えるんだし。
ところで、これ、USBシリアルのコンバータが入ってるってことは、分解したら、PCMCIA-USBのチップと、USB-シリアルのチップと、モデムチップの3構成になってたりしないかしら?後段2つは今時1チップだろうけど、USBの口が出ていそうな気がする。USBの信号線が取り出せたら、そのままUSBデバイスにできないかなあ、とか、逆に、ザウルス用のUSBカードにできないかなあ、とか。