BeagleBoard-xMとADK(Android Open Accessory Development Kit)


今年5月にgoogleから発表されたAndroid Open Accessoryについて
面白い試みであったことから話題になっておりましたが、
しかし発表当初はNexusシリーズしか使用できず対応ボードも少ないことから
用途も限定されておりました。
最近になって組み込みの定番のBeagleBoardADK互換ボードも潤沢に手に入るように
なってきましたのでGingerBreadとADKを載せる方法についてレポートいたします。

なお必要な作業全部を一気にやろうとすると息切れしてしまいそうな量になりますことから
これから3回に分けてBeagleBoardへのADK移植方法とFarmboxでの事例について記載して
いきたいと思います。

1回目 BeagleBoard-xMにGingerBread(2.3.4)とADKを移植
2回目 ADK-demoボードの使用方法
3回目 無線LANWebカメラを追加し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ボードの使い方については次回解説する予定です。

技術部 中村和貴