2012/12/14

FT311Dの設定

 引き続き、チップ単体そのままでADKが実現するFT311Dについてです。

 ADKは機器をAndroidに接続した時に機器を区別して立ち上げるアプリを別々にできるように文字列を送る仕組みになっています。
FT311Dのデフォルトは以下のようになっているそうです。
  • Manufacture : FTDI
  • Model (FT311Dのモードに以下のいずれか)
    • FTDIGPIODemo
    • FTDIUARTDemo
    • FTDIPWMDeomo
    • FTDISPISlaveDemo
    • FTDISPIMasterDemo
  • Version : 1.0
  • Serial : VinculumAccessory1
  • Description : Vinculum Accessory Test
  • URL : http://www.ftdichip.com
データシートによれば、これらは設定ユーティリティを使ってWindowsPCから書き換えられるそうです。
確かに設定ユーティリティがダウンロードできます。
こんな画面です。

 ですが、Development ModuleとどうやってPCと接続するのか分かりません。基板はUSB Type-Aコネクタですから、USBケーブルでは繋がりませんし…。
ユーティリティのドキュメントは「AN212 User Guide for FT311 Configuration Utility V1.0」らしいのですが、FTDIのウェブサイトにはまだ上がっていないようです。

 もしかして「VNC2 Debugger/Programmer Module」が必要なのかも?
ひとまずは、デフォルトのままでも困らなさそうなので、このまま使おうと思います。

FT311D Development Moduleを動かしてみました(その2)

 前回に引き続きFT311DのDevelopment Moduleを動かしてみました。
今回は簡易ロジアナを接続してどんな波形が出てるか見てみました。

GPIOモード

 まずはGPIOモードを見てみました。
モードは基板の3つのジャンパプラグで選べるようになっています。
下図の丸で囲んだ部分です。基板のシルク印字に従ってOpen/Closeを設定してから電源入れるとOKです。


 GPIO0とGPIO6を出力にして波形を見てみました。
まったく同タイミングで立ち上がっているようです。

 どうせ後で簡易ロジアナを使うならGPIO0~GPIO6全部を観測すれば良かったのですが、この時点ではオシロで測ってました。
おそらくですが、GPIO0~GPIO6は全て同一タイミングで変化するんじゃないかと想像してます。

 力業で何かのプロトコルを実現するのもできそうですね。

 GPIOの状態ですが、Androidのアプリが終了しても維持されるみたいです。
AndroidとのUSB接続が切れた時にFT311D側がリセットされるようで、出力に指定していたピンもハイインピーダンスになるみたいです。

PWMモード

 次はPWMモードで動かしてみました。
簡易ロジアナでPWM0, PWM1, PWM2を見てみました。設定は
  • 周期1ms
  • PWM0 デューティ 20%
  • PWM1 デューティ 40%
  • PWM2 デューティ 60%
としてます。
周期は1~250msを1ms単位で、デューティは5~95%を1%単位で指定できるみたいです。デモアプリの動きを見ると、デューティは0%も指定できるみたいです。

 波形はこんな風でした。
チャンネル間で立ち下がりが一致する形で動いているのが分かります。

 PWMモードもAndroidのアプリが終了しても信号出力は維持されるようです。
AndroidとのUSB接続が切れた時点で全チャネルLowになるみたいです。

SPI Masterモード

 最後にSPI Masterモード (FT311Dがマスターになる) を試してみました。

 デモアプリから何バイトかWriteしてみてSS0, CLK, MOSIを観測してみました。
上から3Byte, 4Byte 8Byteを送出した場合です。
3Byteの時は時間分解能が異なります。


 SSをかなりがっつりアサートしているようです。まぁ、きわどいのよりはいいです。
若干不思議なのは、送出バイト数によってSSの立ち上がりタイミングが遅くなったり早くなったりするみたいです。細かいことですが…。

 1Byteを送出した時のCLKとMOSIはこんな感じでした。
SPIはモードが4つありますが、FT311Dでは Androidのアプリ側から設定して切り替えられるようです。

 アプリの準備などができたら、どのくらいのレートが出るか測ってみたいな、と考えています。

2012/12/13

FT311D Development Moduleを動かしてみました

 ZedBoardも触ってはいるのですが、
FTDI社のFT311D Development Moduleが届いたので、とりあえずAndroidに接続してみました。

 FT311DはそのままでAndroidに接続するだけでADKが使えるというチップです。
FT311D側がUSB Hostになって、Androidに給電しながら動く形です。
コンフィグピン(3bit)の設定で
  • GPIO (7bit)
  • UART (1ch)
  • PWM (4ch)
  • I2C (1ch)
  • SPI (1ch, FT311Dがスレーブ)
  • SPI (1ch, FT311Dがマスター)
のどれかで動作させられます。(追記:PWMが抜けてたので直しました2012/12/13)

 これまでAndroidに何か繋ぐとなると、Arduino, PIC, mbedなんかでMicroBridgeかADKという感じでしたが、
簡単なGPIOや、ともかくUARTでいいって場合には、もうこれでいいんじゃない、というお手軽なモノです。

 FTDIサイトでデモアプリのソース、APKを配っています。
ひとまず、GPIODemoを試してみました。

 Nexus7 (Android4.2.1) で動かすとこんな感じで、すんなり動きました。
  • OUT BITMAPで0, 1をチェック
  • CONFIGをクリック
  • OUTDATAを操作して、WRITEをクリック
とすると、LEDが反応しています。

 次はNexus S (Android 4.1.1) に接続してみると…、動きません。というか画面が変です。
こんな感じです。

 どうもレイアウトがダメっぽいです。これでは右にあるはずのCONFIGやWRITEがクリックできません。

 ソースも配布されているので、手っ取り早くレイアウトをいじってみました。
手抜きですがこんな感じになりました。基本的にWidthとかMarginとかを小さい値にした感じです。
 これでなんとかCONFIGやWRITEがクリックできます。

 実際、接続してみると、操作しにくいですが動きました。

 このままGPIOなんかで使ってもいいのですが、
今後はFPGAとAndroidの接続に使ってみようかと考え中です。
Twitterで情報が流れてて、「あ、それがいいな」と。

 今までは

  • Android --(USB)-- PIC --(SPI)-- FPGA (PICでMicroBridgeを実装)
  • Android --(USB)-- MAX3421E --(SPI)-- FPGA (FPGA上のNiosIIにMicroBridge or ADKを実装)

とかやっていたのですが、FT311Dを間に挟むのがトラブらなさそうで良いかなと期待しています。

2012/11/14

ZedBoardのDDR3 SDRAMチップ

 ふと気づいたのですが、ZedBoardの2012/08/24版の回路図にはDDR3 SDRAMチップは
MT41K128M16HA-187E
となっています。 ですが、Hardware User's Guideには
MT41J128M16HA-15E
と書かれています。 Board Definition Filesのzedboard_RevC_v2.xmlにも
MT41J128M16HA-15E
と書かれています。

 結局、-187Eなのか、-15Eなのかどっちだよ。

 実物は……、直接の型番は刻印されてないんですよね。これに限らず、最近は小さい部品が多くて、刻印見ても型番分かりづらいですよね。

 でも、調べてみると、MicronはWebページにFBGA Decoderというのがあって、FBGAのチップ刻印とパーツ型番の対応を調べられます。

 結論としては、FBGAの刻印 D9LGQ は -15E と対応するので、搭載チップは-15Eの方でした。

 さらに、ZedBoardのサイトをチェックすると、2012/11/08版の回路図が提供されていて、それでは、型番が直っていました。ボードにも色々Errataがあるらしく、赤字でいろいろ書かれていて不安になる回路図です。

 ところで、-187E-15Eで何が違うのかというと、主には最大動作周波数みたいです。PCパーツ風に言えば、DDR3-1066かDDR3-1333かということですね。-15Eを666MHzで動かす場合はCL=9ですが、-187Eを533MHzで動かす場合はCL=7になるとのこと。-15Eは533MHzで動かせば-187EとコンパチになりCL=7で動かせるみたいです。

 ということで、ZedBoard開発では実物が-15Eでも、533MHz動作なのでCL=7にセッティングするのが、CL=9に比べて、ホンのわずかアクセスが速くてお得そうです。実際にSDKにExportされるhw_platformのサマリを見た限りでは、-15E設定でもCL=7になっているので、デフォルトで大丈夫みたいです。

Xilinx ISE 14.3

 これまでZedBoard用にはXilinx ISE 14.2を使っていましたが、14.3をインストールしてみました。

 WebPackライセンスでXPS立ち上がるときにラインセスエラーのダイアログ出るのは相変わらずでした。

 とはいえ良くなっている点はあって、まず、新規プロジェクト作成時のボード選択にZedBoardが追加されていました。


 これまではZC702で進めていって、後でZedBoardの情報をImportさせる、としていたので、一手間減りました。

 他にもPlanAheadでも見た目など微妙には変わっているようです。ですが、大きな落とし穴が……。

 BitGenまで進むと、
ERROR:Bitstream:188 - Bad time stamp "MON 29 OCT 10:2:52 2012". Expected "YYYY/MM/DD HH:MM:SS".
といったエラーが出ます。 既にXilinxのサポート情報にも載っていて、「ISE 14.3 - 「ERROR:Bitstream:188 - Bad time stamp"」というエラー メッセージが表示される」によると、

  • エラーと出てもbitファイルは生成される
  • LANGUAGE環境変数がJapaneseだと発生する
  • 14.4で修正予定

だそうです。エラー内容自体がどやねん、って感じですが、エラーと言っておきながらbitファイルは生成されるって……。

 それでも、発生条件が分かったので、回避できるか試してみました。
PlanAheadはバッチファイル(私の場合C:\Xilinx\14.3\ISE_DS\PlanAhead\bin\planAhead.bat)から起動しているので、それの最初の方に
set LANGUAGE=usenglish
と追記してみると、エラー出なくなったみたいです。

 Linuxでは試していないですが、同様の状況なら、LANG環境変数をCかen_USあたりにすれば回避できるように想像できます。

 長く使っている人ならCADツールのロケール周りの問題は珍しくはないですね。

 最近は、よく海外に行く人と話していると「シリコンバレーとか中国系とインド系の人ばっかり」とか聞きますので、ツール開発には英語ネイティブじゃない人が多く加わっていそうですが、それでもソフトウェアのインターナショナル対応は進まないものですね。

2012/11/13

ZedBoard未使用ピン

 ZedBoardというかZynqについてなのですが、PL部分の未使用ピンはどうなるのかな?と思ったので調べました。

 Xilinxの開発フローでは未使用ピンの状態はBitGenの時点で決まります。
BitGenはフローの最後に.bitファイルを生成するステップです。

 「コマンドラインツールユーザーガイド」のBitGenの章によると-gオプションで、サブオプションUnusedPinというところになります。

 Version 14.1については、Pulldown, Pullup, Pullnoneのいずれかが設定でき、デフォルトはPulldownだそうです。(デフォルト値はツールバージョンによって変わったことがあった気がします。XilinxじゃなくてAlteraの話だったかもしれませんが…)

 ZedBoardのチュートリアルなどでは、特にBitGenにオプション指定していないので、デフォルトのPulldownになっているのだと思います。

 ZedBoardのような開発ボードでは、FPGA外にいろいろ繋がっているけど全部は使わない、ということが多いので (例えば、SSRAM繋がっているけど使わない、とか)、変なことにならないようにしておきたいです。
 まぁ、気になるなら、使ってないデバイスについてもポート宣言キッチリしてCS#なんかをHigh固定でネゲートするとかすればいいんですが。

 DC特性によれば、Zynq側でのプルアップ/プルダウンは10kΩ以上の抵抗値みたいです。ということで、それより十分に小さい抵抗でプルアップ/プルダウンしている分には外付けのプルアップ/プルダウンが優先されそうです。うーん、でも、それはそれで、電流消費が増えたり、プルアップ/プルダウンに逆らってドライブするのが大変とか、相手のVILとVIHの範囲が云々…、と色々悩ましい感じもしますが。

 ま、ともかく、簡単にZedBoard回路図を見てみると……、

  • スライドスイッチ、プッシュスイッチ、LEDは変に電流流れたりすることは無さそう
  • Audio Codec、HDMI Transmitterは細かくは見てない。I2Cの外付けプルアップとZynq内部のプルダウンがぶつかっていて少し気持ち悪いかも
  • OLED(信号部分)も細かくは見てない
  • OLEDの電源スイッチのN-MOSのゲート信号が外付けプルアップ 10kΩとZynq内部プルダウンがぶつかっていて、上のI2Cより気持ち悪い気が

――というので、実はむしろPullup設定の方がいいのでは?という気も。

 とはいえ、ZedBoardのForumとかでも話題に出てないみたいだし。うーん、調べだしたはいいけどスッキリしない感じです……。

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



    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

    準備はここまでです。