2012/02/24

BeagleBoard-xMでICS(Android4.0)―rev.Bでの動作―

BeagleBoard-xMにはrev.A、rev.B、rev.Cとリビジョンがあって、特定バージョンのAndroidはrev.Bで動いてrev.Cで動かないとか、その逆とかいろいろ起こります。

というので、ICS (Android4.0)ではどうかちょっと見てみました。

結果から言えば、rev.Bでもrev.Cでも同じ程度には動きました。

そもそも、rev.Bとrev.Cで何が違うのかと言えば「BeagleBoard-xM System Reference Manual」にいろいろ記述してあって、いくつかの変更点から抜粋するに
Changed the default power state of the USB HUB to OFF as an added layer of protection to make sure the USB power rails are off on initial power up. This will minimize the initial current drain on the board. SW can turn on the HUB power as needed by setting the TPS65950 LEDA/VIBRA.P pin LO to turn it on.
これが効き目大きいかなと。
CPU含んでいるチップのリビジョンも違うから影響あるかもしれないけど、そこまでは追いかけてないです。

なのでrev.Bでもrev.Cでも動くためには「kernel内のBeagleBoard-xM固有の初期化部分」が対応する必要があるのだと認識しています。

後で書くコンソールメッセージの比較で見ると、x-loaderの表示メッセージも違うから、何かあるのかも?
u-bootの方も何か差分あった気がしたけど、思い出せない……。

で、ともかく、この辺がrev.B、rev.C両対応になったのがTI_Android_GingerBread_2_3_4_DevKit_2_1以降ではなかったかと思います。
TIからのリリース版はそれぞれ試したことはあるはずですが、忘れちゃいました。

と、それだけの話なんですが、せっかくなので、ICS起動時のシリアルコンソールのメッセージをrev.Bとrev.Cで比較してみました。
ICSより前のバージョンでも似たようなものだと想像できるので、何かのトラブルシューティングに使えるかも?

結局
  • x-loaderは基板のリビジョンを認識している (が、処理も変えているかは確認してないので不明)
  • u-bootはチップのリビジョンを認識して表示しているだけ?
  • kernelはチップのリビジョンを認識している (が、処理も変えているかは確認していないので不明)
  • kernelは基板のリビジョンも認識している (そして、初期化処理を変えていたはず)
というのが現時点で判明したことになります。
余裕があれば各ソースコードを見てみたいと思います。


rev.Bのが以下になります。rev.Cと差分ある箇所に色付けてみました。
Texas Instruments X-Loader 1.51 (Jul 11 2011 - 21:11:32)
Unsupported Chip!
Beagle xM Rev A
Starting X-loader on MMC
Reading boot sector
213256 Bytes Read from MMC
Starting OS Bootloader from MMC...
Starting OS Bootloader...

U-Boot 2010.06 (Jul 08 2011 - 04:37:45)
OMAP34xx/35xx-GP ES2.0, CPU-OPP2 L3-165MHz
OMAP3 Beagle board + LPDDR/NAND
I2C:   ready
DRAM:  384 MiB
NAND:  HW ECC [Kernel/FS layout] selected
0 MiB
*** Warning - bad CRC or NAND, using default environment
In:    serial
Out:   serial
Err:   serial
Beagle xM Rev A/C
Die ID #49c80001************************
Hit any key to stop autoboot:  0
mmc1 is available
reading boot.scr
479 bytes read
Running bootscript from mmc ...
## Executing script at 82000000
reading uImage
2747724 bytes read
***** Kernel: /dev/mmcblk0p1/uImage *****
***** RootFS: /dev/mmcblk0p2 *****
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux-2.6.37-g1236e9f
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2747660 Bytes = 2.6 MiB
   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.37-g1236e9f (ise@*) (gcc version 4.4.3 (GCC) ) #1 Wed Feb 22 16:03:22 JST 2012
CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: OMAP3 Beagle Board
Reserving 8388608 bytes SDRAM for VRAM
Memory policy: ECC disabled, Data cache writeback
OMAP3630 ES1.1 (l2cache iva sgx neon isp 192mhz_clk )
SRAM: Mapped pa 0x40200000 to va 0xfe400000 size: 0x10000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 62976
Kernel command line: console=ttyO2,115200n8 androidboot.console=ttyO2 mem=256M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y vram=8M omapfb.vram=0:8M omapdss.def_disp=dvi omapfb.mode=dvi:1024x768-16
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 248MB = 248MB total
Memory: 245292k/245292k available, 16852k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xd0800000 - 0xf8000000   ( 632 MB)
    lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc003b000   ( 204 kB)
      .text : 0xc003b000 - 0xc0531000   (5080 kB)
      .data : 0xc0532000 - 0xc0576c80   ( 276 kB)
NR_IRQS:409
Clocking rate (Crystal/Core/MPU): 26.0/400/600 MHz
Reprogramming SDRC clock to 400000000 Hz
dpll3_m2_clk rate change failed: -22
IRQ: Found an INTC at 0xfa200000 (revision 4.0) with 96 interrupts
Total of 96 interrupts on 1 active controller
GPMC revision 5.0
Trying to install interrupt handler for IRQ402
Trying to install interrupt handler for IRQ403
Trying to install interrupt handler for IRQ404
Trying to install interrupt handler for IRQ405
Trying to install interrupt handler for IRQ406
Trying to install interrupt handler for IRQ407
Trying to install interrupt handler for IRQ408
Trying to install type control for IRQ409
Trying to set irq flags for IRQ409
OMAP clockevent source: GPTIMER1 at 32768 Hz
Console: colour dummy device 80x30
Calibrating delay loop... 597.64 BogoMIPS (lpj=2334720)
pid_max: default: 32768 minimum: 301
Security Framework initialized
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
regulator: core version 0.5
regulator: dummy:
NET: Registered protocol family 16
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
omap_mux_init: Add partition: #1: core, flags: 0
OMAP3 Beagle Rev: xM
Found NAND on CS0
Registering NAND on CS0
Unable to get DVI reset GPIO
hw-breakpoint: debug architecture 0x4 unsupported.
OMAP DMA hardware revision 5.0
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
omap_i2c omap_i2c.1: bus 1 rev4.0 at 2600 kHz
twl4030: PIH (irq 7) chaining IRQs 368..375
twl4030: power (irq 373) chaining IRQs 376..383
twl4030: gpio (irq 368) chaining IRQs 384..401
regulator: VUSB1V5: 1500 mV normal standby
regulator: VUSB1V8: 1800 mV normal standby
regulator: VUSB3V1: 3100 mV normal standby
twl4030_usb twl4030_usb: Initialized TWL4030 USB module
regulator: VMMC1: 1850 <--> 3150 mV at 3000 mV normal standby
regulator: VDAC: 1800 mV normal standby
regulator: VDVI: 1800 mV normal standby
regulator: VSIM: 1800 <--> 3000 mV at 1800 mV normal standby
regulator: VAUX3: 1800 mV normal standby
regulator: VAUX4: 1800 mV normal standby
omap_i2c omap_i2c.2: bus 2 rev4.0 at 400 kHz
omap_i2c omap_i2c.3: bus 3 rev4.0 at 100 kHz
Advanced Linux Sound Architecture Driver Version 1.0.23.
Switching to clocksource 32k_counter
musb-hdrc: version 6.0, otg (peripheral+host), debug=0
musb-hdrc musb-hdrc.0: dma type: dma-inventra
musb-hdrc musb-hdrc.0: USB OTG mode controller at fa0ab000 using DMA, IRQ 92
(以下略)

rev.Cのが以下になります。
Texas Instruments X-Loader 1.51 (Jul 11 2011 - 21:11:32)
Unsupported Chip!
Beagle xM Rev C
Starting X-loader on MMC
Reading boot sector
213256 Bytes Read from MMC
Starting OS Bootloader from MMC...
Starting OS Bootloader...

U-Boot 2010.06 (Jul 08 2011 - 04:37:45)
OMAP34xx/35xx-GP ES2.1, CPU-OPP2 L3-165MHz
OMAP3 Beagle board + LPDDR/NAND
I2C:   ready
DRAM:  384 MiB
NAND:  HW ECC [Kernel/FS layout] selected
0 MiB
*** Warning - bad CRC or NAND, using default environment
In:    serial
Out:   serial
Err:   serial
Beagle xM Rev A/C
Die ID #3e7e0002**********************
Hit any key to stop autoboot:  0
mmc1 is available
reading boot.scr
479 bytes read
Running bootscript from mmc ...
## Executing script at 82000000
reading uImage
2747724 bytes read
***** Kernel: /dev/mmcblk0p1/uImage *****
***** RootFS: /dev/mmcblk0p2 *****
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux-2.6.37-g1236e9f
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2747660 Bytes = 2.6 MiB
   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.37-g1236e9f (ise@*) (gcc version 4.4.3 (GCC) ) #1 Wed Feb 22 16:03:22 JST 2012
CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: OMAP3 Beagle Board
Reserving 8388608 bytes SDRAM for VRAM
Memory policy: ECC disabled, Data cache writeback
OMAP3630 ES1.2 (l2cache iva sgx neon isp 192mhz_clk )
SRAM: Mapped pa 0x40200000 to va 0xfe400000 size: 0x10000
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 62976
Kernel command line: console=ttyO2,115200n8 androidboot.console=ttyO2 mem=256M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y vram=8M omapfb.vram=0:8M omapdss.def_disp=dvi omapfb.mode=dvi:1024x768-16
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 248MB = 248MB total
Memory: 245292k/245292k available, 16852k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xd0800000 - 0xf8000000   ( 632 MB)
    lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc003b000   ( 204 kB)
      .text : 0xc003b000 - 0xc0531000   (5080 kB)
      .data : 0xc0532000 - 0xc0576c80   ( 276 kB)
NR_IRQS:409
Clocking rate (Crystal/Core/MPU): 26.0/400/600 MHz
Reprogramming SDRC clock to 400000000 Hz
dpll3_m2_clk rate change failed: -22
IRQ: Found an INTC at 0xfa200000 (revision 4.0) with 96 interrupts
Total of 96 interrupts on 1 active controller
GPMC revision 5.0
Trying to install interrupt handler for IRQ402
Trying to install interrupt handler for IRQ403
Trying to install interrupt handler for IRQ404
Trying to install interrupt handler for IRQ405
Trying to install interrupt handler for IRQ406
Trying to install interrupt handler for IRQ407
Trying to install interrupt handler for IRQ408
Trying to install type control for IRQ409
Trying to set irq flags for IRQ409
OMAP clockevent source: GPTIMER1 at 32768 Hz
Console: colour dummy device 80x30
Calibrating delay loop... 597.64 BogoMIPS (lpj=2334720)
pid_max: default: 32768 minimum: 301
Security Framework initialized
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
regulator: core version 0.5
regulator: dummy:
NET: Registered protocol family 16
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
OMAP GPIO hardware version 2.5
omap_mux_init: Add partition: #1: core, flags: 0
OMAP3 Beagle Rev: xM C
Found NAND on CS0
Registering NAND on CS0
Unable to get DVI reset GPIO
hw-breakpoint: debug architecture 0x4 unsupported.
OMAP DMA hardware revision 5.0
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
omap_i2c omap_i2c.1: bus 1 rev4.0 at 2600 kHz
twl4030: PIH (irq 7) chaining IRQs 368..375
twl4030: power (irq 373) chaining IRQs 376..383
twl4030: gpio (irq 368) chaining IRQs 384..401
regulator: VUSB1V5: 1500 mV normal standby
regulator: VUSB1V8: 1800 mV normal standby
regulator: VUSB3V1: 3100 mV normal standby
twl4030_usb twl4030_usb: Initialized TWL4030 USB module
regulator: VMMC1: 1850 <--> 3150 mV at 3000 mV normal standby
regulator: VDAC: 1800 mV normal standby
regulator: VDVI: 1800 mV normal standby
regulator: VSIM: 1800 <--> 3000 mV at 1800 mV normal standby
regulator: VAUX3: 1800 mV normal standby
regulator: VAUX4: 1800 mV normal standby
omap_i2c omap_i2c.2: bus 2 rev4.0 at 400 kHz
omap_i2c omap_i2c.3: bus 3 rev4.0 at 100 kHz
Advanced Linux Sound Architecture Driver Version 1.0.23.
Switching to clocksource 32k_counter
musb-hdrc: version 6.0, otg (peripheral+host), debug=0
musb-hdrc musb-hdrc.0: dma type: dma-inventra
musb-hdrc musb-hdrc.0: USB OTG mode controller at fa0ab000 using DMA, IRQ 92
(以下略)


BeagleBoard-xMでICS(Android4.0)―自前ビルド版―

前のポストではPre-built Imageを使いましたが、ソースから自分でビルドしてICSをBeagleBoard-xMで動かしてみました。

これも基本的には「ICSonBeagleboard_WithSGX」の手順の通りですが、いくつか補足を付けてステップを説明します。
補足はこんな風にイタリックにしています。

私のPC環境ですが

  • OSはUbuntu 10.10 64bit
  • CPUはCore2 Quad Q9650 (3.00GHz)
  • メモリは4GB

といったところです。

作業には以下が必要です。
  • sudoできるアカウント
  • microSDにアクセスできる (USBのアダプタとか)
  • HDDの空き容量25GB程度
  • 作業時間として、ダウンロードから始めて最速でも約2,3時間

ビルドは以下の方針で進めます。
  • x-loaderはビルドしない (Pre-built Imageのを使う)
  • u-bootはビルドしない (Pre-built Imageのを使う)
  • kernel, Android, SGX対応モジュールをビルドする
何かカスタマイズするにしても、通常、x-loaderやu-bootは変更しないことが多いです。
あるとして、ブート手順の早い側ではu-bootの起動スクリプトboot.scrを変更することがあるぐらいです。

やっと手順です。

シェルはbash (つまりデフォルトのまま)を使って、少なくとも作業するターミナルでは環境変数LANGをCにします。
export LANG=C

repoコマンド用にディレクトリを用意します。
mkdir -p ~/bin
PATH=~/bin:$PATH
PATHの設定は~/.bashrcにしておくのがいいでしょう。

次にrepoコマンドを用意します。
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod +x ~/bin/repo
既にrepoコマンドを用意してある場合は、改めてダウンロードする必要はありません。
でも時々アップデートされているので、最新のを使うのがいいかもしれません。

これまた時々、ダウンロードに失敗して、エラーのHTML記述が~/bin/repoに記録されることがあります。
正しくスクリプトがダウンロードされたか確認します。
head ~/bin/repo
先頭の行が#!/bin/shとなっていたら大丈夫でしょう。

レポジトリを置くディレクトリを用意します。
mkdir ~/rowboat-android
cd ~/rowboat-android
ここが20GBぐらいになりますので、空き容量の十分な場所に用意してください。

レポジトリを用意します。
repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-ics.xml
元Wikiはちょっと誤字になってます(repo init -uが余分)。
若干時間かかります。
repo sync
repo syncには1時間以上かかります(インターネット接続環境にもよります)。
エラーになることがありますが、最初からやり直さずに(つまりディレクトリ消したりせずに)、何回か上のコマンド実行すれば大抵大丈夫です。

元WikiではRowboatTools.tar.gzをダウンロードしていますが、今回のビルド方針では不要なのでダウンロードしません。

クロスコンパイラへのパスを準備します。
export PATH=~/rowboat-android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

元Wikiではx-loaderのビルドしていますが、ビルド方針の通りスキップします。

同様にu-bootのビルドもスキップします。
u-bootをビルドすると生成されるmkimageが後で必要になりますが、Ubuntuのパッケージのを使えばOKです。
インストールは sudo apt-get install uboot-mkimage とします。

kernel、Android、SGXモジュールをビルドします。
make TARGET_PRODUCT=beagleboard OMAPES=5.x
数十分かかります。マルチコアな環境なら-j 4などと並列実行のオプション付けると高速化できます。

ここから元Wikiとちょっと違います。

microSDカードに書く準備としてrootfs.tar.bz2を作ります。
make fs_tarball
これでout/target/product/beagleboard/rootfa.tar.bz2が生成されます。

別のディレクトリでPre-built Imageをダウンロード、展開します。
wget http://rowboat.googlecode.com/files/beagleboard_xm_sgx.tar.gz
tar xfz beagleboard_xm_sgx.tar.gz
自前ビルドのものに置き換えるのでPre-built Imageのファイルを消します。
cd beagleboard_xm
rm Boot_Images/uImage
rm Filesystem/rootfs.tar.bz2

自前ビルドした結果を配置してmicroSDカードに書き込みます。
cp ~/rowboat-android/kernel/arch/arm/boot/uImage Boot_Images/
cp ~/rowboat-android/out/target/product/beagleboard/rootfa.tar.bz2 Filesystem/
sudo ./mkmmc-android.sh /dev/sdb
環境によってmicroSDが/dev/sdbだったり/dev/sdcだったりします。
間違ってHDDのデバイスを指定してしまうと大変なことになるので要注意です。

あとは完成したmicroSDをBeagleBoard-xMに刺して電源投入して起動を待ちます。

BeagleBoard-xM便利アイテム

今回はBeagleBoard-xMを使う時に便利(だと思っている)なものを紹介。

BeagleBoard-xMの回路は電源供給について

  • DCジャック(φ2.1mm、5V、センタープラス)
  • USB mini-AB

の2系統あります。その上で

  • DCプラグが刺さっていれば、USB mini-ABより優先される (DCプラグの通電に関係なく)
  • USB mini-ABからの給電では動作が不完全になる (動かすOSとかにもよるかも?)

という性質があります。

というので、チョコっと用意したのがこれです。
結局、DCプラグの中継ケーブルにスイッチ挟んだだけです。
ジャックとスイッチは手持ちが基板実装用だったので空中配線してホットボンドで固めました。

実際にボードにつなぐとこんな感じです。

写真ではUSB mini-ABは接続していませんが、AndroidでADBも使って作業しつつmicroSDカードの交換する時、DCプラグもUSBプラグも両方抜く、という必要が無いので、ほんの少し便利です。
BeagleBoard-xMはコネクタへの力学的ストレスで壊れやすいという噂もあるので、少し安心です。



2012/02/23

BeagleBoard-xMでICS(Android4.0)

rowboatのWikiで「ICSonBeagleboard」というのはかなり以前からあったのですが、最近「ICSonBeagleboard_WithSGX」というページもできていて、自分のBeagleBoard-xMで試してみました。

補足とかは後ろに回すとして、ともかく動かしてみます。

基本的にWikiの最初「Out of the Box Demo」に書いてある通りです。
追記するとすれば、
  • Linux PCで作業します
  • export LANG=Cしておきます
  • microSDが/dev/sdbなのか、sdc, sdd, ...なのか確認して間違えないよう指定します
といったところでしょうか。

microSDカードは4GBで約1,000円だったSandiskのを使っています。
SDカードへの変換アダプタも付いているのですが、USBアダプタがmicroSDを直刺しできるので、変換アダプタは使わずにUSB経由で書き込んでいます。

microSDの準備ができたら、microSDをBeagleBoard-xMにセットして電源On!
BeagleBoard-xMのrev.Cに次のものを接続して試しました。
  • PC用モニタ(HDMI-DVIケーブル経由)
  • USBマウス
  • Ethernet
  • シリアルケーブル (USB-シリアル変換で作業PCに接続)
数分で無事立ち上がってきました。

写真は言語を「日本語」に設定した後で撮影したものです。
Androidのバージョンは4.0.1のようです。

シリアルコンソール経由で設定してやると、Ethernet経由でWebのブラウズもできそうです。

シリアルコンソールからの設定は
netcfg usb0 dhcp
とします。これで、DHCP有効なLAN環境ならEthernetにIPアドレスが割り当てられ通信できるようになります。
おそらく、USB経由のadb shellでも同じコマンドを実行可能と思います。

ただし、この方法ではAndroidはインターネット接続環境が有効であると認識していないかもしれません。
アプリケーションによっては、「インターネット接続がありません」等のエラーになるかもしれません。
このあたりは今回は確認しませんでした。

――と、ここまでうまく動いているように見えますが、
シリアルコンソールも併せて見ていると、沢山エラーメッセージが出ます
たとえば、上のブラウザ画面が出ている時点で

こんな感じです。

あと、1分間放っておくとスリープして帰ってきません
どうも画面などから見るに、電池残量がほぼ0で充電器つながっていないという認識のようです。
もしかするとスリープというより中途半端にシャットダウンしているのかもしれません。


ここから後ろは、少しだけ補足です。

rowboatというのは、米Texas Instruments社(TI社)が製造しているARM搭載アプリケーションプロセッサチップでAndroidを動くようにしよう、というオープンソースのプロジェクトです。

BeagleBoardやBeagleBoard-xMはTI製のSitaraやDavinciを搭載しているので、rowboatの成果が使えます。
TIからリリースされるAndroid DevKit自体、rowboatの成果から派生しているようです。

With SGXというのは、グラフィックアクセラレータのSGXを有効にしたバージョンということです。主にはOpenGL経由の描画に効くらしいです。

SGXというのは英Imagination Technologies社のPowerVRのシリーズの1つで、ARMプロセッサコアとは別にグラフィックアクセラレータとしてSitaraやDavinciに内蔵されている回路です。
Androidスマートフォンだけでなく、非Androidな携帯電話にも多く搭載されているそうです。
TI社は、ARM社からARMプロセッサコアの設計図やライセンスを、Imagination Technologies社からSGXの設計図やライセンスをそれぞれ購入して、周辺回路とあわせて、自社で半導体として製造・販売しているわけですね。

実はBeagleBoard-xMに搭載されているDavinciというのは、ARMのほかにTI社製のDSPコアも内蔵しています。
DSPコア部分をうまく使えれば、動画像の圧縮・再生などのスペックが向上するはずで、他力本願ながらDSPコア部分も活用するAndroidが出ないかな~と期待しています。

2012/02/13

さくらクラウドでAndroidビルド(ビルド編)

実際にAndroidをビルドしてみます。
ターゲットはAndroid 2.3.4です。

先に結果を書いてしまうと、なんとビルド時間10分以下でした。


基本的には"TI-Android-GingerBread-2.3.4-DevKit-2.1 DeveloperGuide"の手順になります。

"TI_Android_DevKit TI_Android_GingerBread_2_3_4_DevKit_2_1 Product Download Page"からTI_Android_GingerBread_2_3_4Sources.tar.gzをダウンロードします。
これ、約4GBありますのでダウンロードには相当時間かかります。

今回は、前もってさくらのクラウドに別に仮想1コアのサーバ(126円/日)を用意して、ダウンロードしておいたのを仮想12コアの方にコピーしました。
TIのサイトからのダウンロードは100~200kByte/secぐらいで、数時間かかりました。
さくらのクラウド同士でのコピー(scp -c blowfishでコピーしました)は約9MByte/secぐらいで、10分かからないです。

ソースをRAMディスクに展開します。
cd /ramdisk
tar xfz ~/TI_Android_GingerBread_2_3_4Sources.tar.gz
ディレクトリ名が長いのでリネームします(単純に好みの問題です)。
mv TI_Android_GingerBread_2_3_4Sources GingerBread
展開されたgitのローカルリポジトリからチェックアウト(?)します。
cd GingerBread
./.repo/repo/repo sync --local-only
環境変数の調整等をします。実際には~/.bashrcに書いたりしました。
export LANG=C
export PATH=/ramdisk/GingerBread/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
CCACHEの設定をします。通常は~/.ccahe/が使われますが、RAMディスクを使うようにしています。
export USE_CCACHE=1
export CCACHE_DIR=/ramdisk/ccache
mkdir -p /ramdisk/ccache
ビルド用のシェルスクリプトを準備します。ビルド時間を測りたかったのと、リモートログインの都合上、ビルド中のメッセージ表示を抑制するためです。
#!/bin/sh
time > log
make TARGET_PRODUCT=beagleboard OMAPES=5.x -j 24 >> log 2>%1
time >> log
makeに-j 24を指定しています。これは最大24並列でプロセスを実行させるということです。
勉強会参加の他の方から「コア数の倍ぐらいがいいらしい」というので仮想12コア→-j 24としました。

ビルド実行します。/ramdisk/GingerBread/で先ほどのシェルスクリプトを実行します。
これで、AndroidのFileSystem、Linux kernel、SGX用カーネルモジュール、それぞれのビルドが一気に行われます。

結果です。ログの先頭と終端の抜粋です。

Sat Feb 11 12:47:14 JST 2012
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.4
TARGET_PRODUCT=beagleboard
……(中略)……
binary texture_benchmark -> /system/bin/texture_benchmark
Installation complete!
make[1]: Leaving directory `/ramdisk/GingerBread/hardware/ti/sgx'
Sat Feb 11 12:56:47 JST 2012

12:47:14に開始して12:56:47に完了しています。
数十分ぐらいかかるかと思いきや9分33秒でビルド完了です。
速いです。

この後は、ビルド結果を手元にダウンロードして動作確認します。

ダウンロード用にファイルを準備します。
make fs_tarball
ダウンロードすべきファイルは以下2つのファイルです。合計で約43MByteです。
/ramdisk/GingerBread/out/target/product/beagleboard/rootfs.tar.bz2
/ramdisk/GingerBread/kernel/arch/arm/boot/uImage

あとは手元のLinuxでの作業です。

BeagleBoard-xM用のPrebuiltイメージを使います。
tar xvfz beagleboard-xm.tar.gz
cd beagleboard-xm
rm Filesystem/rootfs_beagle_xm.tar.bz2
ダウンロードしたuImageをbeagleboard-xm/Boot_Images/にコピーします。
ダウンロードしたrootfs.tar.bz2をbeagleboard-xm/Filesystem/にコピーします。
sudo ./mkmmc-android.sh /dev/sdb (要注意)
最後の/dev/sdbは環境によって/dev/sdcだったり/dev/sddだったりします。

2012/02/12

さくらクラウドでAndroidビルド(準備編)



2012/02/11は勉強会「BeagleBoardをこねくりまわすかい」に参加しました。

この勉強会のネタの1つは、
ハイスペックなレンタルサーバでAndroidをビルドしたらどのくらい速いのだろう?
ということでした。

そこで私が担当してさくらのクラウドを借りて操作してみましたので、まずは準備編を記してみます。

さくらのクラウドを選んだのは
  • とりあえず知ってた (SoftwareDesign誌とかで)
  • 既にさくらのVPSユーザだったので、手続き関係が楽だった
  • 日割りで使える
  • ネット情報ではAWS EC2に比較して特別高額とかじゃないらしい
とかの理由でした。

みんなで割り勘するから、思いっきりハイスペックなの試そうぜ、というので
プラン12: 仮想12コア メモリ96G ディスク20GB
を選択しました。ちなみに4,080円/日です。
ディスクよりメモリの方が大きいしw

Webブラウザの管理画面でサーバを作成します。
こんな風な画面で進んでいきます。
  1. サーバプラン プラン12: 仮想12コア……
    (この料金表示はディスク20Gの21円/日を含んでいません)
  2. 作成方法 テンプレートから作成
  3. テンプレート [パブリック] (20GB) Ubuntu 10.04.3-server 64bit
  4. ホスト名 host01
  5. パスワード (rootのログインアカウントを2回入力)
  6. SSH 今は設定しない
  7. eth0 共有インターネット回線に接続
  8. 名前 host01
  9. 説明 (空)
  10. タグ (空)
  11. アイコン (デフォルトのまま)
  12. すぐに起動 いいえ
  13. @auto-boot いいえ
最後の確認まで行って、[作成]を押すと、ものの30秒ぐらいでサーバが準備されます。
サーバにはグローバルIPアドレス(IPv4)が1つ割り当てられます。

Webの管理画面でサーバが準備されたことが確認できますので、選択して[起動]します。
Webブラウザ上のコンソールからも操作できますが、
初期状態でrootでパスワード認証ssh接続が可能ですので、sshで接続して設定していきます。

  • 作業用の一般ユーザアカウント準備
useradd -u 2000 -m -G admin ise
passwd ise
  • Javaインストール用のリポジトリ準備
    /etc/apt/sources.listを編集して以下のコメントアウトを解除
deb http://archive.canonical.com/ubuntu lucid partner
deb-src http://archive.canonical.com/ubuntu lucid partner
  • 必要なパッケージをインストール
apt-get update
apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expect
apt-get install ia32-libs libc6-dev-i386 lib32ncurses5-dev lib32readline5-dev lib32z-dev g++-multilib
  • RAMディスクの準備
    今回は有り余るメモリ量だったので、RAMディスク上で作業することにしました
sudo mkdir /ramdisk
sudo mount -t tmpfs -o size=64g tmpfs /ramdisk

準備はここまでです。