(CQ出版社インターフェース2010年4月号に寄稿した内容の抜粋です)
丸文株式会社の「M2ID(エムツーアイデイ,Marubun Mobile Internet Device)」を試用し,Android をビルドして,ボードを起動するまでの一連の作業を行ってみました.

本リファレンス・ボード(写真1)は,ディスプレイを搭載したモバイル機器の開発をメイン・ターゲットとしています.CPU に米国 Freescale Semiconductor 社製の i.MX51 マルチメディア・アプリケーション・プロセッサを搭載し,9インチ WVGA *1液晶や各種インターフェースを装備しています(写真2).

本開発キットには,回路図とガーバ・データや Linux,Android ドライバのソースコードが無償で添付されています *2.このため,購入後,すぐにシステムの開発に着手できます.OS は Linux と Androidが用意されています.予定では Windows Embedded CE も用意されるようですが原稿執筆時点では未対応でした (サードパーティからの提供が予定されています).
*1: ワイド VGA,800 x 480ピクセル.
*2: ライセンスについては,各コードのライセンス規約に準じます.
リファレンス・ボードの特徴
本ボードの最大の特徴は,CPU に i.MX51 を採用していることです.プロセッサ・コアに英 ARM 社のCortex 800MHz が使われており,原稿執筆時点でこのコアが (800MHzで) 動作する CPU は,ほかに見当たりません.また,ハードウェア・コーデックを搭載しているため, HD-720P (1280 x 720ピクセルのハイビジョン画質) の動画再生を高速に処理できます.低消費電力の CPU なので熟の問題も少なく,モバイル機器などの組み込みデバイスで常に問題となる電池の寿命も考慮されています.
さらに,i.MX シリーズではロー・エンドのi.MX25からハイ・エンドのi.MX51 まで品揃えされており,かつ将来のロード・マップが明確に示されています.このため,製品のラインアップを水平・垂直展開しやすい環境を提供しているようです.
本リファレンス・ボードは,周辺インターフェースも豊富です.表1と図1に,CPU の仕様とボードのブロック図を示します.
M2ID の特徴
- i.MX51 の主要機能をすべて評価することが可能,かつ外観を加工するだけで,エンド顧客へデモを実現できる.
- Linux/Android を標準搭載し,Windows CE もパートナから提供予定.
- 回路図やガーバ・データ,Linux/Android のソースコードを含む開発情報を無償提供のため,開発工数・期間を大幅に短縮できる.
- DVI-D ポートがあるため,大きな液晶ディスプレイに表示することも可能.
CPU | i.MX51 (ARM Cortex-A8コア,800MHz) |
---|---|
LCD | 9インチ WVGA 液晶 |
メイン・メモリ | DDR2 512M バイト |
NAND 型フラッシュ ROM | 512M バイト |
NOR 型フラッシュ ROM | 2M バイト |
外部インターフェース | 10/100M Ethernet x 1 |
SD/SDHC x 1ポート (High capacity 対応) | |
USB OTG x 1ポート | |
USB HS x 4ポート | |
Camera I/F x 1 | |
LCD インターフェース | |
DVI-D x 1ポート | |
UART DTE x 1ポート | |
UART DCE x 2ポート | |
I2S x 1ポート | |
CPU (i.MX51) の特徴 | ARM Cortex-A8 800MHz |
32K バイト Iキャッシュ,Dキャッシュ (それぞれ) | |
256K バイト L2 キャッシュ | |
NEON SIMD アクセラレータ | |
マルチメディア機能 - OpenGL ES 2.0 - OpenVG L1 ハードウェア・アクセラレータ - HD720P TV 出力,ハードウェア・ビデオ・コーデック |
|
IPU (Image Processing Unit) - ハードウェアによる回転,拡大縮小 |
|
Camera インターフェース | |
最大 WXGA の LCD コントローラ |

開発環境の構築
Linux 環境があれば,本ボードへ Android を移植することができます.今回の移植作業では,Mac と Windows 上に米国 Sun Microsystems 社の Sun VirtualBox を使って,Ubuntu 8.04 をインストールし,その環境を Linux 環境として使用しました.
ハードウェア環境
開発に必要となるハードウェア環境を示します.
- パソコン 1台 (Mac/Windows)
- SD メモリ・カード書き込み環境
- SD メモリ・カード 1枚 (M2ID パッケージに添付)
- RS-232-C クロス・ケーブル 1本
ハードウェアの拡張や,ドライバの新規開発などを行う場合,一般的なロジック・アナライザや JTAG-ICE,デジタル・オシロスコープが必要ですが,通常の Andoroid 機器の開発や,簡単なドライバの変更は上記の環境があれば十分でしょう.
ソフトウェア環境
開発に必要となるソフトウェア環境を示します.
- Linux 環境 (今回は Ubuntu 8.04 を使用)
- M2IDパッケージ
- インターネット接続環境
ソフトウエアの環境は無償で構築できます.今回は,M2IDで推奨されている Ubuntu 8.04 を仮想化ソフトウエア上で動作させました.
今回使用した Android および Linux カーネルのビルド環境の一例を,以下に示します.
ハードウェア | Apple iMac (Core2Duo 2.16GHz,メモリ2Gバイト) |
---|---|
ソフトウエア | Ubuntu 8.04 (Mac OS X 上の Sun Virtual Box で動作) |
M2ID へ Linux/Android をポーティング
M2ID 上で Android を動作させるために行った作業を,簡単に説明します.今回は開発中のボードを使用したため多少面倒でしたが,最終の製品では,ビルド手順が簡素化されることが期待されます.
作業の概要
M2ID 上で Android を動作させるには,Linux カーネルおよび Android にパッチを当て,M2ID 用にビルドします.作成したカーネルと Android は SD メモリ・カードにコピーし,それを使って M2ID上で Android をブートします.
- Linux および開発ツールのインストール
- i.MX 用ツールのインストール
- ソースコードの取得
- パッチの適用
- ビルド
- SD メモリ・カードへの書き込み
- ターミナルを使ってブート
図2に作業の流れを示します.上記1-6をUbuntu上で,7をターミナルと接続したM2IDで作業します.これによって,SD メモリ・カードを挿した M2ID 単体で Android を立ち上げることができるようになります.

OS および開発ツールのインストール
Android および Linux カーネルをソースコードからビルドするための環境を整えます.環境については Android Open Source Project のページにも情報があります.今回は,OS として Ubuntu 8.04 を使用しました.
Ubuntu のインストール
Ubuntu 8.04 は,Ubuntu の公式ページからリンクをたどり,ISO イメージ・ファイルを取得し,インストールを行います.Ubuntuをインストールしたら,パッケージマネージャなどで、インストールされているパッケージを更新しておきます.
開発ツールのインストール
Android,カーネルのビルドに必要なツールをインストールします(図3-1).
1. ツールをインストールする $ sudo apt-get install git-core gnupg sun-java5-jdk ¥ flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential ¥ zip curl libncurses5-dev zlib1g-dev 2. /opt にファイルを展開する $ cd /opt/imx-android-r5/code $ sudo tar zxvf R5.tar.gz $ cd /opt/imx-android-r5/tool $ sudo tar zxvf gcc-4.1.2-glibc-2.5-ntpl-3.tar.gz -C /opt 3. クロスコンパイラのための環境変数を設定する $ export ARCH=arm $ export CROSS_COMPILE=/opt/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi- (最後のハイフンまでセットすること)
i.MX 用ツールのインストール
i.MX 用のクロス・コンパイラなどのツール群や,ソース・コードへのパッチを行うためのツールやデータが,フリースケール・セミコンダクタ社より提供されます.これを /opt ディレクトリに展開し,/opt/imx-android-r5/ を作成します.さらに,/opt/imx-android-r5/code/R5.tar.gz をカレント・ディレクトリに,/opt/imx-android-r5/tool/gcc-4.1.2-glibc-2.5-ntpl-3.tar.gz を /opt に展開します (図3-2).
また,クロス・コンパイラを使用するための環境変数を図3-3のように設定します.
ソースコードの取得
Android および Linux カーネルのソース・コードを取得します.ソース・コードは Repo と Git を使って,サーバから取得します.これらのツールについての詳細はAndroid Open Source Project のページが参考になります.
Android ソース・コードの取得
ソース・コードを展開する場所はどこでもかまいませんが,今回はホーム・ディレクトリに myandroid というディレクトリを作成し,そこに展開します (図4-1).
図4-2のように Repo コマンドを作成,実行します.その後,i.MX 用に Repo のマニフェスト・ファイルを変更し,ソース・コードを取得します(図4-3).
カーネル・ソースコードの取得
ディレクトリ ${HOME}/myandroid/kernel_imx/ 以下に,カーネルのソース・コードが展開されます(図4-4).
1. 作業ディレクトリと bin を作成する. (.profileなどを編集して,環境変数 PATH に $HOME/bin が含まれるようにすること.) $ mkdir $HOME/myandroid $ mkdir $HOME/bin 2. Repo コマンドを作成して実行する. $ curl http://android.git.kernel.org/repo > $HOME/bin/repo $ chmod a+x $HOME/bin/repo $ repo init -u git://android.git.kernel.org/platform/manifest.git -b donut 3. i.MX 用に Repo のマニフェストファイルを変更し,ソースコードを取得する. $ cp /opt/imx-android-r5/code/R5/defualt.xml $HOME/myandroid/.repo/manifests/ $ repo sync 4. Linux カーネルのソースコードを取得する. $HOME/myandroid $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.28.y.git kernel_imx
ソースコードへのパッチの適用
取得したソース・コードに,i.MX および M2ID 用のパッチを適用します.i.MX 用のパッチ・スクリプトは,uboot のソース・コードがあることを前提として動作するため,この状態でパッチを適用しようとするとエラーとなってしまいます.そのため,事前に図5-1のように uboot のソースコードも取得しておきます.
1. uboot のソースコードを取得する. $ cd $HOME/myandriod/bootable/bootloader $ git clone git://git.denx.de/u-boot.git uboot-imx 2. i.MX 用パッチを適用する. $ cd $HOME/myandroid $ . /opt/imx-android-r5/code/R5/and_patch.sh 2.1 上記のシェルスクリプトによって定義された c_patch 関数を実行する. $ c_patch /opt/imx-android-r5/code/R5 imx_r5 2.2 以下のメッセージが出たら,パッチの適用は成功 ************************************************************* Success: Now you can build android code for FSL i.MX platform ************************************************************* 3. M2ID 製品に添付されているパッチ .patch をカーネルのソース・コードに適用する $ cd $HOME/myandroid/kernel_imx $ patch -p1 -b < m2id_v0.patch $ patch -p1 -b < v0_sound_and_button.patch $ patch -p1 -b < v0_video.patch $ patch -p1 -b < v0_atlas_add.patch $ patch -p1 -b < v0_nic_add.patch
i.MX 用パッチの適用
i.MX 用の関数を図5-2のように定義します.実行中のシェルに関数 c_patch が定義されたので,これを実行します(図5-2.1).図5-2.2のメッセージが出れば,パッチの適用は成功です.
M2ID用パッチの適用
製品に添付されているパッチ *.patch ファイルを,カーネルのソース・コードに適用します(図5-3).
ビルドの手順
これで準備ができたので,ビルドに取りかかります.
Android のビルド
Android のビルドを行います(図6-1).使用する環境に依存しますが,ビルドには1時間から2時間程度かかります.
1. Android をビルドする. $ cd $HOME/myandroid $ make PRODUCT-imx51_3stack-eng 2>&1 | tee makelog 2. 古い設定を削除する. $ cd $HOME/myandroid/kernel_imx $ make mrproper 3. M2ID 用のコンフィグファイルをカレントディレクトリに .config としてコピーする. $ cp imx51_m2id_defconfig_proto2 ./.config 4. カーネルをビルドする. $ make menuconfig $ make
ビルドが成功すると Android を実行するためのファイル構造が,$HOME/myandroid/out/target/product/imx51_3stack/root/ に作成されます.後でこれを SD メモリ・カードにコピーします.
カーネルのビルド
カーネルをビルドを行う前に,古い設定を削除します(図6-2).その後,製品に添付される M2ID 用のコンフィグ・ファイルを,カレント・ディレクトリに .config としてコピーし(図6-3),カーネルをビルドします(図6-4)
ビルドが成功すると,カーネルが $HOME/myandroid/kernel_imx/arch/arm/boot/zImage ファイルとして作成されます.これも,後で SD メモリ・カードにコピーします.
ブート用 SD メモリ・カード作成手順
SD メモリ・カードへの書き込み
作成した Android およびカーネルを SD メモリ・カードに書き込みます.今回は 2Gバイトの SD メモリ・カードを用い,USB カード・リーダ/ライタを使って書き込みました.なお,USB に供給される電力が足りない場合,正しく書き込みが行われない可能性があるので,その場合は電源付きの USB ハブを使用するなどの工夫が必要です.
パーティションの作成
SD メモリ・カードがマウントされている場合は,いったんアンマウントします(図7-1).SD メモリ・カード上に二つのパーティションを作成します.なお,以下の作業においては /dev/sdb にデバイスがマウントされているものとします.なお,sdb1 の開始シリンダ 5 というのは,sdb1 パーティションの開始シリンダを,先頭から約 10MB 後ろにずらすためです.パーティションを作成したら,作成されたパーティションを確認します(図7-3).
Android 本体とコンテンツを格納するための領域を作成するために,ファイル・システムをフォーマットします(図7-4).sdb1 は Android コンテンツ格納用の領域,sdb2 は Android 自体を格納するための領域となります.
1. マウントされている場合アンマウントする $ eject /dev/sdb 2. fdsk を実行 $ sudo /bin/fdisk /dev/sdb コマンド (m でヘルプ): p 現在のパーティションの表示 古いパーティションが存在している場合は d コマンドで削除 コマンド (m でヘルプ): n 新規パーティションの割り当て p, 1, 5, 150,の順に入力して,プライマリの 1番にシリンダ 5 から 150 を割り当てる コマンド (m でヘルプ): n 新規パーティションの割り当て p, 2, 151, の順に入力して,プライマリの 2番にシリンダ 151 から最後までを割り当てる コマンド (m でヘルプ): w 割り当てたパーティションの書き込み コマンド (m でヘルプ): p 現在のパーティション情報の確認 3.パーティション情報の出力結果 Disk /dev/sdb: 1977 MB, 1977614336 bytes 64 heads, 63 sectors/track, 957 cylinders Units = シリンダ数 of 4032 * 512 = 2064384 bytes Disk identifier: 0x00000000 デバイス Boot Start End Blocks Id System /dev/sdb1 5 150 294336 83 Linux /dev/sdb2 151 957 1626912 83 Linux 4. ファイルシステムのフォーマット $ eject /dev/sdb マウントされている場合アンマウントする $ sudo /sbin/mkfs.vfat /dev/sdb1 $ sudo /sbin/mkfs.ext3 /dev/sdb2 ファイルシステムをフォーマット sdb1 は Android コンテンツ格納用の領域 sdb2 は Android 自体を格納するための領域
RedBoot の書き込み
製品に添付されている RedBoot を SD メモリ・カードに書き込みます(図8-2).一般的な組み込み機器ではフラッシュ ROM にブート・ローダをインストールしますが,M2ID 本体が最小のブート機能を持っているので,SD メモリ・カードから RedBoot を起動できます.
1. RedBoot の書き込み $ dd if=redboot_m2id091109.bin of=/dev/sdb bs=1 skip=1024 seek=1024 && sync && sync 2. カーネルの書き込み $ cd $HOME/myandroid/kernel_imx/arch/arm/boot $ sudo dd if=./zImage of=/dev/sdb bs=1M seek=1 && sync && sync 3. Android の書き込み $ sudo mount /dev/sdb2 /media/floppy $ cd $HOME/myandroid/out/target/product/imx51_3stack/root $ cp -rpa ./* /media/floppy && sync && sync $ cd ../system $ cp -rpa ./* /media/floppy/system/ && sync && sync 4. 製品に添付される init.rc を書き込んでアンマウントする $ cp init.rc /media/floppy/init.rc && sync && sync $ eject /dev/sdb
カーネルの書き込み
dd(1) コマンドで,SD メモリ・カードにカーネルを書き込みます(図8-2).
Android の書き込み
/dev/sdb をマウントして,ファイルをコピーします.今回は,/media/floppy をマウント・ポイントとして使用しました(図8-3).
ファイルのコピー後,init.rc を書き込みます(図8-4).
ターミナルを使ってブート
これまでは Linux 上での作業でしたが,これ以降は M2ID とパソコン上のターミナル・ソフトを,RS-232C のクロス・ケーブルで接続して作業します.
書き込んだ SD メモリ・カードを,パソコンから抜き,M2ID のスロットに挿入します.次に,パソコンとM2ID を RS-232C のクロス・ケーブルで接続します.パソコン側のシリアル・ターミナル設定は,115200/8N1 です.今回は USB シリアル・ケーブルを使って PC に接続しました.
M2ID の電源を入れると,ターミナルに RedBoot のプロンプト画表示されます.図9-1のコマンドで SD メモリ・カード情報を書き込み,カーネルを実行します(図9-2).これで,Android が立ち上がります (写真3).
1. SD メモリ・カードにブート・情報を書き込む RedBoot> fis init RedBoot> fis create -f 0x00100000 -b 0x00100000 -l 0x00500000 -e 0x00100000 -n kernel RedBoot> fis list ←(kernelが作成されていることを確認) ... Read from 0x07ee0000-0x07eff000 at 0x00040000: . Name FLASH addr Mem addr Length Entry point RedBoot 0x00000000 0x00000000 0x00040000 0x00000000 FIS directory 0x00040000 0x00040000 0x0001F000 0x00000000 RedBoot config 0x0005F000 0x0005F000 0x00001000 0x00000000 kernel 0x00100000 0x00100000 0x00500000 0x00100000 2. カーネルを実行する RedBoot> fis load kernel ... Read from 0x07ee0000-0x07eff000 at 0x00040000: . ... Read from 0x00100000-0x00600000 at 0x00100000: . RedBoot> exec -c "init=/init console=ttymxc0 androidboot.console=ttymxc0 root=/dev/mmcblk0p2 rootfstype=ext3 video=mxcfb:CLAA-WVGA,bpp=16 rw mem=456M"

まとめ
本ボードの CPU は強力なため,高速な機器を開発したいときや,オーディオや動画を楽しむ機器を開発するには良いプラットホームでしょう.また,他社のボードと比較して大きな画面を持っているのも,大きな特徴です.ただし,本稿執筆時はプロトタイプを使用したため,タッチ・パネルは利用できず,USBマウスを接続して使用しました.なお,この画面は DVI を通して,普通の液晶モニタへ表示することも可能です.
購入して一日もあれば,Linux から Android のビルド,そして Android の起動までが可能な開発キットです.ただ試用した段階では,パッケージが整理されていなかったため試行錯誤が発生しました.製品版ではドキュメントを含め,パッケージも整備されるでしょう.回路図や各種ソースコードの公開を考えると,低価格で導入も容易な開発キットという印象を持ちました.
なお,紹介した仕様は開発中のものであり,製品では変更されることが予想されます.