HOME > 技術 > M2IDでAndroidを起動する

(CQ出版社インターフェース2010年4月号に寄稿した内容の抜粋です)

丸文株式会社の「M2ID(エムツーアイデイ,Marubun Mobile Internet Device)」を試用し,Android をビルドして,ボードを起動するまでの一連の作業を行ってみました.

M2IDボード外観の写真
写真1 M2ID ボード外観

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

タッチパネルの付いたM2IDの写真
写真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 の特徴

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 コントローラ
表1 M2ID の仕様
M2IDのブロック図
図1 M2ID のブロック図

開発環境の構築

Linux 環境があれば,本ボードへ Android を移植することができます.今回の移植作業では,Mac と Windows 上に米国 Sun Microsystems 社の Sun VirtualBox を使って,Ubuntu 8.04 をインストールし,その環境を Linux 環境として使用しました.

ハードウェア環境

開発に必要となるハードウェア環境を示します.

ハードウェアの拡張や,ドライバの新規開発などを行う場合,一般的なロジック・アナライザや JTAG-ICE,デジタル・オシロスコープが必要ですが,通常の Andoroid 機器の開発や,簡単なドライバの変更は上記の環境があれば十分でしょう.

ソフトウェア環境

開発に必要となるソフトウェア環境を示します.

ソフトウエアの環境は無償で構築できます.今回は,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 をブートします.

  1. Linux および開発ツールのインストール
  2. i.MX 用ツールのインストール
  3. ソースコードの取得
  4. パッチの適用
  5. ビルド
  6. SD メモリ・カードへの書き込み
  7. ターミナルを使ってブート

図2に作業の流れを示します.上記1-6をUbuntu上で,7をターミナルと接続したM2IDで作業します.これによって,SD メモリ・カードを挿した M2ID 単体で Android を立ち上げることができるようになります.

ビルドからAndroid起動まで作業の流れを表した図
図2 ビルドから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-
  (最後のハイフンまでセットすること)
図3 開発ツールのインストール

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
図4 Androidおよび Linux カーネルソースの取得

ソースコードへのパッチの適用

取得したソース・コードに,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
図5 ソースコードへのパッチの適用

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
図6 Android とカーネルのビルド

ビルドが成功すると 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 自体を格納するための領域
図7 SD メモリ・カードへの書き込み準備

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
図8 ブート・ローダ,カーネル,Android の書き込み

カーネルの書き込み

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"
図9 ターミナルからブート
Androidが動作しているM2IDの画面写真(その1)
写真3 Android の動作画面

まとめ

本ボードの CPU は強力なため,高速な機器を開発したいときや,オーディオや動画を楽しむ機器を開発するには良いプラットホームでしょう.また,他社のボードと比較して大きな画面を持っているのも,大きな特徴です.ただし,本稿執筆時はプロトタイプを使用したため,タッチ・パネルは利用できず,USBマウスを接続して使用しました.なお,この画面は DVI を通して,普通の液晶モニタへ表示することも可能です.

購入して一日もあれば,Linux から Android のビルド,そして Android の起動までが可能な開発キットです.ただ試用した段階では,パッケージが整理されていなかったため試行錯誤が発生しました.製品版ではドキュメントを含め,パッケージも整備されるでしょう.回路図や各種ソースコードの公開を考えると,低価格で導入も容易な開発キットという印象を持ちました.

なお,紹介した仕様は開発中のものであり,製品では変更されることが予想されます.