Linux」カテゴリーアーカイブ

Android Tablet Nexus 7 上に開発環境をつくる (Ubuntu)

Bitbucket などクラウド系のリポジトリサービスを使うと、
どこでもソースコードをチェックできるので非常に便利です。
電車の中や外出時だろうと、ちょっとした空き時間にブラウザだけで
コードを追うことができます。

そのうち欲が出てきて、どうせならこのままコードを手直ししたいとか
コンパイルもできたらいいのに、とか思うようになります。

最近のモバイルデバイスは非常に性能が高いので、
クロス開発でなく自分でコンパイルしてもそれなりに速いはずです。

Android 端末なら各種 Linux 環境を install できそうなので試してみました。

nexus7ubuntu1.jpg

Nexus 7 で動く Ubuntu 13.04

●開発環境として

gcc, clang はもちろん、python, git, mercurial などそのまま使えるので
ライブラリのコンパイルや arm CPU のテストには十分です。
RAM は 1GB しかありませんが、CPU も 4core なのでコンパイルも予想より
高速でした。

パフォーマンスも NetWalker の時代とは比べ物にならず、
Atom NetBook でコンパイルするよりも快適です。

実際にコンパイル速度を比べてみました。

               CPU         OS         HW thread Compiler     実行時間
---------------------------------------------------------------------
1. Nexus 7     (Cortex-A9) Ubuntu arm 13.04  4  clang 3.2    12.5 sec
2. Nexus 7     (Cortex-A9) Ubuntu arm 13.04  4  gcc 4.7.2    18.2 sec
3. Optimus Pad (Cortex-A9) Ubuntu arm 12.04  2  clang 3.0    21.2 sec
4. Optimus Pad (Cortex-A9) Ubuntu arm 12.04  2  gcc 4.6.3    29.2 sec
5. VAIO type P (Atom Z540) Ubuntu x86 12.10  2  clang 3.0    26.1 sec
6. VAIO type P (Atom Z540) Ubuntu x86 12.10  2  gcc 4.7.2    33.5 sec
7. VAIO type P (Atom Z540) Windows 7 x86     2  vs2012       87.8 sec
8. NetWalker   (Cortex-A8) Ubuntu arm 9.04   1  gcc 4.3.3    91.2 sec
9. Mac HDD(Core i7-3615QM) Windows 8 x64     8  vs2012        5.1 sec
10.Mac HDD(Core i7-3615QM) Win8 x64 + NDK    8  gcc 4.7       4.9 sec
11.Mac HDD(Core i7-3615QM) Win8 x64 + NaCl   8  gcc 4.4.3     4.1 sec
12.Mac HDD(Core i7-3615QM) Win8+VMP+u12.10   4  clang 3.0     1.6 sec
13.Mac HDD(Core i7-3615QM) Win8+VMP+u12.10   4  gcc 4.7.2     2.6 sec
14.Mac HDD(Core i7-3615QM) Win8+VMP+u +NaCl  4  gcc 4.4.3     3.0 sec
15.Mac SSD(Core i5-3210M)  OSX10.8 x64       4  clang 4.2     2.3 sec
16.Mac SSD(Core i5-3210M)  OSX10.8 x64 +NDK  4  gcc 4.7       6.4 sec
17.Mac SSD(Core i5-3210M)  OSX+Para+u12.10   2  clang 3.0     3.0 sec
18.Mac SSD(Core i5-3210M)  OSX+Para+u12.10   2  gcc 4.7.2     4.4 sec
19.Mac SSD(Core i5-3210M)  OSX+Para+u +NaCl  2  gcc 4.4.3     4.1 sec
20.Mac  (Core2 Duo P7350)  Ubuntu x64 12.10  2  clang 3.2     4.3 sec
21.Mac  (Core2 Duo P7350)  Ubuntu x64 12.10  2  gcc 4.7.2     6.8 sec
22.Mac  (Core2 Duo P7350)  Ubuntu x64 + NDK  2  gcc 4.7      10.0 sec

実行時間が少ない方が高速

・NDK= Android 向け build (NDK r8d)
・NaCl= Native Client 向け build (pepper_23)
・VMP=Windows の VMware Player 上で Ubuntu 12.10 x64 (4core)
・Para=MacOS X の Paralles8 上で Ubuntu 12.10 x64 (2core)

C++ の lib のコンパイルで Debug/Release 両方生成しています。

すべてコマンドラインからのビルドで HW thread の数だけ並列化しています。

CPU だけでなくストレージの速度なども大きく影響しているので一概には言えませんが、
このサイズで持ち歩けてこの速度でビルドできるなら満足です。
用途にもよりますが、すでに “動かしてみた” レベルではなくなっているといえます。

spec 詳細
  Nexus 7           Tegra3 Cortex-A9  x4      1.2GHz   RAM   1GB
  Optimus Pad L-06C Tegra2 Cortex-A9  x2      1.0GHz   RAM   1GB
  VAIO type P       Atom Z540         x1 HT2  1.83GHz  RAM   2GB
  NetWalker PC-Z1   i.MX515 Cortex-A8 x1      0.8GHz   RAM 0.5GB
  Mac HDD           Core i7-3615QM    x4 HT8  2.3GHz   RAM  16GB
  Mac Book SSD      Core i5-3210M     x2 HT4  2.5GHz   RAM   8GB
  Mac mini HDD      Core2 Duo P7350   x2      2.0GHz   RAM   8GB

● Nexus 7 で動く Linux 環境

LINUX ON ANDROID
AndroidLinux.com
Ubuntu Nexus 7 Desktop Installer

大きく分けて二通りあり、Android として boot したままソフトウエア環境を
置き換えるタイプと、Native に最初から Linux として boot するタイプです。

前者は Android が動作したまま、chroot したプロセスのみが
あたかも Desktop Linux であるかのように振舞います。
Android 環境と併存するため比較的抵抗が少ないですが、
母体となる Android の root 権限が必要となるため、
何らかの方法で取得しておかなければなりません。

冒頭のコンパイル速度比較にある Optimus Pad (L-06C) はこちらです。
Android 上から起動して ssh 経由でコマンドラインのみ使用しています。
Window System が Native なものではないので GUI は期待出来ませんが
コマンドラインベースなら十分使える印象でした。

後者は bootloader を unlock して完全に新たな OS で置き換えます。
PC の HDD を消してクリーンインストールするようなものです。

実際は OS を置き換えなくても、Android の起動イメージを残したまま
boot 時のセレクタで切り替えることができるらしいので試してみました。
↓下記ページを参考にさせて頂きました。

Nexus 7でUbuntuをUSBメモリにインストールしてデュアルブートで起動して使う方法。

USB メモリがなくても内蔵ストレージにも共存可能な形で install できました。

xda-developers: [WiFi&3G] MultiROM v7 – updated recovery (Feb 02)

bootloader を unlock したあとに Multi boot 可能な bootloader を入れて、
install 機能を持った recovery tool を用いて OS image を書き込みます。
もちろんこれらの作業はすべて自己責任で行うことになります。

●使ってみて

Window の描画や文字が一部欠けたりとまだ不安定なところがあります。
その代わり HW アクセラレートがきいておりそれなりに高速です。
VAIO type P (Z500系 Atom) に入れた Ubuntu 12.10 よりも快適です。

タッチ操作できるようにカスタマイズされておりスクリーンキーボードも使えます。
きちんと日本語キーボードの配列に切り替わりますが、なぜか ‘_’ の入力ができません。
縦画面にも回転できます。

ubuntu Using the Device

現時点 (2013/02/03) で Bluetooth がまだ使えないようです。
USB Host ケーブルを使えば USB 外付けの Mouse や Keyboard をつなげることができます。

Ubuntu の豊富なソフトウエアを利用できる点が魅力です。
試しに blender を install してみましたが、GLX が無く起動しませんでした。
gimp は動きました。

Chromium ブラウザをしばらく使っていると画面全体が壊れることがあります。
おそらくメモリ不足なので、swap を作った方が良いのかもしれません。

Tegra4 の Cortex-A15 や Qualcomm Krait 等、新しい世代の CPU では
I/O 含めてさらに高速に動作するはずです。
PC 無しに、Android アプリの自己開発ができるようになると面白いかもしれません。

続きます「Nexus 7 上に開発環境をつくる (2) Bluetooth と OpenGL ES 2.0」

NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (3)

わかる方、自力で何とか出来る方のみ参考にしてください。
すべて自己責任でお願いします。

(1) カーネルをコンパイルできる環境を作る。( 参考1, 参考2 )
(2) module を読み込めるようにカーネルを作る。
 (CONFIG_MODVERSIONS を無効化するなど> 例 Module versioning support を外す)
(3) 作成したカーネルを使って起動出来る環境を作る。
  ・SD カード上に作成
  ・本体フラッシュ (/dev/mtd3) を書き換え
  など

SD 上の debian で起動して insmod だけ確認した後、面倒なので /dev/mtd3 を
置き換えました。壊れても気にしない人のみ。それ以外はお勧めしません。
3Gモデム対応ツールを適用しており、かつ互換性あるカーネルを作っている前提です。
L2.6.28_4.5.1_SDK_Aug2009_source.tar.gz (こちら)を展開して install を実行。
以後メッセージに従う。
入力した展開先フォルダの中の ltib/pkgs の中からアーカイブを参照。

$ tar -zxvf amd-gpu-bin-mx51-4.5.1.tar.gz
$ cd amd-gpu-bin-mx51-4.5.1
$ sudo cp -r lib/module/2.6.28-419-g12a78a3/extra  /lib/modules/2.6.28-15-araneo/kernel/drivers/
$ sudo depmod

ファイルを手でコピー。ここでも気にしないでシステムを置き換えています。
分けるなら /usr/local 以下に配置。

$ sudo cp -r  usr/include/*  /usr/include/
$ sudo cp  usr/lib/*  /usr/lib/
$ sudo mkdir  /usr/local/bin
$ sudo cp  usr/bin/*  /usr/local/bin/
$ sudo /usr/local/bin/gpu-install install

最後の gpu-install でドライバを読み込んでいます。
「sudo /usr/local/bin/gpu-install install 」は再起動の度に必要。
添付のサンプルで動作確認。

$ sudo /usr/local/bin/tiger
$ sudo /usr/local/bin/es11ex

(実行結果の画面) フルスクリーンで起動するので VRAM を破壊します。実害はありません。
最初は ssh などネットワーク経由での実行をお勧めします。

サンプルが動けば動作はうまくいったように見えますが、ドキュメントやサンプル
ソースがあるわけでもないので、実際の使い方はまだまだ手探り状態です。

Display インターフェースは egl なので、初期化は以前 OpenGL ES 2.0 Emulator
を取り扱ったときのコードがほぼそのまま使えます。
AMD 版 GL ES 2.0 Emulator のターゲットがこの Z430 なので当たり前といえば
当たり前です。

OpenGL ES 2.0 Emulator

eglGetDisplay() は EGL_DEFAULT_DISPLAY を使用。

eglChooseConfig() では 4444, 565, 5551, 8888 が使えるようです。
depth は 0, 16, 24 (24+ stencil8) のどれかと組み合わせ。
カラーバッファが 16bit でも 24bit depth を使えます。
バックバッファのフォーマットなので、8888 を指定してもフロントバッファが
32bit になるわけではありません。

eglCreateWindowSurface() で描画と API をバインドしますが、この場合
EGLNativeWindowType に何を指定すればよいのか悩みました。
いろいろ試した結果、/dev/fb0 を渡したら動きました。

EGLNativeWindowType eglwin= open( "/dev/fb0", O_RDWR, 0 );
egl_Surface= eglCreateWindowSurface( egl_Display, egl_Config, eglwin, NULL );

描画のフラッシュと転送は普通に eglSwapBuffers() で動きます。

デバイスファイルにアクセスするため root で実行する必要があります。

フレームバッファは 16bit 1024×600 ですが、倍の容量存在しているのは 32bit
への切り替えを考慮してのことでしょうか。
この辺いろいろとステートを読み出したりしつつ調べている最中です。
例えば EGL_HORIZONTAL_RESOLUTION が 2048 になっている点など、まだ良く
わかっていない部分が多数あります。

描画の印象としてあまり速くありません。eglSwapInterval() に 1 しか設定
できないため、常にモニタのリフレッシュレートと同期している可能性があります。
ただ動作時間が半分ほどで終わってしまい、計算と一致していないのも謎です。
性能はまだ未知数。

取りあえず GLSL のシェーダーを読み込んで、テクスチャの描画まで成功。
シェーダーのコンパイルエラー発生時に、ドライバが詳細なエラーメッセージ(log)
を返してこないのも はまったところです。デバッグは Emulator で行った方が
良いかもしれません。

ヘッダ (GL ES 2.0 の場合)

#include  
#include  
#include  

ライブラリの指定など (Makefile)

CC      = gcc
LIBS    = -lm -lstdc++  -legl13 -lgles20
INCS	=
CFLAGS  = -O4 -Wall \
	-march=armv7-a  \
	-mtune=cortex-a8        \
	-mfloat-abi=softfp      \
	-mfpu=neon      \

TARGET  = main
OBJS    = main.o

$(TARGET): $(OBJS)
	$(CC) -o $(TARGET) $(OBJS) $(LIBS)

%.o:%.cpp
	$(CC) -c -o $@ $< $(CFLAGS) $(INCS)

ARM Cortex-A8 + OpenGL ES 2.0 は iPhone 3GS などハイエンドスマートフォントにも
搭載されています。
比べると NetWalker の良いところはクロス開発しなくてもいいところでしょう。
修正したり設定を変えてテストを繰り返していると、自分でコンパイルできるのは非常に
便利だと実感します。
micro SD 上で作業しているので、開発環境もこの小さい本体だけです。

関連エントリ
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (2)
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0
OpenGL ES 2.0 Emulator

NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (2)

NetWalker_OpenGLES01.jpg

NetWalker_OpenGLES02.jpg
いろいろ手間取ったけど、何とか動かすことに成功

追記:

Version: 1 3
EGL_CLIENT_APIS: OpenGL_ES OpenVG
EGL_EXTENSIONS: eglCreatePbufferFromClientBuffer EGL_KHR_image EGL_AMD_create_image
EGL_VENDOR: Advanced Micro Devices, Inc
EGL_VERSION: 1.3 Internal version 1.4.1

GL_VERSION: OpenGL ES 2.0
GL_RENDERER: AMD Z430
GL_VENDOR: Advanced Micro Devices, Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

関連エントリ
NetWalker PC-Z1 i.MX515 OpenGL ES 2.0

NetWalker PC-Z1 ubuntu で ctrla を動かす ([A] キーで Control と両立)

久しぶりに NetWalker の情報を探したら、モジュールを作れるようになっているし
キーカスタマイズソフト「窓使いの憂鬱」も動くようになっているとのことです。
かなり便利になってきました。ありがたいことです。

Android Zaurusの日記
 ・NetWalkerのカーネルとローダブルモジュールのビルド

ひとりぶろぐ
 ・[NetWalker]窓使いの憂鬱をNetWalkerで動かす

しかも「窓使いの憂鬱」では [A]キー を Control にする設定まで出来るようです。
これで ctrla を作らなくて済むし、楽が出来る!!
と思って試したら ctrla の動作とはちょっと違いました。少々甘かったようです。

そこで上のページを参考にして uinput.ko を作り、ctrla を NetWalker 本体の Ubuntu
で動くようにしてみました。
Android Zaurusの日記 さん、ひとりぶろぐ さんの記事を参考にさせていただきました。
ありがとうございました。

以下
 ・ctrla の動作の違い
 ・新しい ctrla v1.10
 ・ctrla を NetWalker の Ubuntu で動かすまで

ctrla は、[A] キーを Control キー兼用として用いるためのソフトです。

● ctrla の動作の違い

「窓使いの憂鬱」の “mod control += !!A” の設定では、[A]キー を押している間に
他のキーが押されたタイミングで Control キーと見なしています。

これだけだと、素早く文字入力を行った場合に意図しない Control キーが挿入されて
しまうことがあります。

例えば「会議」と打とうとして “kai” と素早くタイプすると、[A] を離す前に [I]
が押されて Control-I が入ってしまうことになります。

ctrla では連続タイプについていろいろ検証しており、この状態を区別できるように
二つのクロスストローク判定を導入しています。

もしかしたら「窓使いの憂鬱」でも設定次第で実現出来るのかもしれません。
そのような機能がすでにありましたらごめんなさい。

●クロスストローク判定1、遅延判定

“kai” を素早く打つと、下記のように前のキーを離す前に次のキーを押してしまう
ことがあります。

→時間
                 (1)  (2)
---------------------------------------
[K]dw ------ [K]up
         [A]dw ------ [A]up
                 [I]dw ------ [I]up

「窓使いの憂鬱」+ “mod control += !!A” はおそらく (1) のタイミングで判定
しています。これだと Control-I が入ってしまいます。

ctrla では、[A] キーを先に離すと ‘A’ キーを、[I] を先に離すと Control-I が
入るように判定を遅らせています。
つまり上の例だと (2) のタイミングで ‘A’ キーを送信します。

下記の例では先に [I] を離しているので (3) のタイミングで Control-I になります。

                   (3)
---------------------------------------
 [A]dw ------------------- [A]up
         [I]dw --- [I]up

●クロスストローク判定2、id による識別

実際に使ってみると、上の「遅延判定」だけでは不十分なことがわかります。
例えば「朝」と高速にタイプしようとすると下記のキーストローク “asa” になります。

→時間
         (4)          (5)
---------------------------------------
[A]dw ------ [A]up
         [S]dw ------ [S]up
                 [A]dw ------ [A]up
---------------------------------------
ID1→            ID2→

[S] を押したタイミング (4) でも、[S] を離したタイミング (5) でも、どちらも
[A] キーが押されているため、単純な遅延判定だと (5) で Control-S が入ってしまいます。

そこで ctrla では、[A] キーを押す度に毎回異なる id 値を割り振るようにしています。
キーを押した時点の id と離した時の id 値が異なる場合は、別の [A] キーとみなして
Control に変換しません。

よって上の例の場合、(5) のタイミングで id が異なるのでそのまま ‘S’ キーを送信します。

●新しい ctrla v1.10

プログラム ctrla110.tgz

下記の修正を行いました。

 1. NetWalker の Ubuntu (uinput.ko) で動作しない問題を修正
 2. 連続して 1秒以上 [A] キーだけ押し続けた場合、Control とみなす

1. は hook_main.c で構造体がクリアされていないところがあったために、module
として組み込んだ場合に誤動作していました。カーネルに組み込んだ場合はメモリが
0 初期化されているらしく動いていました。(/dev/input/event* で動くのもそのせい)

テキストエディタ上で考え事をしているとき、無意識に Ctrl キーを押しっぱなしに
していることがあります。カーソル移動とか編集操作を一切せずにキーを離すと
‘A’ キーが入ってしまうことがありました。
そこで [A] を 1秒以上押し続けた場合は Control と見なすようにしました。

● ctrla を NetWalker の Ubuntu で動かすまで

(1) 3Gモデム対応ツールを入れる

NetWalker(PC-Z1) 「3Gモデム対応ツール」

 この更新を行うと無線 LAN 接続でトラブルが起こる可能性が高いので、先に無線LAN
 を off にしておいてください。以前自分でカーネルを build したときに無線 LAN
 が動かなかった症状と良く似ています。

(2) uinput.ko を作る

NetWalkerのカーネルとローダブルモジュールのビルド」の手順をそのまま実行します。

Makefile の修正は「EXTRAVERSION = .10」の行を「EXTRAVERSION = -15-araneo」
に置き換えます。

1時間くらいしてコンパイルが通ったらモジュールを作ります。

$ sudo aptitude install libncurses5-dev
$ make menuconfig

メニューで下記の設定を変更します。
(space キーを押して User level driver support を ‘<M>’ にする )

Input device support --->
  Miscellaneous devices --->
     User level driver support
$ make modules
$ sudo cp  drivers/input/misc/uinput.ko  /lib/modules/2.6.28-15-araneo/kernel/drivers/input/
$ sudo insmod /lib/modules/2.6.28-15-araneo/kernel/drivers/input/uinput.ko

(3) ctrla v1.10 を動かす

$ mkdir $HOME/ctrla
$ cd $HOME/ctrla
$ wget http://dench.flatlib.jp/arfiles/ctrla110.tgz
$ tar -zxvf ctrla110.tgz
$ sleep 1; sudo ctrla/ctrla /dev/input/event5

まずはこの状態で、他のターミナルやソフトでキーの動作を確認してみてください。
万が一キー入力できなくなった場合も、慌てずに USB キーボードつないでください。
外付けキーボードの動作には影響を与えません。

関連エントリ
NetWalker PC-Z1 カーネルのコンパイル
NetWalker PC-Z1 Debian (2)
NetWalker PC-Z1 Debian
NetWalker PC-Z1 [A] キーを Control キーと兼用する実験
NetWalker PC-Z1 Bluetooth とキーカスタムその他