Lionaroid技術ブログ

Androidやドローンに関する技術的な記事やiRacingなどのシミュレータに関する記事

Beagle Board C4で0xdroidをSDからブートする方法まとめ

デ部H/Wチーム活動の一環として、BeagleBoard(Rev.C4)を購入したので、早速ブートに挑戦しました。
記憶を辿りながら、後日のためのメモの意味も含めてまとめてみたいと思います。
今回はチームの大先輩おすすめの0xdroidのソースからのインストールにチャレンジしてみました。

ビルド環境
ビルドの環境はUbuntu 9.10(Japanese)です。 Ubuntuのインストールについては省略。
最初、他のAndroid SDKをビルドしていたUbuntu 8.04(Japanese)でビルドしようと思っていたのですが、ビルド途中でglibc2.8が存在せず(2.7だった)、glibcのアップグレードは非常に大変のようなので別途新規にインストールしました。
ちなみに私はMacBook ProVmware Fusion上でUbuntuを使ってますが、こういう時は簡単に追加でインストールできるので最高です!
 実際のビルドに入る前に


 $ sudo apt-get upgrade
を実行して、パッケージを最新にしておくことをおすすめします。

Android(0xdroid)のソースダウンロード〜ビルド
0xdroidのサイトへ行き、Wiki > Get the Sourceのページを開きます。
このページの手順に従い、環境を構築して行きます。

Java SDKのインストール
まずは、Java SDKのインストールです。0xdroidのビルドにはJava5が必須なのですが、残念ながらUbuntu 9.10では既にサポートが切れており、デフォルトパッケージに含まれていません。
したがって、別途Java5 SDKをインストールする必要があります。
解決策としてSourceのページには、


If you are using Ubuntu Linux 9.10, just add these two line in file /etc/apt/sources.list:
 $ deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates multiverse
 $ deb
-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates multiverse
などと書くように指示されていますが、実際はこの通りに記述しても動きませんw
実際は、/etc/apt/sources.listに上記2行が既に含まれているので、この行のうち「karmic」を「jaunty」(=以前のバージョンの呼び名)に書き換えます。
 $ deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
 $ deb
-src http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
 その後はSourceのページにある通りにコマンドを実行して、Java5をインストールします。
 $ sudo apt-get update
 $ sudo apt
-get install sun-java5-jdk
既に別バージョンのJavaがインストールされている場合は、下記を実行してJava5を利用にするように変更します。 
 $ sudo update-alternatives --config java

Git,Repo,その他のビルドのためのツールのインストール
0xdroidのソースをダウンロードするためにgitとrepoをインストールします。
ついでに、後でビルドで苦労しないように必要そうなツールをまとめてインストールしちゃいます。

 $ sudo apt-get install git-core curl zlib1g-dev flex ncurses-dev libx11-dev gperf uboot-mkimage
repoはcurlコマンドを使ってインストールします。ダウンロードしたファイルに実行権限を付けてやることを忘れずに。 
 $ curl -o ~/bin/repo http://android.git.kernel.org/repo
 $ chmod a
+x ~/bin/repo

0xdroidのソースのダウンロード
repoがインストールできたら、次に0xdroidのソースをダウンロードします。
ホームディレクトリの下に適当なディレクトリを作って、その中でコマンドを実行します。

 $ mkdir beagle-donut
 $ cd beagle
-donut
 $ repo init
-u git://gitorious.org/0xdroid/manifest.git -b beagle-donut
 $ repo sync

repo syncでダウンロード開始しますが、ダウンロードには相当の時間がかかります。(マシンの性能によって変動)
ちなみに、repo syncに問題が生じる場合は、Sourceのページに記載のミラーサイトも利用することが可能なようです。

0xdroidのソースのビルド
0xdroidのソースのビルドは簡単です。下記を実行して、ビルド用のMakefileを作ります。

 $ echo "TARGET_PRODUCT := beagleboard” > buildspec.mk
 $ echo “INSTALL_PREBUILT_DEMO_APKS := true” >> buildspec.mk
その後、makeします。
 $ make
makeには相当の時間がかかります。ビルドに必要なツールがインストールされていない場合、エラーとなってビルドが中断されます。
その際はエラーの状況によりますが、必要そうなパッケージを探して、apt-get installでインストールしてやります。
エラーとなったファイル名等からインストールすべきパッケージが不明な場合、下記のコマンドが便利です。

 $ apt-get search <エラーとなったファイル名>

このコマンドを実行やることで、ファイル名を含むパッケージが表示されます。
大体、○○-devとか、lib○○といったパッケージがインストールすべきパッケージとして多いです。

makeが成功してビルドが完了すると、下記のルートファイルシステム(Root File System:RFS)が生成されます。

Linuxカーネルソースのダウンロードとビルド
次に、先ほど作成したシステムイメージをブートするためのuImageを生成するため、Beagle用にカスタマイズを施したLinuxカーネルのソースをビルドします。
ビルドしたファイル群はkernelディレクトリに展開されています。

 $ cd ..
 $ git clone git
://gitorious.org/0xlab-kernel/kernel.git
 $ cd kernel
 $ git checkout
-b kernel_omap3 origin/omap3
 $ make ARCH
=arm omap3_beagle_defconfig
 $ make ARCH
=arm CROSS_COMPILE=../beagle-donut/prebuilt/linux-x86/toolchain/arm-android-eabi-4.4.1/bin/arm-android-eabi- uImage
 $ make ARCH
=arm CROSS_COMPILE=../beagle-donut/prebuilt/linux-x86/toolchain/arm-android-eabi-4.4.1/bin/arm-android-eabi- modules

基本的に0xdroidのサイトの方法でインストールすると、自動的にNANDにブートイメージが書き込まれてしまいます。
後のデバッグなどのことも考え、SDカードからのブートにしたいと思います。

ブート用SDカードのフォーマット
Ubuntu上でフォーマットします。詳しくは、BeagleBoardのサイトの"LinuxBootDiskFormat>Detail"に記載された手順を行います。(説明長いんで手を抜いて省略)

サイトに記載の通りに fdisk コマンドを実行していけば良いですが、シリンダ数を設定する場合に、SDカードの容量にあわせてシリンダ数がいくつになるか計算してやる必要があります。
最終的に求められたシリンダ数の小数点以下を切り取った整数が設定すべき値です。
個人的には、最後に記載されている sfdisk を使ってやる方がお手軽で良いかと思います。
※ただし、シリンダ数の計算はfdiskと同様に必要です。

手順通りにフォーマットを進めると、最終的に下記の2パーティションがSDカード内に作成されるはずです。

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *           1          51      409626    c  W95 FAT32 (LBA)
/dev/sdc2              52         245     1558305   83  Linux

ちなみに、/dev/sdc* は、環境によっては/dev/sdb* になっているかもしれません。

MLO,u-boot.bin,uImage,RFSのSDカードへのコピー
いよいよ、ビルドした0xdroidをブートするために必要なファイルをSDカードへコピーします。

まず、MLOとu-boot.binをBeagleBoardのサイトDownloadsのページから、下記のファイルをダウンロードします。

最初に、MLO_revc_v3をMLOというファイル名で、SDカード最初のパーティション(FAT32の方)にコピーします。
その後、u-boot-revc4.binをu-boot.binというファイル名でSDカードの最初のパーティションにコピーします。

次にLinuxカーネルのビルドの結果生成された、~/kernel/arch/arm/boot/uImage.binをuImageというファイル名に変更して、SDカードの最初のパーティションへコピーします。


 $ cp -R ~/kernel/arch/arm/boot/uimage.bin <最初のパーティションのマウントポイント>/uImage

最後に、0xdroidのソースのビルドでビルドした結果のディレクトリを、下記のような名前に書き換えて2番目のパーティションLinux)の方へコピーします。


 $ sudo cp -Rf ~/beagle-donut/out/target/product/beagleboard/root <2番目のパーティションのマウントポイント>/

 $ sudo cp -Rf ~/beagle-donut/out/target/product/beagleboard/system <2番目のパーティションのマウントポイント>/system

これでSDカードの準備は完了です。

Beagle BoardへのシリアルケーブルとDVIの接続、ターミナルの設定


※この作業はBeagleの電源を抜いた状態で行って下さい。
PCとBeagleBoardへはシリアルケーブルで接続します。
PCからはUSB - Serial(オス)ケーブルを接続し、BeagleBoardからは Serial(メス)- Serialピンコネクタ(メス)で接続します。
PCとBeagleとの間は丁度、Serialのオスとメスが繋がる形になります。
Beagle側のシリアルケーブルは自作しても良いのですが、Digikeyで専用ケーブルを購入する方が手軽で確実です。

尚、私の場合、PC側のUSB - Serialケーブルはドライバが必要で、しかもWinのみの対応なので、ターミナルを使う場合はWin7上で利用しています。
#このあたりは、(実在するのかわかりませんが)Ubuntuで動作するUSB - Serialケーブルを使用した方が、いくつもOSを準備しなくて済むので楽かもしれません。

あと、DVIケーブルをPCのモニタ等に接続します。これはブートが正しく行われたかどうかを確認するためです。
ブートが正しく行われたら、画面上に0xdroidにカスタマイズされたHome画面が表示されるはずです。

尚、ブート中のエラーなどは全てターミナル上のメッセージから判断します。
Windowsなら、Teratermがおすすめです。
ターミナルを起動したら、ボーレートを115200に設定しましょう。

ここで忘れずに先ほど作成したブート用のSDカードをBeagleへセットしておきましょう。


0xdroidを起動するためのUBOOTのコマンドパラメータの設定
Beagleの電源をONにすると、SD内のブートローダーが起動します。 


Texas Instruments X-Loader 1.4.2 (Feb 19 2009 - 12:01:24)
Reading boot sector
Loading u-boot.bin from mmc
 

U-Boot 2009.11 (Feb 23 2010 - 15:33:48)

OMAP3530-GP ES3.1, CPU-OPP2 L3-165MHz
OMAP3 Beagle board + LPDDR/NAND
I2C:   ready
DRAM:  256 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Board revision C4
Die ID #7d6200040000000004036abc0902301a
Hit any key to stop autoboot:  0
OMAP3 beagleboard.org #

自動ブートへのカウントダウンが始まるので、素早く何らかのキーを押して自動ブートを停止します。

0xdroidのRFSをSDカードからロードするために、bootcmdとbootargsのパラメータを下記のように設定(コマンドを実行)します。


 # setenv bootcmd 'mmc init; fatload mmc 0:1 0x80000000 uImage; bootm 0x80000000'

 # setenv bootargs androidboot.console=ttyS2 console=ttyS2,115200n8 console=tty0 init=/init omapfb.mode=dvi:1024x768MR-24@60 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait
 # saveenv

設定が保存できたら、リセットボタンを押して再起動します。再起動後、設定が間違っていなければ下記のようなメッセージがターミナルに表示されるはずです。


## Booting kernel from Legacy Image at 80000000 ...
   Image Name:   Linux-2.6.29-omap1-00013-gd1a1f7
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2244544 Bytes =  2.1 MB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................................................................................................. done, booting the kernel.
Linux version 2.6.29-omap1-00013-gd1a1f72 (lionas@ubuntu) (gcc version 4.4.1 (0xlab) ) #1 Mon Mar 15 05:14:04 PDT 2010
CPU: ARMv7 Processor [411fc083] revision 3 (ARMv7), cr=10c5387f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: OMAP3 Beagle Board
Memory policy: ECC disabled, Data cache writeback

(以下略)

ログメッセージは途中で止まっているように見えますが、DVIからHome画面が出力されていればブート成功です。