カテゴリー別アーカイブ: Rockchip

FirefoxOS on Android Stick (ビルド編)

はじめに(言い訳)

ここのところなかなかネタを書く時間が取れなくて久々の更新です.今回は今年公開して FirefoxOS をいろいろいじる契機になった FirefoxOS on Android Stick のビルド話を書きたいと思います.

前に書いた記事のころはまだ試行錯誤を繰り返して動かしていてビルド手順はかなり難しく再現も難しかったので,最新の Stick を手に入れてそちらに移行してからにしようと思っていました.しかし新機種(MK802IV)は Kernel config に手を入れないと FirefoxOS では使えなかったため kernel のビルドからやり直してたのですが,これが全然思い通りに起動せず,結局いじる時間もなく放置してしまうことになり,さらに悪いことに FxOS 2.x の tablet 未対応が直らず,結果として旧機種(MK808B)の更新も停まっていたのでした.

ということで,年末のこの機会に一度ビルド手順を見直して,なんとか共有できるところまで持っていこうとした顛末です.Stick の個体とか開発環境の差とか面倒なところは無視してるので,この手順を見ても全然動かないかもしれません.まぁこんな風にやってるんだなという雰囲気でお願いします.

ちなみにこれを機会に GitHub の放置アカウントにようやく手を入れました:-)

まずは開発環境の準備

MDN:Firefox OS ビルドの必要条件 を準備してください.これはどの機種のビルドも同じです.

ソースの入手

当然ながら B2G 本体は Stick を選ぶことができませんから,自前で用意した repogitory から取ってきます.config.sh を実行すると,機種依存部分以外は全て他プロジェクトから取って来る形です.今取ってこれるのは v1.4 だけにしています.

% git clone https://github.com/kuni6800/B2G.git
% cd B2G
% git checkout --track remotes/origin/rkand
% GITREPO=https://github.com/kuni6800/b2g-manifest BRANCH=rkand-v1.4 ./config.sh rkand

Android ライブラリの入手

Gonk 層に当たる HW 依存部分はベンダーからリリースされる Android 向けライブラリを使います.SoC提供会社からバイナリ提供されるのが基本ですが,MK808B は ROM image でしか公開されておらず再配布条件が確認しづらいので,本体から持ってくることにします(調べてみると github のいくつかで普通に上がってるけど…公開できるのだろうか?).

Android ライブラリをツリーに用意します.adb などを駆使して Android 本体の system/ 以下を device/rockchip/rk30board/proprietary/system/ 以下に持ってきます. 全部持ってくる必要はなく,実際に必要なファイルは device/rockchip/rk30board/proprietary/release.mk に記載しています.または Finless ROM などにある system.img を mount -o loop で直接マウントする手もあります(お勧めしませんが).

パッチ当てとビルド

build.sh でそのままビルドできればいいんですが,以下のような厄介な問題

があって手動で作業する必要があります.これら差分は github で fork して作業したものを公開してもいいのですが,バージョンに依存するかなり暫定なものなのでとりあえずパッチの形にしています.

まず「xdelta」を apt-get などでインストールしてください.その後,スクリプトを実行してパッチを当てます.

% pushd device/rockchip/rk30board/patches
% ./patch.sh
% popd

なんだか失敗してしまったようなら,patch-rev.sh で戻してから原因を追ってください.

あとは失敗しないことを祈りつつ build.sh を実行して暫く待ちます.

% ./build.sh

アーカイブを作成

めでたくエラーなしでビルドが完了したら,アーカイブを作ります(ROM を作らないのは PicUntu(Linux) を使うため).archive.sh を実行すると「b2g-rkand-(日付8桁).tar.gz」 のファイルが出来上がります.

% ./archive.sh

 PicUntu kernel の Recovery への書き込み

PicUntu のインストールはすでに紹介していますので,こちらを参照ください.MK808B の PicUntu は元の Android を壊さずに recovery 領域に kernel をインストールするのでいろいろ面倒ですが,ファイルシステムは SD カードなのでPCでファイル変更できるという融通が利きます.

ファイルシステムの micro SD カードへのインストール

micro SD カードを用意して PC に挿して,Linux 上でファイルシステムを作ります.予め dmesg などで SD カードのデバイス名(以下 sdX) を確認しておきます.

microSD カードへのパーティション作成とフォーマットを行います.この例では全ての領域を1つのパーティションで設定しています.くれぐれも microSD カードの中身はバックアップしてから実施してください.

% sudo fdisk /dev/sdX
コマンド: p<CR>    # 情報確認
コマンド: d<CR>    # パーティション(全)削除
コマンド: n<CR>    # パーティション作成
Select: p<CR>     # プライマリ
パーティション番号: 1<CR> # →パーティション1
先頭セクタ: <CR>   # →先頭から
Last セクタ: <CR> # →末尾まで
コマンド: w<CR>   # 書き込み
% sudo mkfs.ext4 -L linuxroot /dev/sdX1

microSD カードのフォーマットができたら,マウントしてアーカイブを展開します.先ほどの FxOS のアーカイブもここで展開します.

% mkdir linuxroot
% sudo mount -t ext4 /dev/sdX1 linuxroot
% sudo tar -C linuxroot -zxvf picuntu-linuxroot-0.9-RC3.tgz
% sudo tar -C linuxroot/root -zxvf b2g-rkand-xxxxxxxx.tar.gz

PicUntu 起動してから FxOS を起動するため,その起動用スクリプトを作成します.スクリプトの2行目はConsoleの停止,3行目は画面サイズの変更,4行目は FxOS への切替です.

% sudo cat > linuxroot/root/start_b2g.sh
#!/bin/sh
echo 0 > /sys/class/vtconsole/vtcon1/bind
fbset 1280x720-60-32 -a
chroot /root/root /init
<Ctrl-D>
% sudo chmod +x linuxroot/root/start_b2g.sh

最後にアンマウントして microSD カードを取り出します.取り出したカードは MK808B 本体に挿しておきます.

% sync
% sudo umount linuxroot

Recovery モードでの起動

ようやく本体の起動です.ただ,Android を残していたためそのままでは Android が起動しますので,Recovery モードで起動しなければなりません.困ったことに MK808B には外部操作で Recovery モード起動する方法がなく,以下の方法を取らざるを得ないのが現状です.

  • ターミナルアプリをインストール,ターミナルから「adb reboot recovery」を実行
  • Reboot.apk を導入して「Reboot Recovery」を選択
  • 設定でIPアドレスを調べて「adb connect <ipaddress>」で接続,「adb reboot recovery」を実行

FirefoxOS の起動

PicUntu kernel が起動すると,暫くして Console に login prompt が出ます.アカウントは root,default password は「12qwaszx」 です(公式情報).

ログインできたら,先ほどのスクリプトを起動します.

% ./start_b2g.sh

初回にかなり時間が掛かります.不安定なので Crash Report が出るかもしれませんが,画面が出れば成功です.

最後に

まだまだよく分からない作業が途中にたくさん入っていて,「すぐにやってみる」には程遠いですね.せめて PicUntu や Recovery を使わないで ROM 焼きだけで直接起動したいものです.

また,Android ライブラリ(gralloc.so)の使い方が FirefoxOS では違うのか,エラーが出てメモリリークしてすぐに固まってしまうようです.メッセージからソースがあればすぐ分かる感じなのですが,バイナリ部分なのでもどかしいところです.

これから他のいろんな端末で FirefoxOS の起動に挑戦する方が居られると思いますが,その何かの助けになればいいなと思います.

MK802IV と PicUntu

MK802IV を試す

これまで使っていた Android Stick の MK808B は、PicUntu の kernel config をいじらなくても結構使えたのでそれをベースに FirefoxOS を試していました。とはいえ一世代前の製品ということもあって不都合もあります。

  • 本線は RK3188 に移っているので開発から置いていかれる
  • Android も 4.2 から更新されることもない
  • Recovery 起動のままなので一度 Android を経由しないといけない (最新 PicUntu は直接起動可能)
  • もう一台ないと冒険できない(最悪焼き失敗したら文鎮になるので)

ということで RK3188 搭載の Stick に乗り換えるべく以前より同じメーカー Tronsmart の MK908 を購入して試していたのですが、 Tronsmart MK908 は PicUntu の本線でないことや build した kernel がなかなか安定して動かないことから、Rikomagic MK802IV を入手し、そちらを試しています。

MK802IV

MK802IV は直接 HDMI 端子が出ているのでディスプレイに直接挿すことができますが、HDMI オスコネクタなので今回は サンワサプライの HDMI-VGA 変換で アナログRGB に出すことにしました。

PicUntu 導入

PicUntu 4.5 は 本体 NAND メモリから boot 及び root filesystem を置くようになっています。Android は上書きにより使えなくなるので注意してください。

Windows による導入手順は FreakTab のスレッド に詳しく書いてありますが、翻訳しておきます(一部修正追記)。

  1. picuntu-4.5-BasicGUI-Nand をダウンロードし、任意の場所に展開します。
  2. 本体を bootloader モードにする必要があります。本体のmicroSD側にある通気スリット真ん中の凹んだ部分にボタンがあり、先の細い棒でボタンを押しながら電源を入れます。Android が起動している場合は、adb で接続して “adb reboot bootloader” でも可能です。
  3. rk_flash_1.37 フォルダの RKAndroidTool.exe を実行します。ウィンドウの下方に “Found Device ready to flash” が出ていれば OK です。
  4. オプションのうち binloader, parameter, kernel, boot, system をチェックし、misc, recovery, backup のチェックを外します。以下の画面のように設定します。rk_flash_tool
  5. 「Erase NAND」ボタンを押して 内蔵 NAND メモリを初期化します。
  6. 「Flash ROM」ボタンでイメージを書き込みます。
  7. 自動的に再起動され、GUI のログイン画面が立ち上がります。

PicUntu on MK802IV

Kernel ビルド

カーネルソースは github に公開されています。さらに kernel から最初に呼び出す initramfs もビルドに必要なので取得しておきます。

$ git clone https://github.com/aloksinha2001/Linux3188.git
$ git clone https://github.com/Galland/rk30_linux_initramfs.git

MK802IV で使える kernel config はすでに用意されているので、コピーしておきます。

$ cd Linux3188
$ cp arch/arm/configs/rk3188_picuntu-4.4-MK802IV-AP6210_defconfig .config

そのままでは NAND パーティションが異なる(Android recovery 向け)なので、.config の CONFIG_CMDLINE を以下のように置き換えます。パーティションは PicUntu-4.5-NANDGUI 向けの設定にしています。最後の text は CUI で起動するための指定です。

CONFIG_CMDLINE="init=/sbin/init root=/dev/mtdblock2 mtdparts=rk29xxnand:0x00008000@0x00002000(boot),0x00008000@0x0000A000(kernel),-@0x00012000(system) text"

さらに、Framebuffer Console の切り離しができるようにオプションを有効にします。これができないと FirefoxOS を乗せる際に Framebuffer Console が有効になったままになるため、画面が Console Log で延々上書きされることになってしまいます。

CONFIG_VT_HW_CONSOLE_BINDING=y

ビルドを実行します。以下では CCPATH にコンパイラの path を指定します。INSTALL_MOD_PATH はカーネルモジュールを保存する path を指定します。全て完了すると イメージファイル KERNEL.img が得られます。

$ export ARCH=arm
$ export CROSS_COMPILE=$CCPATH/arm-eabi-
$ export INSTALL_MOD_PATH=$PWD/mod
$ make -j4
$ make modules_install
$ mkknlimg arch/arm/boot/zImage ./KERNEL.img tvbox:

できた kernel イメージは上記で展開したフォルダにある rockdev\Image 以下に名前を変えて(たとえば mykernel.img とか)から保存し、 rk_flash_1.37 フォルダの RKAndroidTool.exe を起動して、kernel の path 部分を変えた名前(..\rockdev\Image\mykernel.img)に変更してから 「Flash ROM」で 書き込みます。

FirefoxOS の可能性

Android や FirefoxOS が使う OpenGLES ライブラリは GPU である Mali が使えるようにするため、kernel build でドライバも build する必要がありますが、今のところ有効にすると console が表示できずうまく起動しないようです。Framebuffer Console がぶつかるのかもしれませんが、原因追跡が必要です。

すでにパッケージに用意された build 済み ドライバは API バージョンが異なるため使用できないようなので、まずはこの辺りの突破が最初の関門のようです。

PicUntu導入

一昨年,Rockchip SoC が搭載された Stick 型や Box 型のデバイスがかなりの勢いで発売されました.HDMI 端子に TV を,USB 端子にマウスを繋いで電源を供給すれば,Android 端末として動作するというものです.最近では Amazon でも比較的簡単に入手することができ,DualCore や QuadCore の Cortex-A9 環境が 5000~10000円という破格値で売られています.

FirefoxOS on AndroidStick もこの PicUntu の最小インストールをスタート地点にしています.

PicUntu とは?

PicUntu とは,その Rockchip SoC 搭載の AndroidStick で動作している Ubuntu Distribution で,DualCore の RK3066,QuadCore の RK3166 がターゲットとして開発が進んでいます.とりあえず 手順に従って導入し,LXDE のデスクトップ環境を構築してみました.

PicUntu_LXDE

導入方法はサイトを見ていただければよいのですが,サイトは英語ということもあるので,FirefoxOS を載せるベースとなる準備段階までをメモしておきます.ここでは RK3066 ベースの mk808b を例としておきますが,PicUntu の開発ストリームは RK3166 ベースに移行していますので,最新環境に追従したい方は別途情報を収集してください.

用意するもの

  • Android Stick 本体
  • microSD カード (4GB 以上)
  • 電源供給用 miniUSB-USB ケーブル
  • miniHDMI-HDMI ケーブル (TV やモニタに接続)
  • USB ハブ,キーボード,マウス
  • USB-LAN (option; ASIX AX88772 は動作確認済)
  • USB-WiFi (option; Ralink RT2870 は動作確認済)

mk808b の PicUntu は内蔵 Wi-Fi や内蔵 Bluetooth が使えませんので,必要に応じて USB-LAN や USB-WiFi を導入します.
(※ kernel を再構築すれば Wi-Fi は使えそうなのですが再構築 kernel の搭載に成功してません.さらに mk808b はクローンが存在し,異なるチップが載ってたりして開けないと分からないため厄介です.)

インストール手順としては,bootloader と kernel の入った ROM イメージを本体の NAND flash に書き込む作業と,root ファイルシステムを microSD に書き込む作業の2つです.先人が詳しい説明を書かれていますので,そちらも参考にしてみてください.

ROMイメージのNAND flash への書き込み

RK3066 の PicUntu は NAND flash の Recovery 領域に bootloader と kernel の ROM イメージを置くため,Recovery 領域から起動する必要がありますが,残念ながら購入時の Android ではできません.そのためカスタム ROM の導入(要は root 化)が必要です.メジャーなところでは Finless ROM があります.mk808b 向けの Finless ROM は V1.7 を使いましたが,書いた時点より上がってるので探してみてください.ただし PicUntu の導入には新しい必要はありません.

RK3066 の PicUntu は開発が止まっていますので 0.9RC3 が最新のようです.ダウンロードファイルより ROM イメージ(*.img) を取り出します.

WindowsPC にて ROM パッケージに含まれる RKAndroidTools(ROM_Flash_Tool_xxx.exe) で NAND flash への書き込みを行います.

  • まず「本体裏の左側の穴をピンで突きながら電源を入れる」ことで bootloader モードに入ります.ドライバが要求されますので,ROMパッケージに含まれる rockusb.inf を指定してインストールします.インストールできれば NAND flash の書き込みが出来る状態です.
  • RKAndroidTools を起動します.recovery の Path を PicUntu の ROM イメージに書き直し,「Flash ROM」で書き込みが完了します.

Root ファイルシステムの microSD への書き込み

PicUntu は microSD 上の ext4fs を使います.rootfs のファイルは 「picuntu-linuxroot-0.9-RC*.tgz」 の形で配布されていますので,PC Linux や GParted LiveCD などを使って,microSD にパーティションを作成してラベル “linuxroot” で ext4fs にフォーマットした後,mount して rootfs のファイルを展開します.

起動

microSD を本体に挿して電源を入れ直します.カスタム ROM の Android が起動し,terminal を起動して recovery モードでリブートします.terminal がない場合は Google Play から入手してください.

$ su
# reboot recovery

コンソールが接続されたモニタに表示され,root:12qwaszx で login できれば成功です.

あとは煮るなり焼くなりどうぞ.apt-get install で用意されている arm 版 package が PC と同じ感覚で導入できます(速度は…同じ感覚とはいきませんが)

FirefoxOS on Android Stick (現状報告)

いろいろ試行錯誤した結果,「mk808b」に FirefoxOS を載せてなんとなく動いています.技術的な解説は別の機会でするとして,今のところ確認できてることは以下の通りです.

  • Recovery 上の Linux 経由での FirefoxOS v1.3 起動 (Recovery 起動 のため Android 起動必要)
  • homescreen 表示と USBマウス/キーボード操作
  • USB Ethernet でネットワーク接続(Wi-Fi は×)
  • webm(動画) と ogg(音楽) の ソフト再生,Gallery App の画像表示
  • MarketPlace からの App インストール

fxos-home fxos-web fxos-marketplace fxos-movie

試行錯誤の途中には,色がおかしくなる問題・メディアストレージが見えない問題・Console 表示問題などを解決しています.一見素直に動いているのですが,裏では大量のエラーを吐いている状態のため時間経過と共に動作が不安定になってきます.これはバイナリで供給している部分(kernel や Android ライブラリなど)があり,ソースから build した部分と不整合があるためです.これだとちょっとまだ実用には遠そうです.

kernel の不整合は,公開 git があるので config を今動いているものに合わせて driverを有効にし, build と ROM化すれば解決しそうなのですが,config 情報や build 条件が見つかっていないためうまくいっていません.これができれば Wi-Fi なども突破できそうなのですが…

Android ライブラリの不整合は,バイナリ供給元がソース非公開にしていることや,FirefoxOS がベースにしている Android バージョンと元のバージョンが合っていないことが原因です.これもなかなか一筋縄ではいかなさそうです.

ベースにしている PicUntu の開発ストリームはすでに次の世代のSoCである RK3188 に移行しています.kernel や driver の追従には RK3188 搭載 Stick をターゲットにした方がいいかも知れません.手元には搭載 Stick の「mk908」も準備中です.

 

FirefoxOS on Android Stick (準備)

最近は次世代 Web platform として ChromeOS, Tizen そして FirefoxOS が熱いのですが,その中でも Community 活動が活発な FirefoxOS に注目しています.

しかしいざ試してみようとしても端末はまだ手に入りにくく,Simulator で遊ぶか build 環境を整えて Emulator で試すくらいだったのですが,build 環境が Android ベースだったので Android が自由にいじれる環境があれば試せるなぁとおぼろげに思っていました.
Android 環境といえば手元には Nexus7(2012)があるのですが,Android の build や ROM 事情をよく知らないこと,そもそも実用で使ってるので環境をつぶすわけにもいかず,結局 Nexus7 を生贄にするのは断念しました.

その後, Android Stick の紹介を偶然見て割と安く手に入るということを周回遅れで知り,
「これで動かせるんじゃないの?」ということでちょっと足を突っ込んでみたのが始まりです.

Android Stick でメジャーなものとして「mk808」があり, 登場して結構経っていて,技術的には枯れていて情報が出回っているだろうということで選択してみました.とはいえ実際に情報を漁ってみるとまずメーカー情報自体がほとんどなくClone製品まであるということやソフト環境も野良情報ばかりで結構大変でしたが.

  • SoC は Rockchip RK3088,内部に Cortex-A9 Dual を抱えてて,Android を動かせるだけのスペックは備えている
  • HDMI 出力専用で FullHD まで出せて USB, Wi-Fi, Bluetooth に対応.

しかし Bagleboard や Pandaboard のように full build で試せるわけではないので,それに近い環境を探す必要があります.この SoC では Ubuntu ベースの Linux Distribution 「PicUntu」の開発が活発で,それをベースに Emulator 環境を載せていけばなんとかなりそうな気がします(本当か?).