2013年3月3日日曜日

pandaboard ESで4AJ.2.2(Android JB)を動かしてみよう

Omappediaで公開されたpandaboard向けの
4AJ.2.2 OMAP4 Jelly Bean Panda Notes
を実践してみたレポートでございます。

大まかな手順については、以前の4AI.1.4と同じですが、細々と変わってる部分もありますので、また一通り書いておきます。

使うのはUbuntu 12.04(64bit版)と、pandaboard ESです。


環境準備
手順の通りでOK。

まずは以下のパッケージをインストールします。
$ sudo apt-get install git-core flex bison gperf libesd0-dev zip gawk ant libwxgtk2.6-dev zlib1g-dev build-essential tofrodos
$ sudo apt-get install lib32readline6-dev libstdc++6 lib32z1 lib32z1-dev ia32-libs g++-multilib libx11-dev lib32ncurses5-dev uboot-mkimage

追加で
$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

手順には載ってませんが、ビルドが通らないため以下も追加で
$ sudo apt-get install libxml2-utils xsltproc kpartx

armのツールチェインのインストールについては、下記の手順を例に。
$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ sudo mkdir -p /opt/toolchains
$ sudo tar jxvf arm-2010q1-202-* -C /opt/toolchains/
/opt/toolchains/arm-2010q1/にインストールされます。

repoツールの入手
$ mkdir ~/bin -p
$ sudo apt-get install curl
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

JDK6についてはこちらを参照。


ソースツリーのダウンロード
ここは手順通りでOKです。

まずはAndroidのソースツリーのダウンロード。
適当なワーク用ディレクトリ下にて、
$ mkdir -p 4AJ.2.2; cd 4AJ.2.2
$ export YOUR_PATH=`pwd`
$ mkdir -p mydroid; cd mydroid
$ export MYDROID=`pwd`
$ repo init -u git://git.omapzoom.org/platform/omapmanifest.git -b 27.x -m RLS4AJ.2.2_JellyBean.xml
$ repo sync
回線によっては半日近くかかりますので、気長に待ちましょう。

続いてはKernel。githubに変わっていますね。
$ cd ${YOUR_PATH}
$ git clone git@github.com:icepeda/omap.git kernel/android-3.0
$ cd kernel/android-3.0
$ git fetch origin icepeda-panda-4aj22:master
$ git checkout master
Permission denied (pubickey).
と怒られてしまった場合は、こちらを参照。

続いてはU-boot
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/u-boot.git u-boot
$ cd u-boot
$ git checkout 2af35fca236557add6fdd33b836bf5c64455ac8f

続いてはX-loader
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/x-loader.git x-loader
$ cd x-loader
$ git checkout 4975b24da3887edff5cd24e44ca7cb4013f04239

パッチあて
こちらも基本手順の通りでOK。

まずはX-loaderへのパッチあて。
$ cd ${YOUR_PATH}/x-loader
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6228/xloaderpanda.patch
$ git am xloaderpanda.patch

続いてはU-bootへのパッチあて
$ cd ${YOUR_PATH}/u-boot
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6229/ubootpanda.patch
$ git am ubootpanda.patch

Kernelへのパッチあては必要なし
最後はAndroidへのパッチあて。
$ cd ${MYDROID}/device/ti/panda
$ git fetch git@github.com:icepeda/panda.git icepeda-panda-4aj22:master
$ git checkout master
$ cd ${MYDROID}/device/ti/proprietary-open
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6240/proprietaryopenpanda.patch
$ git am proprietaryopenpanda.patch
$ patch -p1 < devicepanda3.patch
$ cd ${MYDROID}/hardware/ti/wlan
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6239/hardwarepanda.patch
$ git am hardwarepanda.patch
$ cd ${MYDROID}/hardware/ti/dvp/
$ wget https://gforge.ti.com/gf/download/frsrelease/1021/6404/hardwarepanda2.patch
$ git am hardwarepanda2.patch
最後のパッチだけ手順とは当てる場所が異なっていますので注意。


ビルド
面倒なのでスクリプトを書きましょう。(単なるコピペですが。)

まずは環境変数のセット。下記をbuildenvというファイル名で保存しましょう。
#common
export YOUR_PATH=`pwd`
export PATH=$PATH:/opt/toolchains/arm-2010q1/bin
export MYDROID=${YOUR_PATH}/mydroid
mkdir -p $MYDROID/logs
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=${YOUR_PATH}/u-boot/tools:$PATH
 
#for WLAN Driver
export KERNEL_DIR=${YOUR_PATH}/kernel/android-3.0
export KLIB=${KERNEL_DIR}
export KLIB_BUILD=${KERNEL_DIR}
 
#for SGX Driver
export KERNELDIR=${YOUR_PATH}/kernel/android-3.0
X-loaderのビルドを行うbuild_xloader.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/x-loader
make distclean
make ARCH=arm omap44XXpanda_config
make ift 2>&1 |tee $MYDROID/logs/x-loader_make.out

U-bootのビルドを行うbuild_uboot.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/u-boot
make distclean
make ARCH=arm omap44XXpanda_config
make 2>&1 |tee $MYDROID/logs/u-boot_make.out

KernelとModuleのビルドを行うbuild_kernel.KernelとModuleのビルドを行うbuild_kernel.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/kernel/android-3.0
#make ARCH=arm distclean
make ARCH=arm panda_defconfig
make ARCH=arm uImage 2>&1 |tee $MYDROID/logs/kernel_make.out
make ARCH=arm modules 2>&1 |tee $MYDROID/logs/kernel_modules.out
WLAN Driverのビルドを行うbuild_wlan_driver.shです。
#!/bin/bash
 
. buildenv
 
cd $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx
make ARCH=arm 2>&1 |tee $MYDROID/logs/wlan_driver_make.out

Androidのビルドを行うbuild_android.shです。
#!/bin/bash
 
. buildenv
 
cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng
#make clean ;#(required for rebuild only)
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4 -j4 2>&1 |tee $MYDROID/logs/android_make.out

OMAP4OMAP4に搭載されているGraphicアクセラレータ用のSGX Driverをビルドするbuild_sgx_driver.shです。
#!/bin/bash

. buildenv

if [ ! -d $MYDROID/device/ti/proprietary-open/omap4/sgx_src/eurasia_km ]; then
   cd $MYDROID/device/ti/proprietary-open/omap4/sgx_src
   tar xzf eurasia_km.tgz
fi

cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng

cd $MYDROID/device/ti/proprietary-open/omap4/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- TARGET_PRODUCT="blaze_tablet" BUILD=release TARGET_SGX=540 PLATFORM_VERSION=4.0
最後は、書き込むイメージを一か所にまとめるbuild_img.shです。
#!/bin/bash

. buildenv

#Preparing Android binaries
export BOARD_TYPE="panda"

cd $MYDROID/out/target/product/$BOARD_TYPE
mkdir -p system/lib/modules
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/compat/compat.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/net/wireless/cfg80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/net/mac80211/mac80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/drivers/net/wireless/wl12xx/wl12xx.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/drivers/net/wireless/wl12xx/wl12xx_sdio.ko system/lib/modules/

cp $MYDROID/out/target/product/$BOARD_TYPE/target/kbuild/pvrsrvkm_sgx540_120.ko system/lib/modules/

#Updating Ducati
cd ${MYDROID}/out/target/product/panda/system/vendor/firmware/
rm ducati-m3.bin
wget https://gforge.ti.com/gf/download/frsrelease/997/6342/4AJ.2.2_Blaze_ducati-m3.bin
mv 4AJ.2.2_Blaze_ducati-m3.bin ducati-m3.bin

#Preparing images
cd $YOUR_PATH
mkdir -p omap4_sd_files_$BOARD_TYPE
cd omap4_sd_files_$BOARD_TYPE
cp -f $MYDROID/out/host/linux-x86/bin/fastboot .
cp -f $MYDROID/out/host/linux-x86/bin/mkbootimg .
cp -f $MYDROID/out/host/linux-x86/bin/simg2img .
cp -f $MYDROID/out/host/linux-x86/bin/make_ext4fs .

cp -f ${YOUR_PATH}/x-loader/MLO .
cp -f ${YOUR_PATH}/u-boot/u-boot.bin .
cp -f ${YOUR_PATH}/kernel/android-3.0/arch/arm/boot/zImage .

#Creating img files
cd ${MYDROID}
find out/target/product/$BOARD_TYPE -name *.img -exec rm -f {} \; 
source build/envsetup.sh
lunch full_panda-eng
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4
cp -f ${MYDROID}/out/target/product/$BOARD_TYPE/*.img $YOUR_PATH/omap4_sd_files_$BOARD_TYPE

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
./mkbootimg --kernel zImage --ramdisk ramdisk.img --base 0x80000000 --board omap4 -o boot.img

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
dd if=/dev/zero of=./cache.img bs=1048510 count=128
mkfs.ext4 -F cache.img -L cach

各シェルスクリプトには実行権限を与えておきましょう。下記のように実行します。

$ cd ${YOUR_PATH}
$ ./build_xloader.sh
$ ./build_uboot.sh
$ ./build_kernel.sh
$ ./build_wlan_driver.sh
$ ./build_android.sh
$ ./build_sgx_driver.sh
$ ./build_img.sh

SDカードへのAndroidブートイメージ書き込み
ここは完全に前回と同じですので略..
シリアルコンソールでautobootを止めて、fastbootで書き換えるいつもの手順です。

起動させてみると...


なんか画面の大きさが...期待外れ...
一応WiFiは動く。
Bluetoothは起動せず。

画面遷移などはわりとサクサク動きますね。
ブラウザは凄まじく動作が重いですが。

ソースコードはあるので、カスタマイズできると面白くなるかも。

一応、以上です。