au Firefox OS Event

Fx0 発表会

12/23 にベルサール渋谷ファーストにて KDDI Fx0 発表会 に参加してきました.会の内容については各ニュースサイトで詳しく紹介されていますし,ニコ生で中継・録画放送されてますのでそちらをどうぞ.

image001image002image003image004

 

田中社長の発表はもったいぶらせながらも期待させる面白いものでした.他の発表会は見たことがないのですが,非常に楽しませていただきました.

舞台の裏では発表会に続いて行われるハッカソンの発表がありました.実はFirefoxOSでハッカソンってどんな形のものができるんだろうかとかなり興味がありました.各チームとも,UI やサーバ,デバイスとのブリッジとしての開発のしやすさや応用のしやすさを十分活用していました.ただ,会場の Wi-Fi の channel が専用に確保できなかったために,パケットが飛ばずに期待通りの動きが見られなかったのはちょっと残念でした.大きな会場でデモ機をシナリオ通り動かす難しさは痛いほどよく分かりますが,報道や一般の方々に面白い試みがいろいろ詰まってたことは伝わりましたかね?

懇親会では…

イベント終了でゲスト参加者として懇親会にも参加させていただきました.会場にはハッカソンの機材展示や Fx0・OpenWebBoard の実機紹介などもあって,アイデアを気軽に具現化する手段や機材が揃いつつある感じでした.ハッカソンのシマダイチームの方々と歓談して発表の苦労なども聞かせていただきました.

そして最後にBINGO大会もありました.1等が Fx0 本体,2等がフォクすけくん,3等がモバイルセットで各3つずつと,なかなかの大盤振る舞い.まぁこの手の BINGO で揃ったことはないんですが,今日はなかなか調子よく開いていって,リーチからすぐBINGO!

抽選くじを引いて見事に 1等 Fx0 本体が当たってしまいました(^^)

Mozilla CTO の Gal さんから直接手渡され,Congratulation! の言葉をいただきました.発表会の雰囲気を味わえただけでなく,Christmas Present までいただいてわざわざ遠出して来た甲斐がありました.KDDI さん Mozilla さんありがとうございました (_o_)

FirefoxOS Advent Calendar 2014 (18日目)

今日は Firefox OS Advent Calendar 18日目です.

初参戦ですが登録したからには何か記事になることをしないと,ということで,メインストリームで進めていた「FirefoxOS on AndroidStick」を軽くまとめつつ今年の活動を振り返りたいと思います.

久しぶりの「動かしてみる」

元々異なるプラットフォームで何か動かしてみる活動はかなり古くからやっていたのですが,去年の後半に何気なく安価だったので入手した「Android Stick」 と,Simulator で軽く遊ぶだけだった「Firefox OS」の組み合わせを思いついて,久しぶりの「動かしてみる」活動でした.

動かしてみるためにはまずどういう構造なのか・仕組みなのかを知るためにソースを読むわけですが,Gecko-Gonk層の境界を中心に断片的ながらそこそこ読んだものの,各デバイスの機能を UI から理解するために  C++ と JavaScript の境界を越えて(XPCOMやjs-ctypesなど)読むのは非常に苦労しました.

Gonk 層が AOSP ライブラリをベースにしているおかげで,Android が動いていれば取っ掛かりはスムーズ,しかしドライバやベンダ提供ライブラリは公開されず binary だったりするので,Android の想定で作られた前提がことごとく崩れてややこしい問題が現れてくるのです.これを日々叩くために Gecko を試しにいじって反応を見る作業を続け,不安定ながらなんとか動いてるのが現状です.

動かしてみた結果は 関西勉強会と Developers Conference 懇親会 で LT にて報告させていただきました.結構関心を持ってもらえたものの,結局まだ動いてる機体はどこにも公開してないんですね…未だに起動するだけでも console 操作が必要でそこそこ手間だったり,HDMI 出力先が必須なのが今の課題です.

今の活動成果についてはこの Advent Calendar に間に合わせるべく(event駆動型開発!),強引に GitHub に登録してビルド編としてなんとか公開してみました.かなりの長文ですが興味のある方はどうぞ.

仕事でも FirefoxOS?

組込み機器の仕事をしてるので,ボードやチップを扱ってるおかげで目の前の試作機材でも時間があるときに FirefoxOS を動かしたりしてました.割と独自仕様なのでいろいろ苦労したのですが,タッチパネルと Wi-Fi, 動画再生, WebGL 辺りまではなんとかなったのでデモ機レベルまで持っていったものの,軌道に乗せる前に公開することもなくお蔵入りになってしまいました.とはいえ成果の一部は某六本木方面に持ち込んだとか何とか;-)

Flame 端末も購入

やはりちゃんと動く例も見ておきたいので Flame 端末は買いました.普通は update を待たないとなかなか進化しないのですが,build 手順が分かっててすんなり build ROM が入るのはいいですね.適当に作ってた HTML5 を試すデモアプリも簡単に想定通りに動くのはなかなかいい環境です.下回りのドライバやカーネル開発ではこうも行きませんから…

さて次のtargetは…

今年後半はほとんど時間が取れず,来年はさらに環境がすっかり変わってしまってしまうのですが…そんなことはともかく(仕事と同じで)下回りばかりやってても進歩がないので,FirefoxOS の活動にもう一歩踏み込んで,前からやろうと思ってた HTML5 からのデバイス制御辺りは試していきたいと思う次第であります.

 

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 の起動に挑戦する方が居られると思いますが,その何かの助けになればいいなと思います.

FirefoxOS v2.1 と tablet 指定

以前、v2.0 を試した際に「アイコンがでかい」という残念な結果を見たわけですが、先日の勉強会でネタ話にしていたところ、「確か tablet ビルドがあったような」ということで確認してみました。

Gaia のデバイス指定

gaia の Makefile を見ると、デバイス種別を指定するところがありました。phone が指定されていたからアイコンが3列、というのは何となく納得。

GAIA_DEVICE_TYPE := phone

Bugzilla にもBug 1010128 にて tablet が追加されているようです。これは試してみないと。

v2.1 へのアップグレード

tablet ビルドを試す前に、v2.0 から v2.1 に上がったこともあって(phoneのまま)そちらを先に試してみました。すると

マウスカーソルが動かない

という事態に。これは phone だからなのか、修正で何かトラブルなのかは追跡できてないですが、動きを見てると「マウス押す」→「マウス移動」→「マウス放す」という動作でしかカーソルが動かないので、もしかしたらタッチスクリーンの動作に引っ張られてそうな感じです。

v2.1 では新クラス GeckoTouchDispatcher が出来て nsAppShell にあった MouseEvent 処理がそちらに移動したので、その影響でマウス処理が正常にできていないのではないか? と思われます。マウス使う人が増えないとこれは当分直らないか…

tablet ビルドを試す

v2.0 で GAIA_DEVICE_TYPE=tablet のビルドを試したところ、まだ用意しただけで何もできないようで、アイコンも何もない画面で、Notification の Setting すら起動できない状態でした。
No Icon on v2.0 tablet

v2.1 で GAIA_DEVICE_TYPE=tablet のビルドではようやく v1.4 で見たアイコンが出現し、横スクロールができるようになっています。ただし、上記のようにマウスがまともに動かないので先に進むことすら困難な状態です。
appear icon on v2.1, but freeze cursor

ところで、tablet ビルドは以前通り横スクロール、phone ビルドは縦スクロールなので、端末の形態により UI のポリシーは変わっていくようです(今のところ)。ちなみにTVデバイス向けの tv ビルドも用意されているようです。

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 バージョンが異なるため使用できないようなので、まずはこの辺りの突破が最初の関門のようです。

FirefoxOS の日本語化

FirefoxOS の日本語化の解説はすでに先人の方々が詳しくされているので、素直に日本語化したい方はそちらを参照したほうがよいかと思います。また MDN では Localizing FirefoxOS にL10N化のドキュメントがあります。
flame goes to v2.2-master

以下では、ローカルツリーに差分 commit して、upsteam に追従出来る形で進めた手順です。
(※ 以下のコマンドライン例をコピー&ペーストで実行しないでください。git や repo は理解した上で使用してください)

ローカルツリーのプロジェクト切替

ツリーは manifest にあるように、多数のモジュールを各地サーバから特定ブランチorタグを指定して取得し、repo コマンドでモジュールを管理しています。それぞれのモジュールは指定された状態のまま置かれているので、何か変更を加えた後に ‘repo sync’ で最新版を取り込むと変更が消されてしまいます。

それを避けるために repo でローカルプロジェクトを開始します。全てのモジュールにブランチを切り、sync 時には manifest で指定されたブランチorタグに対して git rebase する形で追従してくれます。以下ではプロジェクト名を myenvビルドディレクトリを ~/B2G とした例です。

$ cd ~/B2G
$ git checkout -b myenv origin/default
$ ./repo start myenv --all

L10n パッケージの追加

日本語化を行うためのパッケージは gaia, gecko に対する追加ファイルとして提供されていて、mercurial によって管理されているため mercurial のインストールが必要です。

mercurial のコマンド(hg)を使ってそれぞれのパッケージをツリーに取り込み、ローカルツリーのプロジェクトに登録しておきます。

$ cd ~/B2G/gaia/locales
$ hg clone http://hg.mozilla.org/gaia-l10n/ja
$ git add ja
$ git commit -m "add gaia-l10n/ja"

$ cd ~/B2G/gecko
$ hg clone http://hg.mozilla.org/l10n-central/ja l10n-central/ja
$ git add l10n-central/ja
$ git commit -m "add l10n-central/ja"

$ cd ~/B2G/build
$ hg clone http://hg.mozilla.org/build/compare-locales
$ git add compare-locales
$ git commit -m "add compare-locales"

これらを有効にするために ~/B2G/.userconfig を作成し、ビルド時に設定する環境変数を記載しておきます。

export LOCALE_BASEDIR=$PWD/gaia/locales
export LOCALES_FILE=$PWD/gaia/locales/languages_all.json
export GAIA_DEFAULT_LOCALE=ja

export L10NBASEDIR=$PWD/gecko/l10n-central
export MOZ_CHROME_MULTILOCALE="ja"

export PATH="$PATH:$PWD/build/compare-locales/scripts"
export PYTHONPATH="$PWD/build/compare-locales/lib"

 日本語キーボード及び辞書の登録

日本語IME に必要な辞書を入手します。辞書は Sourceforge.net にて ipadic または naist-dic が入手可能です。これらのパッケージの *.dic ファイルを gaia 内に取り込みます。

$ mkdir ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict/src
$ tar zxvf ipadic-x.x.x.tar.gz
$ cp ipadic-x.x.x/*.dic ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict/src/

*. dic ファイルはそのままでは使えないため、IME で使える形に変換します。dict ディレクトリで make を実行します。

$ cd ~/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ make

エラーになる場合は Makefile の find コマンドがどのディレクトリを参照しているかを確認してください。src になっていない場合は、ディレクトリ名を変更してください。

make に成功すると dict.json, dict/dict, dict/dict.utf8, dict/jcconv.pyc が作成または更新されます。一旦この状態でツリーに登録しておきます。

$ cd ~/B2G/gaia/apps/keyboard/js/imes/jskanji
$ git add dict dict.json
$ git commit -m "add ipadic"

この辞書と日本語IMEを有効にするため、 ~/B2G/.userconfig に以下を追加します。

export GAIA_KEYBOARD_LAYOUTS=en,jp-kanji"

あとは build.sh を実行するだけです。一度ビルド済みのツリーの場合は念のため out 及び objdir-gecko ディレクトリを削除しておいてください。

ツリーの更新

新たに upstream から ./repo sync で更新を取得した場合、取得後に上記の変更を加えて更新されます。ただし、upstream で上記に当たるファイルが更新された場合は conflict しますので、それぞれのモジュールで confilict を除去する必要があります。

.userconfig もツリーに登録しておくことができます。しかしながら .userconfig は .gitignore により登録対象外に指定されていますので、-f オプションで強制登録するか、別途保存することになります。

Flame のビルド

flame を v1.3 のままにしていたものの、せっかく最新版が投入できる端末なので、ようやく時間ができたこともありビルドからやってみました。
flame goes to v2.2-master

ビルド

最新ツリーでは flame の config (./config.sh./.repo/manifests/flame.xml) が用意されているので、素直にビルドするだけで完了します。

$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G
$ ./config.sh flame
$ ./build.sh

デフォルトの flame では JellyBeans ベースですが、config.sh の引数に flame-kk を指定することで KitKat ベースでもビルドできます。ちなみに flame の場合は Linux kernel もビルドしています。

最初のビルドでは flame 端末のバックアップを行うため、予め実機を adb で繋いでおく必要があります。adb での接続は後述します。実際のバックアップは device/t2m/flame/extract-files.sh で行っています。

実機の接続

自環境では Windows から VMWare Player で Ubuntu を起動しているため、Windows で接続を行った後に Ubuntu に再接続するようにしています。

Windows の場合、実機を接続すると ドライバのインストールが要求されますが、Windows Update では完了できないため Flame用のドライバを導入する必要があります。Flame 用のドライバは MDN の Flame ページ から辿れます。成功すると以下のデバイスが登録されます。

  • USB Composite Device 9025
  • ALCATEL HS-USB Android Modem 9025 #2
  • ALCATEL HS-USB Diagnostics 9025(COMxx)
  • ALCATEL HS-USB NMEA 9025 (COMxx)
  • YunOS ACB Interface
  • ALCATEL HS-USB WWAN Adapter 9025 #2
  • USB 大容量記憶装置
  • Linux File-CD Gadget USB Device
  • Linux File-CD Gadget USB Device

Ubuntu(udev を使う Linux) の場合、udev に flame のデバイスIDを登録しておきます。/etc/udev/rule.d/50-firefoxos.rules を以下のように作成します(android.rules があればそこに追記でも可)。

SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

1つ目は Qualcomm として、2つ目は Google(Android Device) として認識した場合のルールです。
基本的に1つ目だけでよいはずですが、端末状態によっては 2つ目で認識することもあったので記載しておきます。

lsusb などで USB として認識していれば、adb で接続できていることを確認します。

$ lsusb
  :
Bus xxx Device xxx: ID 05c6:9025 Qualcomm, Inc. 
  :
$ adb devices
list of devices attached
12345678        device

permission のエラーなどで繋がらない場合は、一旦端末を外して以下を実行した後に接続を試みます。

$ sudo adb kill-server
$ sudo adb start-server

実機への書き込み

ビルドと接続が終わっていれば、書き込みスクリプトを実行するだけです。実行中はフラッシュメモリの各パーティションの消去と書き込み経過が逐次表示されます。

$ ./flash.sh

Flame 到着!

ようやくOSSストア経由で発売された Firefox OS リファレンス機「Flame」ですが、申込み当日いきなり注文が殺到して40分で売り切れたそうです。

人気によるものというよりFirefox OS クラスタの人たちが動く機体をひたすら待ってたわけで、ビルドROM入れ換えで既存端末をFirefox OS bootable にした人や並行輸入で入手した人を除けば、普通に通販で手に入る最初の端末なわけで、この状態もまぁ想定できたことでしょう。

入手に成功!

で、私はそのスタートダッシュに間に合わなかったものの、30分後になんとかボタンを押して注文確保しました。10分遅れてたら終了していたわけですが。

注文して3~4日ほどで到着したもの不在で受け取れず、1週間後に受け取りました。

10351759_821561041211259_8616082811080461454_n 10592802_821561074544589_6604504814846193373_n

ある種「ちゃんと携帯電話として動いてる」端末は初めて手にするのでいろいろ興味深いところですが、SIMがないので電話機能は使えず今はまだ Wi-Fi のみです。

今まで Android Stick では飾りだった FM Radio、Volume Up/Down、Camera、Sim Manager などがちゃんと動きますし、Network も mDNS が正しく動いて Web のレスポンスも実用範囲内です。搭載されている SoC が Snapdragon 200 とのことで、リファレンスとしてこのくらいのクラスでもちゃんと動きますよということを示しているのかもしれません。

技適マーク問題

到着するや否や、技適マークがおかしいという不穏な噂が流れました。で、電池を取り出して見てみると確かに規定には存在しない「J」のマークが。日本では「〒稲妻マーク」に続いて技術基準適合証明「R」(電波法による適合)と技術基準適合認定「T」(電気通信事業法による適合)が正しい端末には表示されているはずなので、これがないとなると使用時点でそれぞれの法律に違反することになります。これは大変。

端末個体の話ではなくて全てがこのマークらしいということで、しばらくして「回収」のお知らせが出回り、早速着払いで発送することに。それから5日後に正しい端末として受け取りました。

最近では iPhone のように電子的に表示することで、何か瑕疵が見つかれば Update で対応するのが一般的になってきましたが、まさかの物理シールだったためにこのような対応にならざるを得なかったようです。これは買った方も売った方も不幸としか言いようがないわけですが、法律に関わるところはもうちょっと注意できなかったもんですかね…

mbed を動かしてみる

高性能SoCばかり追っていて最近のマイコン事情をほとんど知らなかったのですが,たまたま流れてきた “mbed” なるものを試してみました.

mbed とは?

mbed は「プロトタイプ開発向けのワンボードマイコンと開発環境」で最近流行のフィジカルコンピューティングを可能とするものなので,元々 NXP 独自のリリースだったものが OpenHard/Software になって各社でリリースされるようになりました.

で、いわゆるマイコンボードと何が違うのかと言うと「オンラインビルドができる」というのです.ところでオンラインビルドってなんだろう…

手元に入手したのは「STmicro Nucleo F401RE」と「NXP LPCXpresso LPC11U68」です.それぞれ展示会でアンケートによるサンプル配布されたものが放置されていたので貸していただきました.どちらもブリスターパックに入ってるのはなかなかインパクトがあります.

IMG_6343

双方とも Arduino Shield 互換のコネクタを持っているため,Arduino 互換周辺ボードを活用することが出来ます.これらが簡単に活用できるといろいろ面白そうです.

PCに接続

mbed 環境を使うにはどちらのボードも変わらないので F401RE を例に導入してみます.

PCへの接続は USB 経由で,F401RE は mini-B でボードに接続します.Windows にてドライバを要求されるので,STMのサポートページからアーカイブをダウンロードして導入し,成功すれば次のドライバがインストールされます.

  • ディスクドライブ > MBED microcontroller USB Device
  • ポート(COMとLPT) > STMicroelectronics STLink Virtual COM Port (COMxx)
  • Universal Serial Bus devices > STMicroelectronics STLink dongle

USB 一つでデバッガ・マスストレージ・シリアルの3つが接続されたことになります.ICE や JTAG を接続してる環境を見てるとこんなのでいいのかと思うほどシンプルです.

mbedサイトに登録、そして開発

上記に成功するとドライブが追加されていて,中にある mbed.htm をブラウザで開くと mbed.org のサイトに行きます.ここでサインアップしてユーザを作成することで,mbed.org 上にある開発環境が web ブラウザ上で使えるようになります.

サンプルを使った大まかな流れとしては,まずサンプルプログラムを開発環境(mbed compiler) に取り込みます.

  1. プロフィールのページ右下の「ST Nucleo F401RE」をclick
  2. 製品ページの右下の「example programs」の導入したいプログラムをclick
  3. 「Import the program」をclick

新たにプログラムを一から開発する場合は,Workspace を作る必要があります.

  1. 右上の「Compiler」をclick (mbed compiler のページへ)
  2. 「New」で新たにWorkspaceを作成,templete を使うか Empty Program で空を作成
    (空の場合は mbed パッケージを import する必要あり)

Workspace の準備ができたらソースを登録,コンパイルして実機に投入します.

  1. ソースを作成・編集して保存 (起動関数は引数なしの main() )
  2. Compile
  3. 出来たバイナリファイル(firmwareイメージ)を追加されたドライブにコピー
  4. USB が一瞬切断されて,firmwareイメージが自動的にflash に書かれて実行

ローカルPCで実施しているのはブラウザの操作とイメージのコピーだけです.チュートリアルを紹介するサイトがいろいろありますので,検索して流れを追ってみるとよいでしょう.まずはLED点滅,次にシリアル表示がお約束ですが,どちらも mbed.org にはサンプルが登録されているのでそのまま Workspace に import して試すことができます.

mbed-f401re

ちなみにコードは以下のような感じで、LED を1秒おきに点滅する例です.

#include "mbed.h"
DigitalOut myled(LED2);
int main()
{
    while(1) {
        myled = 1;
        wait(1.0);
        myled = 0;
        wait(1.0);
    }
}

sample を使えばここまで10分かそこらで “Hello, World” に相当する LED 点滅に到達できると言うのはかなり衝撃でした.昔ならまず最初にIDEやtoolchainのインストール,そしてボード接続と転送でつまずきますから…

IMG_6344

 開発環境だけじゃない?

mbed.org に登録すると開発環境が得られるだけでなく, Repogitory を作成して管理・公開したり,コミュニティとのQ&Aに参加したり,必要な周辺機器を衝動買い(!)することができます.フィジカルコンピューティングという キーワードによってどんどん組込みマイコン開発環境の障壁が取り除かれて参加人口が増えつつあり,この取り組みは非常にすばらしいことだと思います.

とはいえ,これだけ上位操作で簡単に制御できるとなるとこの下回り作ってる人たちは結構苦労してるんだろうなぁ…

FirefoxOS v2.0 を試してみる

ビルドしてみる

先日,正式に v2.0 branch が切られ、master は v2.1-pre に移行しました.ということで早速試してみようとビルドしてみました.

しかし…build/ の v2.0 branch に build/target/product/mini.mk が消えていてビルドが出来ないというエラー.master にはちゃんとあるので,v2.0 のビルドはちゃんと成功してるのでしょうか.ひとまず master(v2.1-pre) で試してみることにします.

と,嘆いてたら b2g-manifest で

<b4b3f48> 2014-06-11 [Aki Sasaki]  (origin/v2.0) bug 1023966 - revert platform_build branch switch for non-master branches. r=bustage

あっさり直ってました.

起動してみたら…

Firefox OS Simulator も 2.0 が使えるようになっているようですが,見た目的に何も変化がないようなので,master を build して mk808b に投入してみました.

起動時にいろいろエラーが出てまた何かデバイス向けの対応しないといけないような感じですが,暫く待ってたら何とか起動しました.ところがその画面が

v2.1-pre 試行

アイコンがでかい!

いやなんかおかしい.新バージョンの改良で解像度に関わらず3列固定で横幅最大で表示するようになっているようです.これは大画面向けに修正されるまで待つしかないですかね.

実機を見てないのでよく分かりませんが,Flame のデモを見てると home-screen にも pan/zoom などの two-finger action が追加されているらしいです.タッチパネルがなくマウス操作しかない環境ではこのままでは恩恵が受けられないので,別アクションでサポートされるのを待ちましょう.(マウス対応のような patch 方法が見つかればいいんですが)