今年5月にgoogleから発表されたAndroid Open Accessoryについて
面白い試みであったことから話題になっておりましたが、
しかし発表当初はNexusシリーズしか使用できず対応ボードも少ないことから
用途も限定されておりました。
最近になって組み込みの定番のBeagleBoardやADK互換ボードも潤沢に手に入るように
なってきましたのでGingerBreadとADKを載せる方法についてレポートいたします。
なお必要な作業全部を一気にやろうとすると息切れしてしまいそうな量になりますことから
これから3回に分けてBeagleBoardへのADK移植方法とFarmboxでの事例について記載して
いきたいと思います。
1回目 BeagleBoard-xMにGingerBread(2.3.4)とADKを移植
2回目 ADK-demoボードの使用方法
3回目 無線LANとWebカメラを追加しFarmboxのプラットフォームとする
○1回目 BeagleBoard-xMにGingerBreadとADKを移植
まず1回目としてBeagleBoardでGingerBreadが動作させられるようにします。
☆ADKには2.6.35以降のカーネルと2.3.4r1のGingerBreadが必要
既にいくつかのコミュニティにてGingerBreadを動作させている事例が出ておりますが
ADKを使用するためには次の要件を満たす必要があることから2.6.35以降のカーネルと
GingerBread(2.3.4r1)以降のコードが必要となります。
1) USB compositeデバイスドライバ
2) Android Accessory Service
ちょうど7月にTIからこれらの要件を満たした新しいBSPがリリースされましたことから
今回はこのBSPのオープンソース版を利用することにしました。
1.開発マシンのセッティング
今回こちらでは次の環境で作業を行いました。
Ubuntu 10.10 (32bit版)
Oracle VirtualBox 4.0.10
なお GingerBreadでは64bitビルド環境が必要とされていますが、今回使用するソースコードでは
32bit版でもビルド可能なようになっておりますことから、作業は32bit版で行っています。
また作業の都合で仮想環境を用いておりますが、こちらは必須ではありません。
1-1. 必要なパッケージのインストール
Android開発で必要なパッケージをインストールします。
$ sudo apt-get install git-core flex bison gperf libesd0-dev libwxgtk2.6-dev zlib1g-dev build-essential libstdc++5 tofrodos
$ sudo apt-get install x-dev libx11-dev libncurses5-dev
Ubuntu 10.10においてJAVA-JDKがインストールすることができない場合は
手動でrepositoryを追加してからインストールします
$ sudo add-apt-repository ppa:sun-java-community-team/sun-java6
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ sudo update-java-alternative -s java-6-sun
次にソースコード取得に必要なrepoを ~/bin以下にダウンロードします。
$ mkdir ~/bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
2.作業ディレクトリの作成と環境設定
今回は作業ディレクトリとして ~/rowboat-gingerbread を使用するようにします。
ディレクトリ名は自由に変更してもかまいません。
また作成したディレクトリを環境変数MYWORKに設定します。
$ mkdir ~/rowboat-gingerbread
$ export MYWORK=~/rowboat-gingerbread
$ export PATH=~/bin:$PATH
3.ソースコードの取得
BeagleBoard用のGingerBreadはrowboatプロジェクトにて公開されているものを利用します。
OMAP3対応のkernel-2.6.37とGingerBread-2.3.4r1が既にマージされていることから
Android本体とカーネルはこれをそのまま使用することができます。
3-1.まずダウンロードの前に次のrepo設定を行います
$ cd $MYWORK
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-GingerBread-2.3.4-DevKit-2.1.xml
途中メールアドレス入力を要求されますが適当なメアドでもかまいません。
3-2.ソースコードのダウンロード
repo設定が成功したらソースコードのダウンロードを行います。
次のコマンドラインを実行するとダウンロードが開始されます、接続先のサーバー速度の関係で数時間ぐらい
待たされることがあります。
$ repo sync
またごくまれですが接続先サーバーがダウンしていてダウンロードが失敗することがあります、
この場合は再実行するようにしてください。
4.各種パッチの適用
ソースコードの取得が終わったらADK関連のパッチを当てます。
4-1. MSM-Accessoryパッチ
ADKのコードはMSM(Qualcomチップ)向けに作られて公開されています。
http://android.git.kernel.org/?p=kernel/msm.git;a=shortlog
今回は上記サイトから取得した差分を利用するようにしています。
こちらにアーカイブしてありますので ~/ 以下に展開しておいてください。
次のように kernel以下に移動してパッチを適用します。
MSM向けパッチをそのまま利用することから、実行中にいくつか Hunkとエラーが出でますが
次項のパッチにて補填していますので気にせず進めてください。
$ cd $MYWORK/kernel
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-d7784832481a3d13e8f919db7eabc402696998e1.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-ead002dbe5a670536874d4cf2b4c73cbbc426157.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-5d9d8625e39f815673dedea353f39edccabb1fac.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-4aaac2e5495f5bde877c0221fb3a8afacbf5d3d3.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-9cf8b58077c7bfaeb91d3cd111775ca556879c8c.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-6f992b5fa6b9e20a406df75c52e212927b51e868.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-64bef932a63b68eb5a64d07364150ffdfba133c8.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-148b63e6082d35d9a5ec0f156d76ca40a4278044.patch
$ patch -p1 < ~/ADK_Patches/msm_patches/msm.git-3cb34390dbf3d219c823638a9ff835ae555cce48.patch
なお同パッチのうち次のパッチは使用しません
msm.git-768b24639b4dfd527928ea7ff5ce5b7cabb15a80.patch
usb: gadget: Fixed Android gadget function discovery & product matching
<これはすでに適用済み>
msm.git-3ac4a31f2d603d6dabc50fe9e2fa4ebd4e7a4e59.patch
msm.git-52630a39c5c9348381cec1b623def97f948f4df9.patch
これはMSM固有であるため次項4-2のパッチを使用します。
4.2. BeagleBoardパッチ
前項のMSM-Accessoryパッチで不足しているパッチを適用します。
$ cd $MYWORK/kernel
$ patch -p1 < ~/ADK_Patches/beagleboard/beagleboard_kernel.patch
$ cd $MYWORK/device
$ patch -p1 < ~/ADK_Patches/beagleboard/beaglebard_device.patch
このパッチでは次の内容を修正しています
a) accessory gadgetドライバをビルド対象にするための Makefile設定
b) usb compositeドライバで使用される USBディスクリプタテーブルの追加
c) rowboatカーネルでは USBインターフェイスが1つしか登録できないことから
複数のインターフェイスが登録できるように修正
d) カーネルのコンフィグレーションファイルに accessory gadgetを追加
e) Android Accessoryサービスが有効になるようxmlファイルを修正
f) Android Accessory関連ファイルがAndroid FSにインストールされるよう設定ファイルを追加
5.ビルド
ビルド作業はMLO,u-boot,AndroidFSの順に進めていきます。
5.1 x-loader
OMAP3の1次ローダであるMLO(x-loader)は次のようにビルドします
$ cd $MYWORK/x-loader
$ export CROSS_COMPILE=$MYWORK/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
$ make distclean
$ make omap3beagle_config
$ make
なお出来上がったx-loader.binは”SecureOMAPの署名が付いていません
BeagleBoardはSecureOMAPの署名は必要ありませんが念のため付加しておきます。
署名に必要なsignGP コマンドは次のように入手します
$ wget http://beagleboard.googlecode.com/files/signGP
$ chmod +x signGP
signGPコマンドが入手できたら次のコマンドで署名付きにします
$ ./signGP x-load.bin
$ mv x-load.bin.ift MLO
5.2 u-boot
OMAP3の2次ローダーであるubootは次のようにビルドします
$ cd $MYWORK/u-boot
$ export CROSS_COMPILE=$MYWORK/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
$ make distclean
$ make omap3_beagle_config
$ make
次項のカーネルのビルド時に本項でビルド生成したmkimageが必要となりますので
~/binにコピーしておきます
$ cp tools/mkimage ~/bin
5.3 Andorid FS
今回使用しているコードではLinuxカーネル、Andorid、SGXをまとめてビルドすることができます
BeagleBoard-xMはAM37xxを搭載しているので環境変数 "OMAPES"に "5.x"を使用します。
なお、本来GingerBreadは64ビット環境でしかビルドすることができませんが
rowboat版では64ビットコンパイルオプションを設定をコメントアウトしてあることから
32ビット環境でもビルドすることができます。
$ cd $MYWORK
$ make TARGET_PRODUCT=beagleboard -j8 OMAPES=5.x
Installation complete! と表示されればビルド完了です。
5.3-1 カーネル再コンパイル
カーネルだけ再ビルドしたいときには次のコマンドを使用します
$ cd $MYWORK
$ export ARCH=arm
$ export CROSS_COMPILE=$MYWORK/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
$ make -C kernel uImage
6.SDカードイメージを作成
生成されたバイナリをインストール用にアーカイブします
$ cd $MYWORK/out/target/product/beagleboard
$ mkdir android_rootfs
$ cp -r root/* android_rootfs
$ cp -r system android_rootfs
$ sudo ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs \
. rootfs rootfs.tar.bz2
7.SDカードへのインストール
7.1 ブートスクリプトの作成
BeagleBoard-xMではカーネルに起動パラメータを渡すためにブートスクリプトが必要となります
ブートスクリプトは次の方法にて生成することができます
$ cd $MYWORK
$ cp ~/ADK_Patches/beagleboard/boot.script .
$ $MYWORK/u-boot/tools/mkimage -A arm -O Linux -T script -C none -a 0 -e 0 -n ./boot.script -d ./boot.script ./boot.scr &> /dev/null
ここで使用しているテンプレートではDVI出力に 1280x720で表示するように設定しています
これ以外の表示設定をしたい場合はパラメータを書き換えてスクリプトを再生成してください
7.2 SDカードのフォーマット
SDカードから起動するためにはSDカードをパーテション分割しフォーマットする必要があります
次のコマンドでSDカードをフォーマットを行います
ここではUSB接続されたSDカードリーダが「/dev/sdb」として認識されているものとして記述しています
もし別のデバイス名として認識されている場合は、この部分を読み替えて実行するようにしてください。
$ sudo ~/ADK_Patches/omap3-mkcard.sh /dev/sdb
このomap3-mkcard.shでは SDカードを2分割し第1パーテーションをvfat、第2パーテションをext3で
フォーマットしています
7.3 バイナリのインストール
SDカードの第1領域にブートローダ、カーネルをインストール、第2領域にAndorid FSをインストールします。
インストールは MLO, uboot.bin, boot.scr, uImageの順にコピーする必要があります
$ sudo mount /dev/sdb1 /mnt
$ sudo cp $MYWORK/x-loader/MLO /mnt/
$ sudo cp $MYWORK/u-boot/u-boot.bin /mnt/
$ sudo cp $MYWORK/boot.scr /mnt/
$ sudo cp $MYWORK/kernel/arch/arm/boot/uImage /mnt/
$ sudo umount /mnt
$ sudo mount /dev/sdb2 /mnt
$ cd /mnt
$ sudo tar xvjf $MYWORK/out/target/product/beagleboard/rootfs.tar.bz2
$ cd /
$ sudo umount /mnt
8.BeagleBoard-xMでの起動
SDカードをBeagleBoard-xMに装着し、電源を投入します
なおAndroidが起動するまで数分かかります
また初回起動の際にはホーム画面が出てもしばらくの間はバックグランドでインストールが
続いていることから多少動作レスポンスが遅くなりますが、次回起動時には通常となります。
9.ADKボードの接続
もしDemoKitが書き込まれたADKボードがあれば、USBポート(ADB用の小さいほう)に接続すると
次のような画面が出るはずです。
ADKボードの使い方については次回解説する予定です。
技術部 中村和貴