読者です 読者をやめる 読者になる 読者になる

Tizen 移植(porting) 入門 〜Tizen on pandaboard ES〜 part2

Linux Tizen

まえがき

Tizen 移植(porting) 入門 〜Tizen on pandaboard ES〜 part1 - N9/Tizenったりの続き。

頂きものを動かして満足しても仕方がないので、GPUドライバをIMGのものに差し替えてWebGLのハードウェアアクセラレーションに対応させてみます。尚、このBLOGを書きながら試行錯誤しているので、書き終えた頃に動いている保証は全くありません。

Tizenのグラフィックシステム移植に関してはPorting GuideのP48辺りから解説があります。厳密には、このPorting Guideは2.0Alpha向けで、今のPandaBoardは1.0で動いているので、2.0aでpixmap/EGLImageが必須だったりと、若干の差はあります。(1.0はwidow surfaceに対応していれば取り敢えず動きはするみたい)


手元のPandaは、OpenGL ESのエミュレーションライブラリとemulfbという仮想フレームバッファドライバの庇護のもとでソフトウェアレンダリングを実施しています。ブラウザを立ち上げた際のコンソール上のログを見れば一目瞭然なのですが、手動でブラウザを立ち上げるとGL engineの生成に失敗しています。

-sh-4.1# /opt/apps/org.tizen.browser/bin/browser                                
CRI<2459>:elementary elm_win.c:1869 elm_win_add() OpenGL engine creation failed.
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:evas_main evas_clip.c:184 evas_object_clip_set() For now a clip on otd
ERR<2459>:edje edje_util.c:2966 edje_object_size_min_restricted_calc() file /op.

準備するもの

思いつく限り必要なものは下記の通りです。

  1. kernel modeドライバ
  2. user modeライブラリ(EGL, GLESv2, WindowSystemの部分)
  3. X11とbindするためのドライバ(emulfbを代替するもの)

使えるのかどうかはわかりませんが、Linaroのgitにひと通り揃っているようです。

  • kernel mode ドライバ → here
  • user mode ライブラリ → here
    • X11とbindするためのドライバはuser modeライブラリに含まれているようです

kernel modeドライバのbuild

ソースコードをcloneしてきます。

moguris@crowne:~/work/panda/wanwan/sgx$ git clone git://git.linaro.org/people/rsalveti/pvr-omap4-kernel.git
Cloning into 'pvr-omap4-kernel'...
remote: Counting objects: 566, done.
remote: Compressing objects: 100% (365/365), done.
remote: Total 566 (delta 255), reused 355 (delta 152)
Receiving objects: 100% (566/566), 619.24 KiB | 264 KiB/s, done.
Resolving deltas: 100% (255/255), done.

ドライバはarmバイナリにクロスビルドする必要があるのでgbsでchrootします。その前にgbs chroot環境にkernelドライバをコピーしておきます。

moguris@crowne:~$ cp -R pvr-omap4-kernel ~/GBS-ROOT/local/scratch.armv7l.0/home/abuild/

コピーが終わったら、毎度おなじみgbsコマンドでクロスビルド用の環境に移動します。

moguris@crowne:~$ gbs chroot -r ~/GBS-ROOT/local/scratch.armv7l.0/
info: chroot /home/moguris/GBS-ROOT/local/scratch.armv7l.0
(tizen-build-env)@crowne /]#

私と同じパスでコピーされていた場合には、下記のようになっているはずです。

(tizen-build-env)@crowne pvr-omap4-kernel]# pwd
/home/abuild/pvr-omap4-kernel
(tizen-build-env)@crowne pvr-omap4-kernel]# ls -alh
total 24K
drwxr-xr-x 5 system system 4.0K 2012-11-26 15:38 .
drwxr-xr-x 7 system system 4.0K 2012-11-26 15:38 ..
drwxrwxr-x 8 system system 4.0K 2012-11-26 15:38 .git
-rw-rw-r-- 1 system system  351 2012-11-26 15:38 .gitignore
drwxrwxr-x 3 system system 4.0K 2012-11-26 15:38 debian
drwxrwxr-x 6 system system 4.0K 2012-11-26 15:38 sgx

sgxディレクトリに移動して、eurasiacon→build→linux2→omap4430_linuxの順に移動します。*1環境変数をいくつかexportする必要があるのですが、流石に忘れ去ったのでまずmakeしてみる。

(tizen-build-env)@crowne omap4430_linux]# make
/bin/sh: which: command not found
../config/core.mk:290: CROSS_COMPILE is not set. Target components will be built with the host compiler
/bin/sh: which: command not found
/bin/sh: dos2unix: command not found
eurasiacon/build/linux2/kbuild/kbuild.mk:26: *** KERNELDIR must be set.  Stop.
make: *** [build] Error 2

qemu: Unsupported syscall: 369も大量に含まれましたが、取り敢えず無視しました。必要な環境変数

  • CROSS_COMPILE
  • KERNELDIR

取り敢えず2つ判りました。悲しいことにwhichが無いと怒られています。まずはこっちを解決します。

busybox arm版でwhichを代替

母艦側から、http://www.busybox.net/downloads/binaries/latest/にアクセスして、busybox-armv6lをダウンロードします。できたら、~/GBS-ROOT/local/scratch.armv7l.0/bin/辺りにbusyboxとしてコピーして下さい。

chroot側で、パミッションを設定してwhichできるか試します。

(tizen-build-env)@crowne omap4430_linux]# chmod 755 /bin/busybox
(tizen-build-env)@crowne omap4430_linux]# busybox which
BusyBox v1.20.0 (2012-08-22 21:36:24 CDT) multi-call binary.

Usage: which [COMMAND]...

Locate a COMMAND

(tizen-build-env)@crowne omap4430_linux]# busybox which gcc
/usr/bin/gcc

出来たので取り敢えずalias指定してごまかします(.bashrcに書くべきですが、どこにあるかわかりませんでした。。)

(tizen-build-env)@crowne ~]# alias which='busybox which'

・・・。


手で打つには上記でうまく行きましたが、makeすると環境変数が読まれませんでした。/bin/whichをviで作って

busybox which $1

というシェルスクリプトにごまかして、chmod 755で取り敢えずwhichしたつもりにはなったようです。

dos2unixはこちらからダウンロードして自分でコンパイルしました。

kernelのbuild

頂いた環境のkernelでそのまま動かせるハズですが、もろもろ必要なのでvanillaなソースを用意します。。Versionは3.3に合わせます。多分、多少合ってなくても大丈夫だったような気がするので、こちらから拝借してbuildしました。*2

(tizen-build-env)@crowne src]# mv config linux-3.3/.config
(tizen-build-env)@crowne linux-3.3]# make oldconfig
(tizen-build-env)@crowne linux-3.3]# ARCH=arm make

ブートアドレスを聞かれたのでなんとなく0x80008000とか適当に。取り敢えずbuildは進んでいる模様。

あとがきに代えて

ついでにSGXドライバをビルドしはじめたらエラーが続発したので、続きは後ほど・・・

参考情報

*1:知っている人にはおなじみのSGXドライバのよくわからないパス。。。

*2:オススメしません!