into the void

ソフトウェアに関する雑多な調査日記

Androidを載せたbeagleboard-xmをWiFi APにするまで(其の四)

androidソースコードからビルドするための準備

ビルドする環境に必要なパッケージをインストールする。ビルド環境はWiFi APの動作確認もしたUbuntu 10.04 LTS。MacVM Ware Fusion上。
準備は下記の書籍の説明にしたがって行った。
http://www.c-r.com/mo_enb_android.htm
書籍の内容をそのまま書くのはアレなので、DevKitのUserManualから該当する説明を転記しておく。あと書籍の内容そのままではインストールができなかったものについて独自手順でやったものについても記述しておく。※はじめてandroidをさわる人には本当におすすめです。この本。
必要な準備は下記のようなもの。

JDK 1.5のインストールの準備

froyoではJDK1.5を使うのでインストールが必要。1.5はUbuntu 10.04 LTSのデフォルトのレポジトリからはインストールできないので、レポジトリの場所を追加する必要がある。追加するレポジトリは下記。synaptic パッケージマネージャの設定-レポジトリから追加できる。

http://old-releases.ubuntu.com/ubuntu dapper main multiverse
http://old-releases.ubuntu.com/ubuntu dapper-updates main multiverse
いろいろパッケージのインストール

DevKit 2.0 UserManualにあるように下記のコマンドを実行する。
上記のレポジトリの追加をしておけばjdk1.5も一緒にインストールできるはず(未確認)。書籍だとuboot-mkimageとzipもインストールしている。
http://processors.wiki.ti.com/index.php/TI-Android-FroYo-DevKit-V2_UserGuide#Building_Android_Sources

sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage

jdkについてはjdk6がすでにインストールされいる場合は、jdk6からjdk1.5にスイッチする設定が必要。

$ sudo update-java-alternatives -s java-1.5.0-sun
repoのインストール

gitからandroidのソースを一括でダウンロードするためにrepoというツールを入れる。
まずrepoをインストールディレクトリを準備する。ホームディレクトリに~/binを作ってパスを通しておく。その後curlコマンドでhttpでツールのファイルをダウンロードして、実行できるようにパーミッションを変更しておく。

$ mkdir ~/bin
$ export PATH=$PATH:~bin
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 
$ chmod a+x ~/bin/repo

androidのビルド

ソースのダウンロード

repoを使ってgitからソースをダウンロードする。これにめちゃくちゃ時間がかかるので注意。gingerbreadからはTIサイトでtarで固められたソースコードをダウンロードできるようになっているんだけど、froyoはgitで落とすしかない。。。

$ mkdir rowboat-android
$ cd rowboat-android
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-FroYo-DevKit-V2.xml
$ repo sync
androidのビルド

最初にandroidをビルドする。ここでandroidといっているのはLinux Kernelの上に構築されるandroidシステムのこと。実体はLinux用のroot filesystem一式。bionicやDalvik JVMといったライブラリ、ランタイムを含めシステムを構成するすべての要素がビルドされるため、かなり時間がかかる。第2世代(Sandy Bridge)のCore i5 1.7GHzのマシンで、VMware Fusion 上のUbuntuでビルドして1時間くらい? VMに割り当てているプロセッサ数は2個なので、make時のスレッド数は3にした。

$ make TARGET_PRODUCT=beagleboard -j3

ビルドが終わったらout/target/product/beagleboardに必要なファイルが出力されていることを確認する。使うのはrootディレクトリ配下のファイルとsystemディレクトリ。(root/*とsystem)
その後でTIのグラフィックドライバもビルドしてsystemディレクトリにコピーする。ここはちょっと省略。

Linux Kernelのビルド

次にLinux Kernelをビルドする。kernelディレクトリに移動してmakeを実行。KernelのソースコードはDevKitの方にも入っているが、今回はgitで取得したソースを使う。多分同じものだともう。
コンパイル前にクロスコンパイル用ツールチェインへのパスを通しておく。場所はgitでダウンロードしたディレクトリのprebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin。パスを通さない場合は、CROSS_COMPILEで指定する値をフルパスで書く。

$ cd kernel
$ make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage
Linux Kernelの修正

とりあえずオリジナルのソースでビルドできたことを確認したら、beagleboard rev.Cに対応するための修正を入れる。
http://groups.google.com/group/android-embedded-japan/browse_thread/thread/97ff059dac5e177c?pli=1

--- a/arch/arm/mach-omap2/board-omap3beagle.c 
+++ b/arch/arm/mach-omap2/board-omap3beagle.c 
@@ -434,7 +434,7 @@ static int beagle_twl_gpio_setup(struct device 
*dev, 
                /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR 
(out, active l 
                gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); 
-               gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1); 
+               gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); 
        } 
        else { 
                gpio_request(gpio + 1, "EHCI_nOC"); 

で、もう一回Kernelをビルドする。Kernelビルドにはそれほど時間がかからない(10分程度)なので。

ソースコードからビルドしたイメージで動作させる

次に自分でビルドしたkernelとrootfsを使って起動させてみる。kernelはrev.Cに対応していなくて修正が必要なので、まずrootfsを入れ替えてみる。
SDカードのrootfsパーティションを念のため再度フォーマットして、その上にrootfsを展開する。rootfは自分でビルドしたものをprebuildに入っていたのと同じようにtar.bz2で固めておき、それをSDカード上に解凍する。
bootとdataパーティションはそのままの状態でbeagleboard-xmに差し込んで起動するか確認。
できたら次はKernelも入れ替える。こっちはbootパーティションのuImageを上書きしたあと起動するか確認してみる。
自分の環境ではローカルでビルドしたrootfsとKernelでうまく起動できた。また、escキーがandroidのbackボタンとして効かないという不具合もローカルビルド版では解消されていた。

試行錯誤のメモ

上記の手順で動くまでいろいろと試行錯誤した。うまくいかなかった点をメモしておく。
最初はfroyoのKernelをbeagleboard-xm rev.Cに対応させるためのソース修正の方法がわからなかったので、froyoをあきらめてgingerbreadを試してみた。gingerbreadはrev.Cに対応しているとRelease Noteに書いてあるので。
gingerbreadのv2.1のprebuildを使ってみるも画面がうまく出力されず失敗。
prebuildはあきらめてソースからローカルビルドして試してみるもうまくいかない。なぜかrootfsのサイズがprebuildの半分くらいになってしまったりで、原因は不明。
あとSDカードを自分でフォーマットしないで、prebuildのmkmmc-android.shをつかってフォーマットした後で、それに対してファイルの上書き、削除、追加などをするとうまくいかないことがあった。
boot.scrを自分で作ったものにすると基本的にうまくいかなかった。これは作り方に何か問題があると思われ。
MLOもローカルビルドしたものだとよくなさそうだった。
で、今のやり方としては下記に落ち着いている。

  • 変更が必要ないMLO、u-boot、boot.scrはビルド済みバイナリを使う。MLOは付属のSDカードから。u-bootは書籍のサポートページから。boot.scrはDevKit2.0のprebuildイメージから。
  • Kernelは自分でrev.C用修正をしたソースからビルドしたものを使う。
  • rootfsはオリジナルのソースをビルドしたものを使う。
  • SDカードは自分でパーティションを切ってフォーマットをする。