1.6r2 の make

とりあえず最新ではなくて 1.6 を作って入れてみる事に。

repo でブランチ指定

ここによれば以下な模様。

$ export ANDROID=~/android/armadillo500fx-droid-1.6r2
$ mkdir -p $ANDROID
$ cd $ANDROID
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.6_r2

で、$ANDROID/.repo/manifest.xml に以下を追加。

  <project path="kernel" name="kernel/common" revision="refs/heads/android-2.6.27"/>

で、repo sync します。おそらくもの凄い時間がかかるはず。このあたり一度オトしたソレがあるので、タグとかブランチとかを云々して上手になんとかする方法があるはずなんだろうけどなぁ。

続き

repo sync が終わったんで、、、って思ったら 1.6r2 なパッチがここに無い。うーむ、とウナリつつリスト見てたら tar.gz な eclair とか kernel とかを発見。
make とか面倒なのでとりあえずこっちでヤッてみるか、と

  • eclair-20091115.tar.bz2
  • kernel-2.6.27-armadillo500fx-eclair.tar.gz

をナニ。
で、解凍する時に気づいたんですが、

$ tar zxvf ~/Downloads/e

まで入力して tab 補完しようとしたら NG。

$ tar jxvf ~/Downloads/e

だと補完できた。最近の shell って賢いのう。(何
とりあえず kernel-*.tar.gz バラしたら patch なソレだったのでスルー。SDCard 経由で android.tar.gz を実機にコピって

# chroot /mnt/android /init

したら挙動変わらず。当たり前と言えば当たり前か。

android_power: wakeup (0->0) at 109859110049 (2000-01-23 21:44:39.384835000 UTC)
init: untracked pid 1964 exited

とりあえず 1.6r1 を repo sync ちうです。とほほ杉。

リトライ

repo sync 終了。パッチあてるスクリプトをここから持ってきて解凍。

$ wget http://android-development-environment.googlecode.com/files/vendor_sola-armadillo500fx-android1.6_r1_v2.tar.gz
$ tar zxvf vendor_sola-a500fx-eclair.tar.gz -C $ANDROID/vendor/
$ $ANDROID/vendor/sola/armadillo500fx/patch/armadillo500fx-patch.sh

か。なんとなく微妙なんですが、そのまま進めます。

$ echo "TARGET_PRODUCT:=armadillo500fx">buildspec.mk
$ make j2

なんつーか微妙。で、起動してみたんですが現象変わらず。

色々確認してみたんですが

system/core/init/init.c の main() 手続きから呼び出される wait_for_one_process() 手続きみたい。main() 手続きの該当部分が以下。

        if (ufds[2].revents == POLLIN) {
            /* we got a SIGCHLD - reap and restart as needed */
            read(signal_recv_fd, tmp, sizeof(tmp));
            while (!wait_for_one_process(0))
                ;
            continue;
        }

ちなみに上記は無限ループの中になってます。で、wait_for_one_process() 手続きのメセジ出力してる部分が以下。

    svc = service_find_by_pid(pid);
    if (!svc) {
        ERROR("untracked pid %d exited\n", pid);
        return 0;
    }

これ、0 戻してるって事は while なループでぐるぐる回ってるのか。それにしても、繰り返しカーネルバッファに出力されるメセジはざっくり以下なんですが

android_power: wakeup (0->0) at 109859110049 (2000-01-23 21:44:39.384835000 UTC)
init: untracked pid 1964 exited

上側のメセジはどのコンポーネントが出してるのか。Web で見た所では kernel/drivers/android/power.c の以下の手続きとの事なんですが

static void android_power_wakeup_locked(int notification, ktime_t time)
{
	int new_state = (notification == 0) ? USER_AWAKE : USER_NOTIFICATION;

	if (android_power_debug_mask & ANDROID_POWER_DEBUG_USER_STATE) {
		struct timespec ts;
		struct rtc_time tm;
		getnstimeofday(&ts);
		rtc_time_to_tm(ts.tv_sec, &tm);
		printk(KERN_INFO "android_power: wakeup (%d->%d) at %lld "
			"(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
			g_user_suspend_state, new_state, ktime_to_ns(time),
			tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
			tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
	}

	if(new_state >= g_user_suspend_state) {
		return;
	}
	g_user_suspend_state = new_state;
	g_current_event_num++;
	wake_up(&g_wait_queue);
}

ソースツリーをナメてみた所では、何も出てこないんですがorz
しかもそもそも kernel/drivers/android なんてソレが無い。パッチあててみましたが状況は変わりなし。仕方が無いので kernel も make してみます。今日はこれで終了。