やはり電源管理ができない

Angstrom devブランチでもAndroid用のパッチができたのだけれど、やはり、CONFIG_ANDROID_POWERを有効にすると、電源ボタンでのサスペンドができなくなってしまう。うーん。これがないとキーが効かなくなるからなあ。
電源オフ時のdmesgを見てみると、

Freezing user space processes …
Freezing of user space aborted

ということで、user spaceのプロセスを止めようとしているのだけれど、失敗していて、サスペンドに入れないような気がする。
Androidに電源管理をさせないといけないってことかな?

Angstrom devブランチを試してみた

AndroidをSL-C860で使おうと思うと、Kernel 2.6.26の方が良さそうなのだけど、Pokyだとなんか動きがおかしいし、かといって、AngstormのKernel 2.6.24ではAndroid用電源管理が使えないから、キーやタッチスクリーンがまともに動かないし。どっちがいいのやら?
一方で、Angstromのdevブランチでは、c7x0向けもKernel 2.6.26になっている模様。なんとなくだけど、Angstromの方がPokyよりもザウルスに優しい気がするので、これを試してみることにした。
devブランチの入手方法などはどこにも書いてないのだけど、Angstromのビルド案内に書いてあるstableをdevに置き換えれば、とりあえずリポジトリは取得できた。
bitbakeしようとしたら、1.8.10じゃだめで、1.8.12にしろと怒られるので、Ubuntu用のをapt-getでアンインストールして、bitbakeを取得し直し。
気を取り直してbitbake base-imageをすると、rootfsの作成でエラーが出て停止。
どうやら、zaurus-updaterがビルドされていないようで、先に、bitbake zaurus-updaterでビルドしておいた。
その後、もう一度bitbakeするとinstall kitができあがった。
焼いてみると、これまでと変わって、ブートメニューが出てくる。どうやらこれ、kexecbootというものらしく、rootfsとかを切り替えれるようになっているらしい。/dev/mtdblock2 と /dev/mmcblk0p1 が見えていて、前者は内蔵NAND、後者はSDカードということ。これで、SDカードにrootfsを入れれば起動できるってことですな。じゃあ、Androidらしい構造にしておけば、chrootなしでAndroidが起動できちゃう?
まあ、SDカードブートの前に、まずはカーネルにAndroidパッチを当てなくちゃ。

すべての原因は電源管理にあった

Pokyの2.6.26カーネルでCONFIG_ANDROID_POWERを有効にして再ビルドに挑戦!
以前の段階でも限界ぎりぎりだったカーネルサイズはやっぱりオーバーで失敗。
他に切れるところはないか?と探したら、CONFIG_LOGOがあったので、迷わず削除。これでなんとか収まりましたとさ。結構、ロゴってでかいんだ。
できあがったカーネルでAndroidを起動して、時間設定をいじると、ちゃんと時間を設定できるようになってた。おお、すばらしい。これはalarmドライバのおかげのようですな。
そして、KeyInputQueueにパッチを当てて回避していたキーイベント問題も、電源周りじゃないか?と疑っていたのですが、ビンゴでした。
オープンソース版でないAndroid SDK 0.9も1.0も問題なくカーソルキーやタッチスクリーンが動きましたよ!
しかし、問題としては、電源ボタンでサスペンドできなくなってしまったこと。これ、Androidの起動前でもできなくなってるので、もともとPokyがいけなかったのか、パッチが原因なのかは不明。

CONFIG_ANDROID_POWERでビルド失敗

PokyのKernel 2.6.26を使わなくても、AngstromのKernel 2.6.24でもAndroidのキーとタッチスクリーンに問題がないことがわかったのだけれど、なんか、パワーマネジメントまわりの気がするので、CONFIG_ANDROID_POWERを有効にしてAngstromを作り直そうとしてみた。
そしたら、ビルドでエラー。state_attrが見つからない、とか言われる。
Pokyの方ではどうかな?と試してみたら、あら、android/power.cを作ってなかったわ。

タッチスクリーンも動作できるようになった

タッチスクリーンが動きました!
ドライバ側の方はandroidzaurusさんのところと変わっていないはずなので、Androidのソースのリビジョンが違ってたりするんじゃないか?とか、なんか環境変数とかプロパティとかあるんじゃないか?とかいろいろ疑って、Androidのソースの中を探ってみました。
Linuxのキーイベントは、input_event という構造体に入って/dev/input/event0 から出てくるとゆうことがわかったりしたので、この構造体があるかいな、とか調べていたら、キー入力を処理しているところを発見。
frameworks/base/services/java/com/android/server/KeyInputQueue.java とゆうファイルの中で、

if (!send) {
continue;
}

とゆうコードがあって、どうも、カーソルキーの入力もタッチスクリーンの入力も、はじき飛ばされている様子。
ならば、と、continueをコメントアウトして、必ず通るようにしたら、タッチスクリーンが動きましたよ!
でも、回避方法がわかっただけで、根本的な原因は実はわかっていないわけですな。
sendに値を与えているpreprocessEventの中身を調べてみないと。
まあ、それでも、タッチできるようになると楽しくなりますなあ。

Kernel 2.6.26 for SL-C860 Android起動

CONFIG_KERNEL_DEBUG と CONFIG_NETWORK_FILESYSTEM を切ったら、なんとかAndroid関連のファイルを含めてカーネルの作成に成功。
これで今度こそキーボードとタッチスクリーンといけるだろう!と思ったのだけれど、変わらず。とほほ。
キーボードに関しては、qwerty.kl の WAKE_DROPPED と書いてあるところを消したら、カーソルキーなどが動くようになった。パワーマネジメント関連?

Kernel 2.6.26用Androidパッチ

なんとか、PokyのSnapshotをビルドするところまでこぎ着けれた。
Ubuntu 8.04のVMでは導入するものが多いなあ。flexが入ってなかったためにやり直しのハメになったさ。
できあがったPokyをSL-C860に焼いてみたところ、とりあえず、Kernelは2.6.26になっている。よしよし。ただ、poky-image-baseではスプラッシュ画面が出たままで起動せず。poly-image-satoを作ったら起動した。
しかし、キーマップがおかしいようで、「:」とか入力できないんで、/etc/inittabを書き換えることもできず。えー。sshでログインすればいいのか?
まあとりあえず、Kernel 2.6.26がSL-C860で動くようになったので、android用のパッチでも当てるか、と、Kernel 2.6.24用に作ったものを適用したら、binderのところでコンパイルエラーが出た。何か違うところがあるのかな?ポーとするのも面倒そうだなあ〜
と、思って、ググってみると、意外に簡単にKernel 2.6.26用のAndroidパッチを見つけた。ラッキー。
Armadillo 500FX用のパッチ
これで労せずしてパッチが当てれるわ!わっはっは!
と期待したのだけれど、そのままではパッチエラーが出るし、ビルドエラーも出るし、で駄目みたい。それでも、まだ楽になったと思う。

カーソルキーが有効になった

androidzaurusさんのアドバイスに従い、init.rc の中でrootfsをRead-Onlyで再マウントしているところを、Read-Writeに変えたところ、ブラウザは問題なく起動するようになりました。
また、Android 1.5になっても、起動にはm3版と同じスクリプトを使っていて、android.imgに入っていた/a.shをchrootして呼び出すようにしていたのだけれど、これを、/init を起動するように変更したら、カーソルキーが有効になりました。
a.shでは、initがバックグラウンドタスクで動作するため、カーソルキーが渡されないのかな?
あとはタッチパネルだなあ。/dev/input/event1 をcatすると、何か出ているので、ドライバ自身は有効なんだと思うんだけど。

Android on SL-C860 まとめ

AndroidをSL-C860で制限付きながらも動かせるようになったので、一度、まとめておきます。
まずは、Angstrom環境で動作するAndroid m3版のイメージから。すべては、ここから始まりました。
http://androidzaurus.seesaa.net/article/80104396.html
このイメージファイルがすべての始まりでした。
さらに、SL-C700でAndroid SDK 0.9が動いたという話。
http://d.hatena.ne.jp/steleto/20080925
こうなると、SL-C860でも動くはずなんだけれど、カーネルのパッチとか、イメージとかは見あたらない。仕方がないので、自分でカーネルをなんとかすることにしましたとさ。
m5-rc14版では、Kernel 2.6.23を使っていて、そのカーネルの必須修正はリストがありました。
http://elinux.org/Android_on_OMAP#Kernel_patch
これをもとに、SDK 1.0r1用のカーネルパッチから、2.6.24用のパッチ (400.4K)も作りました。
SL-C700やSL-C860に搭載されているグラフィックチップであるところの、ATI W100をダブルバッファ化も必要と言うことで、
http://d.hatena.ne.jp/steleto/20080417/1208451195
これもパッチ (2.2K)を作り、bitbake環境で適用しました。
さらに、タッチパネルを有効にするためのパッチ。corgi_ts.cにパッチを当てます。
http://blog.seesaa.jp/tb/96581331
たった2行のパッチ(0.4K)だけど、効果は絶大で、m5版ではタッチパネルが動作するようになりました。0.9以降で動作していないのはなぜなのか不明。
あとは、android.imgの作り方。
http://androidzaurus.seesaa.net/article/80730942.html
Android SDK m5-rc14, m5-rc15, 0.9, 1.0r1、オープンソース版Androidでもこの方法で作成しました。
とりあえず、このぐらいだったかな?
安藤恐竜さんから修正のヒントをいただいたので、もう少しトライしてみよう。

Android 1.5 on SL-C860 起動できた!

ようやく、SL-C860でオープンソース版Android 1.5が動きましたとさ。
これもひとえに先人の方々が有用な情報を提供してくださっていたからです。ありがとうございます。まとめ直してから、参考にした方々のリンクとかトラックバックとかさせていただきましょう。
Android860
状況としては、以下のような感じ。


  • KernelはAngstrom stableブランチ 2.6.24 2007.12-r19相当
  • Kernelパッチは、Android SDK 1.0-r1から作成。androidドライバ、ashmemドライバとか必要そうなものだけ抽出。
  • w100fb.cのダブルバッファパッチは適用済み。
  • corgi_ts.cへのパッチも適用済み、のはずなのだけれど、タッチスクリーンは動かず。画面にさわるとフォーカスがどっかに行ってしまうので、入力だけはしている気がするけれど?
  • オープンソース版Androidはmasterブランチ(本線)。タグは意識していないけど、1.5になっている模様。
  • ランドスケープ固定パッチ適用済み。Global Timeのフレームレートは5.5fpsぐらい。
  • 一部のキーが認識しない。具体的には、カーソルキーと中央のCancel。Keycode Checkerを入れてもキーがあがってきていない。とりあえず、動作確認のため、HJKLにvi風カーソルを割り当ててみた。
  • ユーザーランドは、128MBのext2ファイルシステムのイメージを作って、それをループバックでマウント。中身は、エミュレータから/data と /system をとってきたもの。
  • chrootしたためか、Read-Onlyになってしまう。そのため、ブラウザが起動できない。コンソールからmount -o remount,rw rootfs / とすると、ブラウザが起動できる。

タッチスクリーンが正しく動作しないので、今のところはあまり関係ないけれど、ソフトキーボードがエラーを起こしまくります。
Keyboarderror
これはエミュレーターでもよく起こるので、実機の問題というわけでもないのかな?