月別アーカイブ: 2014年12月

pcDuino

先日,東京遠征で秋月電子に寄った際に見つけた pcDuino v1 が 4000 円で売られてたので,思わず買ってしまいました.Cortex-A8 1GHz + DDR 1GB で Arduino 互換のピンが装備されていて NAND や SDCard から Lubuntu と Android ICS が boot できるとあって,ちょっと実験するには面白そうな感じです.

早速 Lチカ

すでに NAND に Bootable Lubuntu が入っているので,電源と HDMI と USB HID を繋げばすぐに動かせます.ということで Arduino はやったことがないけど適当にマニュアル漁ってれば動くだろうということで,LED を光らせてみました.

GPIO はドライバ組込み済みで,このドライバは sysfs に口を作ってくれているので,コマンドラインレベルで制御が可能です.下の例は,Vcc-LED-R-GPIO2 と接続して sysfs で制御したものです.1秒ごとに点滅します.

# echo 1 > /sys/devices/virtual/misc/gpio/mode/gpio2
# while : ; do
> echo 0 > /sys/devices/virtual/misc/gpio/pin/gpio2
> sleep 1
> echo 1 > /sys/devices/virtual/misc/gpio/pin/gpio2
> sleep 1
> done
#

B52WKFmCIAEpvGY

 

ついでに温度センサ

手元にある受動デバイスということで温度センサ(TMP35G)を動かしてみます.このデバイスは10℃~125℃の範囲を10mV/℃で出力します.これを12bit ADC の ADC2 ポートに接続して値を取ってみます.

# while : ; do
> expr `cat /proc/adc2 | cut -c':' -f2` \* 115000 / 4096 + 10000
> sleep 1
> done
#

誤差が大きいようですが,x1000にしてなんとか計測は出来てそうです.入力端子を直結しただけでは入力電圧が心配なので,もう少しちゃんと回路を組む必要があるかと思います.

 

B52huytCEAAem_7

もう少し凝ったことをするには Auduino Library API を使う必要がありますが,toolchain も標準装備なので,C でちょろっと組んでコマンドラインから何か動かすにはお手軽な環境ではないかと思います.

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