2012年7月22日日曜日

pandaboard ESで4AI.1.4(Android ICS)を動かしてみよう

Omappediaでは4AIというTI OMAP4向けのリリースが行われています。これは本来TIのOMAP4評価ボード向けのリリースであり、pandaboardでは動かすことができません。
ところがしかし!4AI.1.4 OMAP4 Icecream Sandwich Panda Noteというページが突然出現しました。
これはつまり、pandaboardでも動かせるということでしょうか。

今回はUbuntu 12.04(64bit版)と新規入手したpandabaord ESを使って試してみましょう。

環境準備
必要なパッケージのインストールについては、公式サイトに載っているのですが、こちらはまだUbuntu 11.10となっていて情報が古い。
ので、Linaroを参考にする方がよさそうです。

まずは以下のパッケージをまとめてインストールします。
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32z-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils uuid-dev libgl1-mesa-dev

さらに今回はUbuntu 12.04ですので、手順の通り、以下のパッケージもインストール。
$ sudo apt-get install lib32readline5-dev

加えて、今回のpandaboard用ビルドに必要となるパッケージをインストールします。参考はこちら
$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

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/にインストールされます。

Javaは、以前紹介したこちらの手順でJDK6をインストールしておきます。

repoツールについては以下のようにインストール。
$ mkdir ~/bin -p
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

ソースツリーのダウンロード
こちらの手順に従います。

まずはAndroidソースツリーのダウンロードです。
適当なワーク用ディレクトリ以下にて、
$ mkdir -p 4AI.1.4; cd 4AI.1.4
$ 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 RLS4AI.1.4_IcecreamSandwich.xml
$ repo sync
回線によっては半日近くかかりますので、気長に待ちましょう。

続いてはKernel
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/kernel/omap.git kernel/android-3.0
$ cd kernel/android-3.0
$ git checkout d5e6ee8b7b648094892e501b4ee6e2424d59f7d1

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

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

パッチあて
4AI.1.4というリリースはTIのOMAP4評価ボード用のソースコードです。そのため、pandaboardで動かすには、パッチをあてる必要があります。
手順の通りgit amでパッチを当てればよいのですが、私は容量削減のために.gitなどはすべて削除してあります。そのためpatchコマンドを使ってあてていきます。

まずはX-loaderへのパッチあて。
$ cd ${YOUR_PATH}/x-loader
$ wget https://gforge.ti.com/gf/download/user/9174/5768/xloaderpanda.patch
$ patch -p1 < xloaderpanda.patch

続いてはU-bootへのパッチあて
$ cd ${YOUR_PATH}/u-boot
$ wget https://gforge.ti.com/gf/download/user/9174/5769/ubootpanda.patch
$ patch -p1 < ubootpanda.patch

続いてはKernelへのパッチあて
$ cd ${YOUR_PATH}/kernel/android-3.0
$ wget https://gforge.ti.com/gf/download/user/9174/5770/kernelpanda1.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5771/kernelpanda2.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5772/kernelpanda3.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5775/kernelpanda4.patch
$ patch -p1 < kernelpanda1.patch
$ patch -p1 < kernelpanda2.patch
$ patch -p1 < kernelpanda3.patch
$ patch -p1 < kernelpanda4.patch

最後はAndroidへのパッチあて。
$ cd ${MYDROID}/device/ti/panda
$ wget https://gforge.ti.com/gf/download/user/9174/5778/devicepanda1.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5779/devicepanda2.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5780/devicepanda3.patch
$ patch -p1 < devicepanda1.patch
$ patch -p1 < devicepanda2.patch
$ patch -p1 < devicepanda3.patch
$ cd ${MYDROID}/device/ti/proprietary-open
$ wget https://gforge.ti.com/gf/download/user/9174/5777/proprietaryopenpanda.patch
$ patch -p1 < proprietaryopenpanda.patch
$ cd ${MYDROID}/device/ti/common-open
$ wget https://gforge.ti.com/gf/download/user/9174/5776/commonopenpanda.patch
$ patch -p1 < commonopenpanda.patch

ビルド手順を試していて手順通りではビルドが通らないという不都合があったので、下記パッチを当てます。コピペしてpanda_defconfig.patchという名前で保存しましょう。
--- a/kernel/android-3.0/arch/arm/configs/panda_defconfig
+++ b/kernel/android-3.0/arch/arm/configs/panda_defconfig
@@ -325,16 +325,16 @@ CONFIG_SND_OMAP_SOC_SDP4430=y
 CONFIG_SND_OMAP_SOC_OMAP4_HDMI=y
 CONFIG_SND_OMAP4_ABE_USE_ALT_FW=y
 # wl12xx support
-CONFIG_CFG80211=y
+CONFIG_CFG80211=m
 CONFIG_NL80211_TESTMODE=y
 CONFIG_LIB80211=y
-CONFIG_MAC80211=y
+CONFIG_MAC80211=m
 CONFIG_MAC80211_LEDS=y
 CONFIG_MAC80211_DEBUGFS=y
 CONFIG_USB_ZD1201=y
-CONFIG_WL12XX_MENU=y
-CONFIG_WL12XX=y
-CONFIG_WL12XX_SDIO=y
+CONFIG_WL12XX_MENU=m
+CONFIG_WL12XX=m
+CONFIG_WL12XX_SDIO=m
 CONFIG_CRYPTO_PCBC=y
 CONFIG_CRYPTO_MD4=y
 CONFIG_CRYPTO_MICHAEL_MIC=y
panda_defconfig.patchをあてる。
$ cd ${YOUR_PATH}
$ patch -p1 < panda_defconfig.patch

さらに.gitを消している場合ではビルドに失敗してしまうので下記のパッチも当てます。
当てます。 compat_driver_wl12xx.patchという名前で保存しましょう。
--- a/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/Makefile
+++ b/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/Makefile
@@ -7,8 +7,8 @@ define filechk_version.h
                        "$(shell git describe --dirty)";')
 endef
 
-$(obj)/version.h: .git/HEAD .git/index .git/refs/tags
-       @$(call filechk,version.h)
+#$(obj)/version.h: .git/HEAD .git/index .git/refs/tags
+#      @$(call filechk,version.h)
 
 $(obj)/main.c: $(src)/version.h
 
--- /dev/null
+++ b/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/version.h
@@ -0,0 +1,2 @@
+static const char *wl12xx_timestamp = __TIMESTAMP__;
+static const char *wl12xx_git_head = "BETA_01202012_01-1407-gd5e6ee8-dirty";
compat_driver_wl12xx.patchあて。
$ cd ${YOUR_PATH}
$ patch -p1 < compat_driver_wl12xx.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.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
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

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

. buildenv

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/compat/compat.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/net/wireless/cfg80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/net/mac80211/mac80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/wl12xx.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/wl12xx_sdio.ko system/lib/modules/

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

#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
$MYDROID/device/ti/support-tools/boot/omap4/umulti2.sh

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 cache

各シェルスクリプトには実行権限を与えておきましょう。下記のように実行します。
$ 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ブートイメージ書き込み
まだAndroidを起動できるSDカードを持っていない場合には、以下の2段階手順で書き換える必要があります。すでにAndroidが起動できるSDカードを持っている場合は、1段階目は飛ばしてOKです。

1段階目は、ブートローダが起動できるSDカードの作成手順です。

こちらのサイトで説明されているomap3-mkcard.shを開いて、テキストファイルに貼り付けます。
(※そのままダウンロードしてしまうと、HTMLファイルとなっているので、実行できません。)

UbuntuにSDカードを差して、omap3-mkcard.shに実行権限を与えておいた上で、
$ sudo ./omap3-mkcard.sh /dev/sdb
※/dev/sdbの部分はUbuntu上で認識されているSDカードのデバイスファイルを指定

SDカードのフォーマットが成功したら、いったんSDカードを抜き差しし、Ubuntuのファイルブラウザで認識させます。
下記で、ブートローダをbootパーティションに書き込みます。
$ cd ${YOUR_PATH}/omap4_sd_files_panda
$ cp MLO /media/boot/
$ cp u-boot.bin /media/boot/

書き込みが完了したら、SDカードをアンマウントしてUbuntuからは外し、pandaboard ESに差して電源を入れます。(シリアルコンソールで確認するのが良いですが、自動でfastbootモードに移行するはずです。)
pandaboard ESとUbuntuとをminiUSBケーブルで接続して下記コマンドをたたきます。
$ cd ${YOUR_PATH}/omap4_sd_files_panda
$ sudo ./fastboot oem format
$ sudo ./fastboot flash xloader MLO
$ sudo ./fastboot flash bootloader u-boot.bin
$ sudo ./fastboot reboot
これにより、SDカードがAndroid用にフォーマットされ、ブートローダのみが書き込まれた状態となります。

2段階目がこちらからです。
上記の最後のコマンドでリブートし、再びfastbootモードに入っているはずです。入ってなさそうであれば、いったん電源を切って、再度電源を入れなおしましょう。
※なお、2回目以降の書き換えでは、何もしないとKerneが起動してしまうので、シリアルコンソールでu-boot起動時に何かキーを押して止めるという手順が必要です。

pandaboard ESとUbuntuとをminiUSBケーブルで接続した状態で。
$ sudo ./fastboot flash boot boot.img
$ sudo ./fastboot flash system system.img
$ sudo ./fastboot flash cache cache.img
$ sudo ./fastboot flash userdata userdata.img
$ sudo ./fastboot reboot

これでAndroidが起動してくるはずです。以降、SDカードを差して電源を入れればAndroidが起動します。



壁紙がエラーなく表示できることがLinaroとの違いでしょうか。
しかし、これは、WiFiもBluetoothも起動しない...
まあ、また次回見ていきましょう。

2012年7月20日金曜日

UbuntuでJavaコントロールパネルの日本語文字化けを何とかする

さて先日、Ubuntu 10.10にJDKをインストールできたわけなんですが、
おもむろに、
$ /usr/lib/jvm/java-6-oracle/bin/ControlPanel
でJavaコントロールパネルなんかを開いてみると日本語が文字化けしとるやないか!


まあ実際、Javaコントロールパネルはどうでもいいのですが、最近私が使っている"Process Dashboard"も盛大に日本語が文字化けしておりまして、萎えていたところだったのです。(仕事がはかどらない!)

どうやら"Process Dashboard"の文字化けも、Javaコントロールパネルの文字化けも、日本語フォント設定に不備があることが原因のようです。

というわけで解決策。
$ cd /usr/lib/jvm/java-6-oracle/jre/lib/fonts/
$ sudo mkdir fallback
$ cd fallback
$ sudo ln -s /usr/share/fonts/truetype/takao/Takao* .
何をやっているかというと、javaの代替フォント用フォルダを作成し、そこに日本語TrueTypeフォントへのシンボリックリンクを作成するということ。(実際よくわかってませんが。)
日本語フォントの部分は自分の好きなものに変えてもらってかまわない。

これでもう一度、Javaコントロールパネルを表示させてみると...
見事に文字化けが直っている!
"Process Dashboard"の方も。。。
見事に文字化けが直っている!
これで仕事がはかどりますね!

めでたし、めでたし

(今回は以前にUbuntu 10.10へ手動でインストールしたJDKでの話ですが、他のJavaでも大体一緒だと思います。)


2012年7月16日月曜日

Ubuntu 12.04で10.04と同じ操作性(ユーザインタフェース)に変更する

Ubuntu 12.04ではインストールしたての状態だとUnityという今までとは異なる操作性を持ったデスクトップ画面が表示されます。
今後はこれに慣れていこうとは思ったのですが、やはり耐え難いwww
というわけでUbuntu 10.04と同じ操作性を持つGNOME Shellに変えてしまいましょう。

※インストール直後の場合は、まずはパッケージのUpdateをしておきましょう。パッケージが古いとUbuntuソフトウェアセンターに検索窓が付いてなかったりしますので。。。

Ubuntuソフトウェアセンターにて、
"gnome-shell"
を検索します。"GNOME Shell"というパッケージが検索結果に出てきますのでそれをインストールします。

インストール後は再起動を求められますので再起動を行いましょう。

さて、再起動してそのままログインしても元のUnityの画面のままです。
ユーザインタフェースを変えるには、ログイン画面で"GNOME"に変更してやる必要があります。

選択箇所は下図にて。

デフォルトでは"Ubuntu"の選択となっていますので、それを"GNOME"に変更します。
後は通常通りログインしましょう。
最低限の手順ですので、自由にカスタマイズして使いやすくしましょう。

以上。