Armadillo-500 FX用開発環境構築


概略

Armadillo-500 FX上で動作するAndroidのビルド環境構築について記載する。
記載、および、動作確認には、cupcakeバージョンを対象としている。
バージョンによっては、不要な手順もある。

目次



Armadillo-500 FXについて

Armadillo-500fxは、組込み向けの開発キットになる。
言い方を変えると、「高いおもちゃ」ということ。
仕様等の詳細は、公式となるAtmark Technoの紹介ページを見てください。


環境構築目標

Armadillo-500fx用の環境を作る上での目標をまとめておく。
テーマは、「手軽に、かっこよく」ってことで。
以下に、具体的な目的をまとめておく。
  • コマンドひとつで、カーネル+ユーザ層がビルドできるようにする
  • eeepc701用のビルドで採用されているように、vendor配下を作ってみる
  • 生成物を焼きやすい形にまとめるようにする
  • いろいろ手順が簡単になるようにする


ファイル取得

環境を作成する上で元となるソースの取得方法について記載する。
取得するソースは、2種類に分かれる。
  • AndroidのLinuxカーネル部分以外のソース
  • Linuxカーネル部分のソース

Androidのカーネル部分以外のソース

いわゆる、Androidのソースと言われる部分。
いつからか、カーネルが同時に取得できなくなったので、カーネル以外と記載している。
(Armadillo-500fxでは、カーネルも構築する必要があるためである。)
  1. Android開発環境構築の手順の中で、ソース取得準備まで実施する
  2. ソース取得方法(repo)にあるように、repoコマンドでソースを取得する
    • ビルドできるバージョンを使うため、”repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake"等バージョン指定を実施する
    • その後、"repo sync "を実施する

Linuxカーネル部分のソース

Linuxカーネルの部分を取得する。
この部分が主にハードウェア用のカスタマイズが必要な部分となる。
また、GPLライセンスに縛られているため、どこかで取得できる。
今回は、Armadillo-500fxが対象となるので、公式から取得する。
  1. ブラウザ等で、Armadillo-500 FXダウンロードを開く
  2. Linuxカーネルを取得(確認当時、v2.6.26-at6 でした)


ファイル配置

ダウンロードしたソースの配置について記載する。
以降の説明用には、この節で記載したフォルダ構成で記載する。

  1. ”repo init”、"repo sync"を実行したフォルダを「cupcake」とする
    • 「cupcake」配下に、「bionic」、「framework」等のフォルダがあることになる
  2. ダウンロードしたカーネルファイルを展開する
    • 展開すると、「linux-2.6.26-at6」というフォルダができる
  3. 展開したフォルダの名称を「kernel」と変更する
    • 「kernel」配下に、「drivers」等のフォルダがあることになる
  4. 「cupcake」フォルダの中に、「kernel」フォルダを移動する
    • 「cupcake/framework/base」、「cupcake/kernel/drivers/usb」等の階層となる

  • 注意事項
    • 階層の説明はわかりづらいかも・・。できたら、絵を追加したい。
    • 取得バージョンによっては、例で示すフォルダが存在しない場合がある。


カーネル修正

ダウンロードしたカーネルファイルには、Android用の修正が適用されていない状態である。
その為、Android用の修正を実施するために、修正パッチの適用を実施する。
  1. Android用パッチを取得する
    1. ブラウザ等で、公式ファイルブラウザ内のandroid directoryを開く
    2. 「linux-2.6.26-at-android-tmp-081210.patch」をダウンロードする
  2. カーネルにパッチを適用する
    1. カーネルフォルダ(cupcake/kernel)内に、ダウンロードしたpatchを移動する
    2. 端末で、カーネルフォルダ(cupcake/kernel)内に移動する
    3. 端末で、「patch -p1 < linux-2.6.26-at-android-tmp-081210.patch」を実施し、パッチを適用する
  3. ATDEを使用しない為、Makefileを一部修正する
    1. 「cupcake/kernel/arch/arm/plat-mxc/sdma/Makefile」をテキストエディタで開く
    2. 「KBUILD_CFLAGS := -I$(KBUILD_SRC)/arch/arm/plat-mxc/sdma/iapi/include \」の行を修正する
      • 「:=」の部分を「+=」に変更する



ユーザ空間修正

Armadillo-500fxでのcupcake版ビルドで、ユーザ空間で必要な修正について記載する。
カーネル、Androidバージョンの組合せに依存して発生する。
他の組合せだと不要かもしれない。
  • Armadillo-500fxで動かす場合のcupcake版での問題点
    • 起動時、バッテリ状態が取得できない為、ローバッテリだと判断して、電源OFFしてしまう
  • 対策方法(例:実際できないかも・・)
    1. 電源管理アプリでダミー値で処理する
    2. framework層(java層)でダミー値を返す
    3. JNI層(Linuxアプリ層)でダミー値を返す
    4. カーネル層でダミー値を返す

framework層とJNI層は、ほぼ同等で、java好きか、C++好きかになる。
ここでは、JNI層での修正方法を示す。

  1. 対象となるファイルをテキストエディタで開く
    • ”cupcake/frameworks/base/services/jni/com_android_server_BatteryService.cpp”
  2. バッテリ状態を返す関数の復帰値を変更する
    1. getBatteryStatus()
      • ”gConstants.statusUnknown”を常に返すように変更
    2. getBatteryHealth()
      • ”gConstants.healthUnknown”を常に返すように変更
    3. readFromFile()
      • bufに文字列”Unknown”(NULL終端付)を入れて、sizeを復帰値とした
      • (bufの領域は、自分できちんと確認してね・・壊れてるかも)
    4. setBooleanField()
      • 関数readFromFile()をコールし、結果で判断するif処理を削除
      • 変数valueを常にtrueに変更
      • (要するに、readFromFile()のコールを削除して、value固定化)
    5. setIntField()
      • 関数readFromFile()をコールし、結果で判断するif処理を削除
      • 変数valueを常に1に変更
      • (要するに、readFromFile()のコールを削除して、value固定化)



追加ファイル

ビルド時に、”TARGET_PRODUCT=armadillo500fx_dev”等と指定する為、vendor配下に追加するファイルについて記載する。

他の機種(eee_701等)と合わせる為、以下の階層にファイルを作成する
  • ”cupcake/vendor/atmarktechno/armadillo500fx_dev”
    • (これじゃなくても良さそうだけど・・なんとなく・・)

  1. 格納するフォルダを作成する
    • 上記の”cupcake/vendor/atmarktechno/armadillo500fx_dev”
  2. 格納フォルダ内にファイルを作成する
    1. Android.mk
      • Android版Makefileみたいなもの(呼ばれる順番不明)
      1. ”git clone git://codeaurora.org/platform/vendor/qcom/qsd8250_surf.git”でサンプルを取得
      2. 上記取得ファイルの中のAndroid.mkをコピー
        • コメントのみなので、不要である可能性有り
    2. AndroidBoard.mk
      • Android版Makefileみたいなもの(呼ばれる順番不明)
      1. ”git clone git://codeaurora.org/platform/vendor/qcom/qsd8250_surf.git”でサンプルを取得
      2. 上記取得ファイルの中のAndroidBoad.mkをコピー
      3. Armadillo-500 FX用に修正
        1. KERNEL_DEFCONFIGに指定するファイルを変更
          • (qsd8650_defconfig→armadillo500fx_dev_android_defconfig)
        2. キーボードマップファイルの指定ファイルを変更
          • (surf_keypad.kl→tuttle2.kl)
          • (surf_keypad.kcm→tuttle2.kcm)
        3. ブート用のビルド設定を削除
          • ”include vendor/qcom/$(TARGET_PRODUCT)/boot/Android.mk”を削除
        4. init.rcのコピー設定を追加
          • ”PRODUCT_COPY_FILES +=$(LOCAL_PATH)/init.rc:root/init.rc”を追加
          • (正しいか不明)
    3. AndroidProducts.mk
      • Android版Makefileみたいなもの(呼ばれる順番不明)
      1. ”git clone git://codeaurora.org/platform/vendor/qcom/qsd8250_surf.git”でサンプルを取得
      2. 上記取得ファイルの中のAndroidProducts.mkをコピー
      3. Armadillo-500 FX用に修正
        • (qsd8250_surf.mk→armadillo500fx_dev.mk)
    4. armadillo500fx_dev.mk
      • Android版Makefileみたいなもの(呼ばれる順番不明)
      1. ”git clone git://android.git.kernel.org/platform/vendor/htc/dream-open.git”でサンプルを取得
      2. 上記取得ファイルの中のhtc_dream.mkをコピー
      3. ファイル名を”armadillo500fx_dev.mk”へ変更
      4. Armadillo-500 FX用に修正
        • 変数”PRODUCT_NAME”を変更
          • (htc_dream→armadillo500fx_dev)
        • 変数”PRODUCT_DEVICE”を変更
          • (dream-open→armadillo500fx_dev)
        • 変数”PRODUCT_MANUFACTURER”の記載を削除
    5. BoardConfig.mk
      • Android版Makefileみたいなもの(呼ばれる順番不明)
      • デバイスに合わせてフラグ設定をまとめている?
      1. ”git clone git://codeaurora.org/platform/vendor/qcom/qsd8250_surf.git”でサンプルを取得
      2. 上記取得ファイルの中のBoardConfig.mkを参考に作成する
        • デバイス依存部の削除とブート関連記載の削除
        • (基本、genericで、カーネルビルドだけ付加した形かな)
      3. 以下がArmadillo-500 FX用の設定
        • TARGET_NO_BOOTLOADER := true
        • TARGET_NO_KERNEL := false(カーネルビルド用)
        • TARGET_NO_RADIOIMAGE := true
        • BOARD_USES_GENERIC_AUDIO := true
        • USE_CAMERA_STUB := true
        • TARGET_BOOTIMAGE_USE_EXT2 := true(たぶん、不要)
        • TARGET_USERIMAGES_USE_EXT2 := true(たぶん、不要)
    6. init.rc
      • 起動時に、initから参照される設定ファイル
      • initでのコマンド解釈ルールにより、動作する
      • 必須ではない為、”.mk”内にコピー用の記載が必要。
      • デフォルトだと、"cupcake/system/core/rootdir"内のファイルになる?
        • (要確認)同名ファイルが他に存在?
        • (要確認)環境変数”TARGET_PROVIDES_INIT_RC”が影響?
      1. デフォルトファイルから、”yaffs2”の記載がある行を”#”でコメントアウト
        • マウント設定、権限設定があるので、見直しの必要有り
    7. system.prop
      • 設定ファイル(よくわかっていない)
      • 予想:特定用途のライブラリ、インタフェイスの設定
      1. "cupcake/build/target/board/generic"内からコピー
    8. tuttle2.kcm
      • キーボードマップ関連(よくわかっていない)
      1. "cupcake/build/target/board/generic"内からコピー
    9. tuttle2.kl
      • キーボードマップ関連(よくわかっていない)
      1. "cupcake/build/target/board/generic"内からコピー
  3. カーネルをビルドする為に、"cupcake/kernel"配下にファイルを追加する
    1. AndroidKernel.mk
      1. ”git clone git://codeaurora.org/kernel/msm.git”でサンプルを取得
        • カーネル一式なので、重たいかも・・
      2. AndroidKernel.mkをcupcake/kernel内にコピー

  • サンプル
    • 2と3のサンプルを添付ファイルとしてアップ(armadillo_cust.tar.gz
    • ライセンスとか問題あったら、指摘してください

  • 注意事項
    • ”.mk”の記載ルールがはっきりとわかっていない為、間違ってるかも
    • 現状、不明なファイルについては、generic時に使用されるファイルを使用
    • 当初、書込みファイル自体不明だった為、不要な設定も含まれているかも


パス設定

Armadillo-500FXは、CPUがARMとなっている。
一方で、ビルドマシンとしては、x86を想定している。
上記のため、クロスコンパイラ用のパスを追加する必要がある。
その為のパス設定について記載する。

  • クロスコンパイラの場所
    • cupcake/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/
    • cupcake/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/
    • cupcake/prebuilt/linux-x86/toolchain/i686-unknown-linux-gnu-4.2.1/bin/

  • パス設定の追加
    1. "cupcake/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/”へのシンボリックリンクを作成する(以下、arm-eabi-4.2.1を作成したリンクとする)
      • 端末で、"ln -s"コマンドを使う
      • 上記手順は不要な場合がある
    2. 端末上で、"PATH=$PATH:arm-eabi-4.2.1"として、PATHへ追加する
      • 毎回書くのはめんどくさいので、.bashrc とか、ビルドスクリプトに入れると良い


ビルド方法

ビルド方法を記載する。

  1. 端末で、”cupcake”フォルダまで、移動する
  2. "export TARGET_PRODUCT=armadillo500fx_dev"とコマンドを入力する
  3. "make"とコマンドを入力する


ビルドスクリプト

ビルドの為のスクリプトを紹介しておく
ビルドの為の設定が面倒くさい為に作成した。

  1. ”build_dev.sh”を作成
    • 名前はなんでも良い
    • (あくまで、参考程度・・)
    1. パス設定を記載
    2. 環境設定を記載(例:"export TARGET_PRODUCT=armadillo500fx_dev")
    3. ビルドコマンドを記載(”make”等)

上記ファイルを作成すると、ビルドは以下の手順で良い
  1. 端末で、"cupcake"フォルダに移動する
  2. ". build_dev.sh"とコマンドを入力する


ビルド生成物

上記ビルド構築環境でのビルド生成物について記載する

  • ビルド生成物作成フォルダ
    • cupcake/out/target/product/armadillo500fx_dev

  • Armadillo書込み対応ファイル/フォルダ
    • カーネル
      • cupcake/out/target/product/armadillo500fx_dev/kernel(以降、$KERNEL)
    • ユーザランド
      • cupcake/out/target/product/armadillo500fx_dev/root(以降、$ROOT)
      • cupcake/out/target/product/armadillo500fx_dev/system(以降、$SYSTEM)

  • Armadillo-500 FXへの書込み
    1. $KERNELをhermit等でカーネル領域に書き込む
    2. ROMのユーザ領域には、Armadillo開発者サイトにあるAtmark Distユーザランドを書き込む
    3. Androidユーザ層を構築する
      1. ローカルに"android"フォルダを作成する
      2. $ROOTのフォルダ/ファイルを”android”内にコピー
      3. $SYSTEMのフォルダ/ファイルを”android/system”内にコピー
    4. 構築したユーザ層をArmadillo-500 FXの/dev/sda1に書き込む

  • 注意事項
    • 構築するアプリ等に依存して、別途dataフォルダの考慮が必要になる


未解決問題

未解決な問題について記載する

  1. ビルド生成物の操作方法
  2. ”chroot”を使わないArmadillo-500FXのAndroid起動方法
  3. 各種、環境変数の影響
  4. キーマップファイルの効果
  5. .mkファイル内のAndroid特有コマンド

何かあれば、書き込みます・・。

検証中

未解決問題の中で、今、検証中のものを記載する。
途中経過も書いていければいいな。

現状、検証中はありません。
最終更新:2009年09月28日 23:54
添付ファイル