LS-GL同様、SL-C3000もFedora10化しました。
Angstromのkexecboot kernelをflash(ROM?)にインストールするとまるでこれがbootloaderのように働き別のパーティションに存在するkernelを立ち上げられるので、これを利用してSDカードにFC10のrootfs、kernelを入れてちょいちょいっと環境を整えて完成です(kernelは2.6.27.23をspitz用にビルドしました)。FC10はまったくのCUI環境なのでちょっと寂しいなということでGUIでも動かしてみようと思い立ったのが間違いでした・・・(汗 いつかまた続きをやる時の為に忘れないうちにメモ。
ここから1.3.1のソースを頂いてきてビルドします。libjpeg、libpng、等のdevelパッケージは予めyumで入れておきます。
$ ./configure --prefix=/usr/local/opt
$ make
$ DESTDIR=/path/to/install make install
で適当に入れてみました。armasm_memcpy.hが無いと怒られましたが、ここのパッチのを抜いてきて入れときました。どうして入ってないのか?または落としたtarボールが壊れていたのか?謎ですが、とにかく先に進みたいので深く追求しないことにw。exampleも同様にソースを頂いてきてビルドし動かしてみます。しかし、描画はされるが設定が悪かったのかキーボードやTouchScreenの入力を受け付けません、、、orz よくわからないので後回し。
近頃のQtはDirectFB対応ということだそうで、試しに入れてみることに。ここからGPL/Free版組み込み向け(Embedded)のQt 4.5.1のソースを頂いてきます。
母艦ではFedora ARMから提供されているcross compilerを使いますが、必要なライブラリを適宜追加します。このcross compilerは/usr/armv5tel-redhat-linux-gnueabi/sys-root/(以降<sys-root>と表記)がsysrootになっていて、arm環境のrootfsのようになっているのでFedora ARM用のネイティブなRPMをここに入れるようにします。Fedora ARMのftpより必要なライブラリやdevelのパッケージをダウンしてrpmを使って入れます:
$ rpm -ivh --root=/usr/armv5tel-redhat-linux-gnueabi/sys-root/ --nodeps --noscripts <rpm-package-file>
<sys-root>のRPMリポジトリに入るので母艦のネイティブRPMには影響ないはず。それと先のDirectFBのlibやincludeも<sys-root>/usr/includeと<sys-root>/usr/libに入れておきます。
mkspecs/qws/linux-arm-g++/qmake.confを編集して母艦用の設定を行います:
# modifications to g++.conf
QMAKE_CC = /usr/bin/armv5tel-redhat-linux-gnueabi-gcc
QMAKE_CXX = /usr/bin/armv5tel-redhat-linux-gnueabi-g++
QMAKE_LINK = /usr/bin/armv5tel-redhat-linux-gnueabi-g++
QMAKE_LINK_SHLIB = /usr/bin/armv5tel-redhat-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = /usr/bin/armv5tel-redhat-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /usr/bin/armv5tel-redhat-linux-gnueabi-objcopy
QMAKE_STRIP = /usr/bin/armv5tel-redhat-linux-gnueabi-strip
QT_CFLAGS_DIRECTFB = -I/usr/armv5tel-redhat-linux-gnueabi/sys-root/usr/include/directfb
QT_LIBS_DIRECTFB = -ldirect -ldirectfb
configureしてmakeします。今回は実験的な意味合いもあるのでopensslなど面倒そうなのは除外しました:
$ ./configure \
--prefix=/usr/local/opt \
-xplatform qws/linux-arm-g++ \
-v \
-no-stl -no-nis -no-cups -no-dbus \
-no-openssl \
-opensource \
-no-qt3support \
-depths 16 \
-no-mmx -no-3dnow -no-sse -no-sse2 \
-embedded arm -xplatform qws/linux-arm-g++ \
-armfpa -little-endian \
-plugin-kbd-linuxis \
-plugin-mouse-linuxis \
-plugin-gfx-directfb
$ make
$ INSTALL_ROOT=/path/to/install make install
libmngが認識されなかったりいろいろありますが、細かいところはまた後に見直すということで、、、w
$ export QWS_KEYBOARD="linuxis:/dev/input/event0"
$ export QWS_MOUSE_PROTO="linuxis:/dev/input/event1"
$ /usr/local/opt/demos/embedded/fluidlauncher/fluidlauncher -qws
おや? /etc/pointercalがないと言って怒られる。TouchScreenのキャリブレーションを先にやらないといけないようです。
TouchScreen用のライブラリがあるそうなので、これをビルドすることに。サイトに書いてある通りに作業してビルドする。ビルドにはautoconf、automake、libtoolが必要なので予めyumで入れておく。Zaurusでは母艦とnfsで作業ディレクトリを共有しているのでcvsでのソースの取得は母艦側で行いました:
$ export CVSROOT=:pserver:anoncvs@cvs.handhelds.org:/cvs
$ cvs login
$ ここでパスワードの入力
$ cvs co -d tslib apps/tslib
$ cvs logout
これでtslibというディレクトリ配下にソースがチェックアウトされました。後はZaurus側でネイティブビルドします:
$ cd tslib
$ ./autogen.sh
$ echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.site
$ ./configure --prefix=/usr/local/opt --host=arm-linux --target=arm-linux CONFIG_SITE=arm-linux.site
$ make
$ DESTDIR=/path/to/install make install
なんかautoconf/automakeで細々と怒られましたが、まぁ、いっかとw /usr/local/opt/etc/ts.confを編集して先頭に一行追加します:
module_raw input
てっきりcorgiを指定するものだと思っていたら動きませんでした。inputにしたら動いたので、こっちが正解なんだろうか?
tslibに入っているキャリブレーションプログラムを実行します:
$ export TSLIB_TSEVENTTYPE=input
$ export TSLIB_CONSOLEDEVICE=none
$ export TSLIB_FBDEVICE=/dev/fb0
$ export TSLIB_TSDEVICE=/dev/input/event1
$ export TSLIB_CALIBFILE=/usr/local/opt/etc/pointercal
$ export TSLIB_CONFFILE=/usr/local/opt/etc/ts.conf
$ export TSLIB_PLUGINDIR=/usr/local/opt/lib/ts
$ export PATH=/usr/local/opt/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/opt/lib
$ /usr/local/opt/bin/ts_calibrate
画面に+マークが表示されているのでポイントしていくと/usr/local/opt/etcにpointercalファイルが出来上がっていました。これを/etcにリンクしておきます。他にもts_testというプログラムでタッチした軌跡が線で書かれたりするテストプログラムなども動かしました。
無事に/etc/pointercalファイルが出来たのでQtのデモを動かしてみると画面が表示されました。が、クリックに反応しない、、、、確かにカーソルはちゃんと動くのだけどもボタンが押せません(号泣。Qtはtslibにも対応しているので、そっちでビルドした方がいいんでしょうか?ここで力果てました・・・
前回、ポインティングデバイスとしてLinux Input Subsystemを指定してクリックが認識されなかったので、tslibで再度挑戦してみることに。tslibは前回ビルドしているので、Qtのconfigureにtslibを追加するだけ(勿論、母艦でクロスコンパイルするので先の<sys-root>にtslibをコピーしておきます)。具体手的には下記の一行を前のconfiguに追加するのみ:
$ ./configure \
--prefix=/usr/local/opt \
-xplatform qws/linux-arm-g++ \
-v \
-no-stl -no-nis -no-cups -no-dbus \
-no-openssl \
-opensource \
-no-qt3support \
-depths 16 \
-no-mmx -no-3dnow -no-sse -no-sse2 \
-embedded arm -xplatform qws/linux-arm-g++ \
-armfpa -little-endian \
-plugin-kbd-linuxis \
-plugin-mouse-linuxis \
-plugin-mouse-tslib \ ←これを追加
-plugin-gfx-directfb
$ make
$ INSTALL_ROOT=/path/to/install make install
実行には既述のTSLIB_*環境変数と、Qtの環境変数をtslibを使うように若干変更
$ export QWS_MOUSE_PROTO="tslib"
しておきます。さて、早速デモを動かしてみますが、tslib単体では動いているのにQtからloadするとtslibのモジュールが読み込めません、、、
どうもQt→tslib.so→tslibのmoduleという順で動的に読み込まれるのでしょうが、moduleからtslib.soのシンボルが参照出来てない模様。dlopenを使っているのでQtがtslib.soを読み込む際にRTLD_LOCALでもしちゃってるんだろうか?とソースを見るとRTLD_LOCALという箇所が確かにplugin関係のクラス中にあったのでコメントアウトしてビルドするも状況が変わらず、、、、もう面倒臭いのでmoduleが参照している小さな関数をmodule側に突っ込むという改造を施すことに(とにかく早く動くとこが見たいんですw)。Qtのサイトではmodule_rawのinput以外にlinear moduleだけあればいいような事が書いてあったので改造はこのlinearだけ。
ようやく動きました。しっかりクリックにも反応してくれます。
相変わらずキーボードの入力が効きません、、、、いつか解決出来ればなとw
なかなか思うようにいきませんなぁ、、、