X を簡単に動かすには Kdrive X server と vncviwer + vncserver の二つの方法がある。 後者のほうが手軽だが、画面描画が多くなると紙芝居と化す。 でも Kdrive X server は結局は本物の XFree86 server に近い手間がかかるんよね。
両方とも動かしてみたが、 fbvnc + Xvnc (= vncviwer + vncserver) のほうが実用的かもしんない。キーボードが常に使えるという安心感はなにものにもかえがたく。 拡大縮小と回転が自由というのも大きい。
でもとりあえず Kdrive X server の話。 キャリブレーション周り未実装なんだけど、そろそろ書いとかんと忘れる ...。
SL5x00 用はそもそもタッチパネル構造体が違うので論外として、 iPAQ 用のを試すことになる。タッチパネルのデバイス名が iPAQ と A300 では違うが、 /dev/ts も見てるのでタッチパネル的には動く。
... が、ioctl(FBIOPUT_VSCREENINFO) がひっかかる。 A300 のこの ioctl は引き数の制限がきつく、Xipaq の呼び出しでエラーを返すためだ。 A300 のカーネルの返り値のほうが正しく、 truecolor で colormap をもたない framebuffer 相手に colormap 書き換え許可を求める Xipaq のほうが間違ってるんだが、サーバ書き換えるよりカーネル書き換えるほうがラクなので ためしにカーネル側の条件を緩めると動いた。
--- drivers/video/cotulla_fb.c~ Wed Aug 28 12:24:23 2002 +++ drivers/video/cotulla_fb.c Wed Feb 28 21:54:50 2003 @@ -197,3 +197,3 @@ if (var->nonstd != 0 ) goto ERR; - if (var->activate != FB_ACTIVATE_NOW ) goto ERR; + // if (var->activate != FB_ACTIVATE_NOW ) goto ERR; if (var->pixclock != 0 ) goto ERR;
ただ、これだけでは keycode がズタボロなので結局は build することになる。 本家 XFree86 から拾ってきて build しなおすんだが、 ... 4.3.0 に上がったばっかで今は cvs 重そうやねぇ。
すでにクロスコンパイラ一式はもってるわけで、異なるコンパイラセットをまたもつのは避けたい。 まず、"arm-linux-" を外したセットをつくる。外さないほうも要るのと、 万が一にもパスを通したくないので別にディレクトリを掘った。
# cd /usr/local/Embedix/tools # mkdir bin2 # cd bin # for name in * ; do pushd ../bin2 ln -sf ../bin/$name $name ln -sf ../bin/$name ${name##arm-linux-} popd done # cd ../bin2 # ln -sf ../bin/arm-linux-gcc cchandhelds.org 読みつつhost.def を xc/config/cf/ に置く。 Xipaq server でなく Xfbdev を作成しているが、 両者の違いは機能的には pcmcia のビデオドライバを含むかどうかである。 トラブルのネタにしかならんよーなものは外すにかぎる。
さらにパスが適切に通るよう cross.def を書き換える。こんな感じ。
% cd xc % make World CROSSCOMPILEDIR=/usr/local/Embedix/tools/bin2最初の一回は xc/ で make World するが、 次回からは xc/programs/Xserver/ で make all するのでいい ── というか、 make World すると rm **/*.o されてしまって ターンアラウンドタイムが冗談になんないので、かならず make all にする。
さて。手を入れることなしには動いてくれない:
とりあえずキャリブレーションを無視して作ったやつ:
上はそれぞれ Xfbdev -schedInterval 10 -schedMax 10 と Xfbdev -schedInterval 10 -schedMax 10 -screen 320x240@90 として動かしたもの。
# ./Xfbdev -screen 320x240@90
デフォルトは "-schedInterval 20 -schedMax 200" 相当である。 つまり、
vncviewer + Xvnc で xengine 動かしたときによく見られるマジックだが、 RandR extension は実体として vncviewer + Xvnc とほぼ同じ動作をするから、 更新ペースを落せば同じになるわけではある。
つーても、
# echo 1 > /proc/sys/pm/suspend程度で suspend してくれる。起きるほうは BIOS が面倒みてるのでパワースイッチでおっけ。
コードベースも 4.3.0 になっている。
Xfbdev を動かすには freetype 2.1.1+ の libfreetype.so も必要。やっぱこれでバス幅一杯か〜。