Armadillo-500へのAndroidポーティング手順

今回はArmadillo-500へAndroidをポーティングする手順の詳細を解説します。

  1. 開発環境を整える
    1. ロスコンパイル環境を整える
      1. VMWarePlayerをダウンロードしてインストールします。
      2. アットマークテクノさんのArmadillo開発者サイトから、クロスコンパイル環境の入ったATDE (vmwareイメージ)をダウンロードします。
      3. ダウンロードしたzipファイルを解凍し、vmxファイルを開きます。※VMWarePlayerをインストールしていれば関連付けられているはずです。
      4. ここを参考にカーネルコンパイルができるようにします。※Armadillo-9の部分はArmadillo-500に置き換えてください。
  2. カーネルを2.6.23にする
    1. 上記で構築できるArmadillo-500のカーネルは2.6.18なので、そのままではAndroidは動きません。2.6.23のカーネルにする必要があります。http://www.kernel.org/pub/linux/などから2.6.23のソースを取得します。
    2. Armadillo-500の差分抽出の為、http://www.kernel.org/pub/linux/から2.6.18のソースも取得しておきます。
    3. linux-2.6.18、linux-2.6.18-at3(手順1-1-4でダウンロードしたもの)、linux-2.6.23の3種類環境ができるのでlinux-2.6.23へlinux-2.6.18とlinux-2.6.18-at3の差分をマージしていきます。※driver/mmc関連はディレクトリ構造やヘッダ構成がかなり変わっている為、手に負えない場合はマージしないで置いてもAndroidは動くので、Androidの起動を優先させるなら、マージをとばしてもよいでしょう。その他のコンパイルエラーが出た場合は気合で直します。
    4. 手順1-1-4で作成したlinux-2.6.xのシンボリックリンクを削除し*1、マージしたlinux-2.6.23にシンボリックリンクを張っておきます。*2
    5. make configで手順1-1-4と同じようにmake configします。この時、未設定のものに対していろいろ聞かれますが、とりあえずEnter押しっぱなしでデフォルト設定で抜けても大丈夫です。Choose SLAB allocator"でSLOBを選択することでpanicを回避することが出来るようです。">*3
    6. マージした環境をコンパイルし、バイナリを焼いてブートするか確認します。
    7. make menuconfigを実行してKenrnel FeaturesのEABIのコンパイルオプションを選んで、再度コンパイルします。他の設定を変更するとブートしなくなることがあるので、あまりいじらないほうがよいでしょう。*4
    8. バイナリを焼いてブートするか確認しておきます。
  3. Android差分のマージ
    1. BennoさんのAndroid.diffファイルを使用して上記のマージした環境に以下のようにしてパッチを当てます。※一部でrejファイルが出来るので、手動でマージします
    2. make menuconfigでlow memory killer*5とopen binder*6にチェックを入れておきます。
    3. コンパイルし、カーネルを焼いて動作するかどうか確認します。

これでAndroidを起動する為の下地が整いました。
もっと簡単な方法があるのですが、それは後日書きます。

次回はユーザーランドの構築方法について解説します。

*1:atmark-distのディレクトリで rm linux-2.6.x

*2:同じくatmark-distのディレクトリで ln -sv ../linux-2.6.23 linux-2.6.x

*3:こちらでマージした環境ではブート時にpccardまわりでNULLアクセスが発生してkernel panicになりました。make menuconfigの"General setup--->Choose SLAB allocator"でSLOBを選択することでpanicを回避することが出来るようです。

*4:原因は不明。EABIに対応できていないものがある模様。

*5:Device Drivers--->Misc devices--->Low Memory Killer ・・・なくても動きますが、パフォーマンスが恐ろしく低下します。

*6:Device Drivers--->Character devices--->OpenBinder IPC Driver