2011年9月1日木曜日

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



f:id:bs-android:20110829225748j:image:w640


今年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用の小さいほう)に接続すると


 次のような画面が出るはずです。


f:id:bs-android:20110829225747j:image:w640





 ADKボードの使い方については次回解説する予定です。


技術部 中村和貴





140 180 Android

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...