Androidが起動しなくなった

Kernel 2.6.23ベースのAngstromにw100のダブルバッファパッチを当ててビルドして、焼けて起動するところまでは確認していたのだが、そこで、Androidを起動しようとしたら、赤玉がずっと動き続けるだけで、起動しなくなった。赤玉の動きがスムーズになっている感じで、ダブルバッファは効いているのかな?と思ったりするけど。
カーネル起動メッセージを見ると、どうも、JFFS2でエラーが出ている様子。イメージに問題があるのか、それとも、pdaXromを一度焼いたのが失敗だったか?

やっとBitbakeでビルド

Androidをザウルスで動かすには、w100のダブルバッファ化という作業があった方がいいらしい。といって、ダブルバッファ化されたドライバが出回っているわけでもなく、ビルド作業から必要な様子。
KernelはAngstromのものを使うと言うことで、bitbake環境を構築してビルドをしてみた。
まずは、書いてあるとおりにbase-imageとconsole-imageを作るところまでやってみた。
Ubuntu 8.04日本語VMwareイメージで作業をしているのだが、ビルドするまでにいろいろとインストールさせられた。とりあえず、エラーとして出てくるものを片っ端にapt-getでインストールした。
そうしたら、どうにかこうにか、Angstrom配布サイトに置かれているようなInstall Kitが作成された。
これをSL-C860に焼いてみたところ、一応、起動する様子。
さて、次に、w100にパッチを当ててリビルドしようとしてみた。
とはいえ、いったいどこにソースコードがあるのやら?findで探してみると、/OE/angstrom-stable/work/c7x0-angstrom-linux-gnueabi/linux-rp-2.6.24-r10/linux-2.6.24/driver/video/w100fb.c にあった。
これを書き換えて、bitbake -c rebuild linux-rp とすると、kernelをビルドしたようなのだが、よく見ると、workの下のw100fb.cが元に戻ってる。
どうも、bitbakeをすると、kernelをtar ballから展開して、パッチを当てているらしい。
ということで、パッチを作成して、それを適用するよう bb ファイルを書き換える必要がある。具体的に書き換えるファイルは、 /OE/org.openembedded.stable/packages/linux/linux-rp_2.6.24.bb で、ここに、w100用のパッチを適用している箇所があるので、その続きに書く。パッチは、他のw100用のパッチと同じく、/OE/downloads に置いた。
これでリビルドすると、パッチが適用されて、カーネルがビルドができたところまでは確認された。
次は、Android用のドライバを作成するためのパッチを適用せねば。

Android on SL-C860

久しぶりに、SL-C860をいじくってみた。
2.4.20カーネルをSL-C860で動かないかと思っているんだけど、boxer-j.confだけでは駄目なのかしら?arch/arm/boot を比較しても、同じようになっていると思うんだけどなあ。違うのは、”SHARP Shepherd”と”SHARP Boxer”のマシン名ぐらい?
しかし、NetFrontではもはや最近のWebはみれないので、やっぱり、Androidにしたいなあ、と思う今日この頃。
ということで、今更、SL-C860でAndroidを体験してみた。
SDカードで起動するイメージがあるそうなので、下記からいただきまして。
http://androidzaurus.seesaa.net/article/80104396.html
カーネルの方は、2.6.23でないといけないそうなので、SL-C860用には、Angstromの古いヤツをもらってくる。(最新版は2.6.24だった)
http://www.angstrom-distribution.org/releases/2007.12/images/c7x0/old/Angstrom-console-image-glibc-ipk-2007.12-c7x0-installkit.tgz
カーネルを書き換えて、SDカード(FAT16でフォーマットしてある256MB 2MB/s。MI-E25DCと同時期に買ったヤツだったかな?)にAndroidのイメージを展開して、起動する。
途中、コンソールが出てきて、コマンド入力ができてしまったので、あら、起動に失敗か?と思ったら、しばらくしてから起動画面(いわゆる赤玉)が出てきて、Andoridのホーム画面になった。と、同時に「Contactが応答してません」とゆうような趣旨のエラーが出た。swapを作ると回避できるかな?
このイメージが公開されたのが今年の1月だったので、これで1年遅れとゆうところかな。
OpenSource版Androidのビルドには成功したので、イメージの中を置き換えれば使えるのかな。
まず、その前に、このカーネルで、手元のD-Link DCF-650W(SL-5000用にアメリカで買ったヤツ)を使えるようにしないと。WEPの設定が出来無い、とかゆって落ちてる感じがする。

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という関数に作り替えて、初期化はできた、かな?
実機では試していないけれど。

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が動くものを作ろうかと思うところ。

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