2012/10/28

Stellaris LaunchPad

 すごく安いマイコン基板が出たので、反射的に買ってきました。

 Texas InstrumentsのStellaris LaunchPadです。Cortex-M4Fがのって550円の安さ!実は初入荷の後に店に行ったのですが売り切れで、再入荷との情報を得て、買いに行って何とかゲットしました。お店では

お一人様、4個まででお願いします

――と。そりゃそうですね、破格の安さだし。

 他の方に聞いた話やTIの資料によると、どうも正規価格は約12ドルなので、期間限定のキャンペーン価格なのかもしれません。もう、何枚か買っておこうかな~。

 主なスペックはこんな感じです。

  • TI LM4F120搭載
    • 80MHz 32-bit ARM Cortex-M4F
    • 256KB Flash, 32KB SRAM, 2KB EEPROM
  • オンボードUSB Debug Interface搭載
  • USBから給電
    • レギュレータで3.3Vをマイコンへ給電
  • USB Device機能
  • リセットスイッチ & 2個のユーザ用プッシュスイッチ搭載
  • 16MHz クリスタル搭載
  • RTC用クリスタル搭載
  • フルカラーLED 1個搭載
  • BoosterPack(拡張基板)用コネクタ搭載

 見た目はこんな感じです。裏面にはコネクタしかなくスッキリしています。コネクタが足になるので、基板が裏面でクリップとかに触れてショートする心配なくて良いかと。

左1/4のあたりが、Stellarsis In-Circuit Debug Interface (ICDI) を構成している部分です。よく見ると、ICDIを構成しているのも中央と同じ型番です。結局、Cortex-M4F (LM4F120)が2個載ってます!

 Micro-BのUSBコネクタは左がICDIのポート、下はマイコンがUSB Deviceになる場合のコネクタです。電源はどちらかのUSBコネクタから供給し、それを左下のスイッチで切り替えます。

 ちなみにICDIのUSBを接続すると、仮想シリアルポートも見えます。これはメインマイコンのUARTに繋がる感じです。デバッガとかと独立にシリアルポートとしても使えるので地味に便利かな~と思ってます。

 開発ツールは複数から選べるようですが(評価期間とか制限とかいろいろ異なる)、私はTIのCode Composer Studio (CCS v5)を使いました。

 定番のLチカをするには次の手順でできました。

1. TIサイトから必要なファイルをダウンロード

  • EK-LM4F120XL-CCS (CCS, StellarisWare, ICDIドライバ等が含まれる)
  • Stellaris LaunchPad Workshopマニュアル
  • Stellaris LaunchPad Workshopファイル
の3つです。合計で約1.3GBになります。
 Workshopのは必須ではないのですが、WorkshopのLabに沿って進めるのが手っ取り早いです。

2. ソフトウェア類のインストール

  • CCSv5 (開発環境)
  • StellarisWare (ライブラリなどが含まれる)
  • Workshopファイル
  • ICDIドライバ
の4つです。上3つはセットアップを実行していくだけです。標準のままだとc:\tiとc:\c:\StellarisWareにインストールされます。

 ICDIドライバは基板をPCに接続して、ドライバを入れていきます。PowerSelectスイッチをDEBUGにして、DBG側のUSBをPCに接続します。Windowsのデバイスには都合、
  • Stellaris Virtual Serial Port
  • Stellaris ICDI DFU Device
  • Stellaris ICDI JTAG/SWD Interface
の3つが出てきます。

3. WorkshopのLab2をする

 実は手順2でだいたいLab1をしたことになるので、Lab2をやります。Lab2がLチカそのものです。

 結局は、
  • CCS起動
  • 空プロジェクト作る
  • main.cを書き換える(コピペ)
  • プロジェクトの設定を追加する
    • StellarisWareのヘッダファイルやビルド済みライブラリを使うようにする感じです
  • 実行する
    • デバッガモードになって、バイナリがマイコンのフラッシュに書き込まれて動き出します
って感じです。

    ZedBoardクロック周り

     前回の投稿でZynqで気になっている点として「クロック周り」を挙げましたが、ドキュメントを調べたり、開発環境をいじってみて分かってきました。

     まず、PS側はチップ外から供給されるクロックで動きます。まぁ普通ですよね(マイコンによっては内部に発振回路持っていたり色々ですが……)。
     PLLが内蔵されていて、CPU、DDR3 I/F、etc. それぞれに色々な周波数を供給することになるみたいです。

     気になっていたのはPL側で使うクロックはどうなるのか?という点です。結局、

    • PS側からのクロック (4系統)
    • チップ外からのクロック供給 (&MMCMブロックでのクロック制御)

    の2種類のようです。
     ZedBoardの場合は、チップ外からPLへは100MHzが供給されています。

     PS側からのクロックはXPSの画面で、ここをクリックすると……

    このようなダイアログが出てきて、設定することができます。

     チップ外からのPLへのクロックについては、これまでのFPGAのように「CORE Generator」で「Clocking Wizard」でMMCME2_ADVやPLLE2_ADVを構成すれば使えるみたいです。

    2012/10/07

    ZedBoard買いました

    Zynq搭載ボードのZedBoardを買いました。
    まだ、買っただけで本格的には触れていませんが……。

    ZynqはXilinxが出した新しいFPGAです。
    が、ただのFPGAではなく、ARM Cortex-A9が搭載されています。
    というより、

    Cortex-A9チップのオンチップペリフェラルにFPGAが載っている

    と思った方が近いみたいです。
    Cortex-A9はデュアルコアでZedBoardでは最大667MHz動作らしいです。

    あとは、

    • 513MByte DDR3
    • 256Mbit QPI Flash
    • SD Card I/F
    • 10/100/1000 Ethernet
    • USB OTG 2.0
    • HDMI Output
    • VGA Output
    • OLED Display
    • FMC

    等々が搭載されています。

    とりあえず気になっているのは

    • クロック周り
    • リセット周り
    • ブート手順
    • プロセッサ側とFPGA側の境界部分

    といったところです。

    他の方と話していて

    • Cortex-A9コアをMMU不使用でOS無しマイコンファームウェアみたいなの実行できるか
    • Cortex-A9のデュアルコアをAMPとして、個別に動かす方法

    というのも気になりだしました。

    MMU不使用というのは、現時点ではマニュアルを確かめられていませんが、
    起動後にMMUを有効化しなければ、物理アドレス空間で動くのでは?と思っています。

    気になっている点、今後、調べて備忘録もかねてブログに書けたらよいかと。

    2012/05/23

    第1回 関西FPGA・DE0勉強会に行ってきました

    先週の土曜日2012/05/19、第1回 関西FPGA・DE0勉強会に行ってきました。

    ATNDのページはこちらです。

    第0回に続き、今回も発表させていただきました。発表資料を置いておきます。

    「コマンドラインでFPGAプロジェクト~Quartus, SOPC Builder編~」

    この発表のコマンドラインの使い方 (コマンドラインというかフロー自体かな?)、実は@s_osafuneさんの発表内容に関連した問題があります。

    .sopcファイルからsopc_builderコマンドなり、GUIのSOPC Builderで.v等をgenerateすると、実行するたびにSYSIDが変化してしまいます。
    開発中で試行錯誤中はSYSIDが変化していくのが当然なので問題ありません。

    ですが、バージョン管理システムに追加して、複数のユーザやPCで作業しようとすると、問題が顕在化します。

    同じ.sopcファイルを元にしていても、論理合成はAさん、ファームウェアのビルドはBさん、といった組み合わせで動かせないのです。

    かといって、SOPC Buillderが生成する.vファイル等をまとめてバージョン管理等で保持するのもうまく行きません。SOPC Buillderが生成するファイルに絶対パスが含まれることがあるからです。そのままバージョン管理システムに追加すると、非常に使いづらいものになります(ワーキングコピーを最初に追加した人と同じ絶対パスに配置しないと動かない)。

    では、どうするのがよいのか?

    私の今の考えでは、GitHub等で公開する場合、複数のユーザが参照しうるが、ユーザ間で共同作業しない、という前提で、.sopcファイルのみをバージョン管理対象とするのがベター、と考えています。
    cloneしたワーキングコピーそれぞれで、SOPC構成のgenerate~ファームウェアビルドまでを通して行えば、その中ではSYSID不一致は起こらないはず、というわけです。

    何かよい方法をご存知の方がいれば、是非、次回以降の関西FPGA・DE0勉強会で発表をw

    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はコネクタへの力学的ストレスで壊れやすいという噂もあるので、少し安心です。