カテゴリー : Android

beagleboardでSDカードの抜き差しを減らす

beagleboardでAndroidのイメージを変更するたびに、SDカードにイメージをコピーして
起動しなおすのが面倒なので、chrootを使ってイメージを切り替えることにチャレンジしてみました。


1. beagleboardにUbuntuを入れる

http://elinux.org/BeagleBoardUbuntu を参考にしてubuntuのイメージを作成してください。

armのイメージ作成がFedoraでは無理だったので、今回は、VirtualBox にubuntuを入れて対応しました。
ubuntuにインストールに必要なツールを入れる

$ sudo apt-get install qemu
$ sudo apt-get install uboot-mkimage
$ sudo apt-get install rootstock
$ wget http://launchpad.net/project-rootstock/trunk/0.1.99.4/+download/rootstock-0.1.99.4.tar.gz

rootstockは、apt-getでもインストールできたのでが、バグがあるみたいなので
最新のソースをwgetでダウンロードしたものを使用しました。
実際、イメージの作成途中で止まったままになりました。

rootstockをインストールに合わせて依存関係のあるツールも一緒に入れる必要があったのですが、
調べるのが面倒だったので使わないけどあえて、apt-getでもrootstockをインストールしています。
PATHをwgetで取得した方を先に通すようにして使っています。
依存関係のあるパッケージは、qemu-extra-** とかだったような…

イメージを作成します。openssh-serverは必要なので必ず入れて下さい。その他は、お好きにしてください。

$ sudo ./rootstock --fqdn omap --login  --password   --imagesize 4G --seed  wget,nano,linux-firmware,wireless-tools,usbutils,xserver-xorg-core,xinit,xterm,wpasupplicant,openssh-server  --dist maverick --serial ttyS2 --components "main universe multiverse"  --kernel-image  http://rcn-ee.net/deb/maverick/v2.6.35.9-l8/linux-image-2.6.35.9-l8_1.0maverick_armel.deb

しばらく待つと下記のファイルが作成されます。

armel-rootfs-201101030333.tgz
initrd.img-2.6.35.9-l8
vmlinuz-2.6.35.9-l8

次にuImage,uInitrdの作成をします。

$ mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux" -d ./vmlinuz-* ./uImage
$ mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initrd.img-* ./uInitrd

実際には、使わないので作成しなくても良いと思いますが、動作確認用に作成しました。

SDカードへuImage, uInitrd をコピーしてネットワークへの接続、sshでのログインが確認できました。


2. カーネルをAndroidのカーネルに置き換える

ubuntuのカーネルをandroidのカーネルに置き換えます。
※カーネルのバージョンがあっていないけど、気にせずに置き換えます。
今回は、USB-LANアダプタ、無線LANアダプタを使いたいのでコンフィグを有効にしておきます。

$ANDROIDをandroidのソースのルートディレクトリとして説明します。
$ANDROID以下のkernelのディレクトリに移動します

Androidのkernelのディレクトリに移動します。

$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage clean
$ make ARCH=arm  CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-  defconfig  menuconfig

コンフィグで下記の設定を有効にする。
これは、必要なものを環境に合わせて設定して下さい。

[Device Drivers]->[Network device support]->[USB Network Adapters]
ASIX AX88xxx Based USB 2.0 Ethernet Adapters をチェック

[Device Drivers]->[Network device support]->[Wireless LAN]->
->[Wireless LAN (IEEE 802.11)]->[Ralink driver support]
Ralink rt2800 (USB) support をチェック

[*]で、built-in を選択しておく。

$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage modules

SDカードのデータを、できあがった uImageに置き換える。uInitrd は、削除してください。


3. Androidのイメージを転送する

SDカードをbeagleboardに挿入して起動すれば、linuxが起動するはず。

NICが見えているか確認します。起動時のログで、認識していることがわかるけど、いろいろ確認してみる

$ dmesg
$ ifconfig -a

eth0が見えていたので、DHCPでIP取得してみる。

$ sudo dhclient eth0

たぶん、IP取れると思います。取れなかったら各自で解決して下さい。
ホストマシンから、sshでログインしてみる。

$ ssh <username>@<IPaddress>

ログインできることを確認できたので、ホストマシンから、
beagleboardにAndroidのイメージを転送してみる

$ cd $ANDROID/vendor/sola/omap3/image/beagleboard
$ scp -r android <username>@<IPaddress>:/home/<username>

4. Androidを起動する

beagleboard にログインして、ホームディレクトリに先ほどコピーしたandroidディレクトリがあることを確認
chroot で、android ディレクトリをルートディレクトリに設定します。

$ sudo chroot /home/<username>/android /init

androidが起動しました。でもなんか不安定な感じが・・・

beagleboardで480i,480p出力

beagleboardをデジタルテレビに接続したときに、480i/pの出力させたいと思い
カーネルを少し触ったときの記録です。

kernel-beagleboard/drivers/video/modedb.c を次のように編集してから、
kernelを再ビルドしuImageを作りなおしてください。(ファイルのパスは適宜読みかえて下さい。)

*** ../kernel-beagleboard.orig/drivers/video/modedb.c   2010-07-24 00:39:10.000000000 +0900
--- drivers/video/modedb.c      2010-12-26 22:52:11.038082169 +0900
***************
*** 289,294 ****
--- 289,331 ----
        NULL, 60, 800, 480, KHZ2PICOS(30000), 40, 40, 13, 29, 48, 3,
        0, FB_VMODE_NONINTERLACED
      },
+     {
+       /* 640x480p@59.94/60Hz */
+       NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2,
+       0, FB_VMODE_NONINTERLACED
+     }, {
+       /* 720x480p@59.94/60Hz */
+       "sd480p", 60, 720, 480, 37037, 60, 16, 30, 9, 62, 6,
+       0, FB_VMODE_NONINTERLACED
+     }, {
+       /* 1920x1080i@59.94/60Hz */
+       "hd1080i", 60, 1920, 1080, 13763, 148, 88, 15, 2, 44, 5,
+       0, FB_VMODE_INTERLACED
+     }, {
+       /* 720(1440)x480iH@59.94/60Hz */
+       "sd480i", 60, 1440, 480, 18554/*37108*/, 114, 38, 15, 4, 124, 3,
+       0, FB_VMODE_INTERLACED
+     }, {
+       /* 720(1440)x240pH@59.94/60Hz */
+       NULL, 60, 1440, 240, 18554, 114, 38, 16, 4, 124, 3,
+       0, FB_VMODE_NONINTERLACED
+     }, {
+       /* 720x576pH@50Hz */
+       NULL, 50, 720, 576, 37037, 68, 12, 39, 5, 64, 5,
+       0, FB_VMODE_NONINTERLACED
+     }, {
+       /* 1280x720p@50Hz */
+       NULL, 50, 1280, 720, 13468, 220, 440, 20, 5, 40, 5,
+       0, FB_VMODE_NONINTERLACED
+     }, {
+       /* 1920x1080i@50Hz */
+       NULL, 50, 1920, 1080, 13480, 148, 528, 15, 5, 528, 5,
+       0, FB_VMODE_INTERLACED
+     }, {
+       /* (2880)x480p4x@59.94/60Hz */
+       NULL, 50, 2880, 480, 11100, 240, 64, 30, 9, 248, 6,
+       0, FB_VMODE_NONINTERLACED
+     },
  };

  #ifdef CONFIG_FB_MODE_HELPERS

SDカードのuImageだけ置き換えれば、その他は置き換えなくて問題ありません。
beagleboard起動時に、dvimode を設定することで、480i/p出力できます。

setenv dvimode sd480p-16@60
setenv dvimode sd480i-16@60

(dvimodeの設定は、どちらか一方で問題ありません。)

FedoraでAndroidビルド環境構築

Ubuntuでのビルド環境構築を参考に、FedoraでAndroidのビルド環境を構築しました。
コンパイルできることまで確認できたので、忘れないように記録を残しておきます。

パッケージのインストール

Ubuntuの環境でインストールしているパッケージで、それっぽいのをyum でインストールしておきます。
今回、インストールしたのはこれ。(こんなにいらないかも・・・)

git-1.7.2.3-1.fc13.x86_64
perl-Git-1.7.2.3-1.fc13.noarch
libdrm-2.4.21-2.fc13.i686
mesa-dri-drivers-7.8.1-9.fc13.i686
libxml2-2.7.7-1.fc13.i686
libXxf86vm-1.1.0-1.fc13.i686
mesa-libGL-7.8.1-9.fc13.i686
mesa-libGLU-7.8.1-9.fc13.i686
flex-static-2.5.35-11.fc13.x86_64
flex-2.5.35-11.fc13.x86_64
bison-2.4.1-4.fc12.x86_64
gperf-3.0.3-9.fc12.x86_64
libXinerama-devel-1.1-2.fc13.x86_64
compat-readline5-5.2-17.fc12.i686
compat-readline5-devel-5.2-17.fc12.i686
zlib-devel-1.2.3-23.fc12.i686
glibc-devel-2.12.1-4.i686
libstdc++-devel-4.4.4-10.fc13.x86_64
gcc-c++-4.4.4-10.fc13.x86_64
ncurses-devel-5.7-7.20100130.fc13.i686

JDK1.5のインストール

JDKには、RPMパッケージがないため、SRPMでインストールを行います。
rpmbuild用のツールが、インストールされていない場合は、インストールして下さい。

$ sudo yum instal rpm-build.x86_64

java-1.5.0-sun-1.5.0.15-1jpp.nosrc.rpmをここ からダウンロードしてインストールします。

$ rpm -Uvh java-1.5.0-sun-1.5.0.15-1jpp.nosrc.rpm

JDKをここからダウンロードして、rpmbuildのディレクトリにコピーします。

$ cp jdk-1_5_0_22-linux-amd64.bin* ~/rpmbuild/SOURCES

インストールするバージョンに合わせて、specファイルを編集します。

$ cd ~/rpmbuild/SPECS
$ vi java-1.5.0-sun.spec

今回変更した内容は、下記の通りです。

-%define buildver        15
+%define buildver        22

SRPMパッケージをビルドしてインストールします。

$ rpmbuild -bb java-1.5.0-sun.spec
$ cd ~/rpmbuild/RPMS/x86_64
$ yum localinstall java-1.5.0-sun-1.5.0.22-1jpp.x86_64.rpm java-1.5.0-sun-devel-1.5.0.22-1jpp.x86_64.rpm

Javaの切り換え方法

eclipseで、openjdk がインストールされていると java-1.6なのでalternatives を使って java-1.5 に切り換えます。
alternativesは、chkconfigのRPMパッケージに入っています。

$ sudo alternatives --config java

3 プログラムがあり 'java' を提供します。

選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
   3           /usr/lib/jvm/jre-1.5.0-sun/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:3

$ sudo alternatives --config javac

3 プログラムがあり 'javac' を提供します。

選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-1.6.0-openjdk.x86_64/bin/javac
   2           /usr/lib/jvm/java-1.5.0-gcj/bin/javac
   3           /usr/lib/jvm/java-1.5.0-sun/bin/javac

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:3

U-Boot用イメージ作成ツール導入

beagleboardでuImageを作成するために、uboot-toolsをyumでインストール

$ sudo yum install uboot-tools.x86_64

これでbuild環境の構築は完了です。