SDL on Zaurus 開発環境

Since: Dec. 14, 2002
Last updated: Jan. 6, 2011 (SDL_image-1.2.10, SDL_mixer-1.2.11, libpng-1.4.5 に更新)

開発環境の導入

Linux (Debian/sid)マシンに、ザウルス宝箱Proより、 下記のパッケージをダウンロードし、alienをかけてでインストール。

  • gcc-cross-sa1100-2.95.2-0.i386.rpm
  • linux-headers-arm-sa1100-2.4.6-3.i386.rpm
  • glibc-arm-2.2.2-0.i386.rpm
  • qtopia-free-1.5.0-1.i386.rpm
  • binutils-cross-arm-2.11.2-0.i386.rpm
dev-arm-qpe.sh:
setenv CROSSCOMPILE /opt/Embedix/tools
setenv QPEDIR /opt/Qtopia/sharp
setenv QTDIR /opt/Qtopia/sharp
setenv PATH /opt/Embedix/tools/arm-linux/bin:$QTDIR/bin:$QPEDIR/bin:$CROSSCOMPILE/bin:$QPEDIR/bin:$PATH
setenv TMAKEPATH /opt/Qtopia/tmake/lib/qws/linux-sharp-g++/
setenv LD_LIBRARY_PATH $QTDIR/lib:$LD_LIBRARY_PATH
setenv CC arm-linux-gcc
setenv CXX arm-linux-g++
echo "Altered environment for Sharp Zaurus SL-5000D Development ARM"

SDLの導入

SDL-1.2.5

SDL本家より、SDL-1.2.5.tar.gzをダウンロード。

20031201

20030830

20030816

T-nagi さんより、SL-A300 においてカーソルキーと画面上でのカーソルの動きが反対だという報告をいただきましたので、修正を施しました。パッチはSDL-1.2.5-k5.diffです。パッチが間違っていました。パッチはSDL-1.2.5-k6.diffです。阿川さんのパッチlibsdl_1.2.5-slzaurus20030704_arm.difflibsdl_1.2.5-slzaurus20031201_arm.diffをあてた SDL-1.2.5 に対してあてます。内容は以下の1点です。(2003.08.16)(2003.08.30 修正)(2003.12.1 阿川さんの新しいパッチに追従)

  • 機種が SL-A300 の場合に、sdlRotation = 3 を設定する。

20030704

阿川さんにお送りしたパッチSDL-1.2.5-k4.diffのうち、音切れ解消のためにバッファのサイズを増やす修正については、リアルタイム性の高いゲームでは遅延が非常に大きくなる(1秒程)とのことで、環境変数 SDL_DSP_NFRAGMENTS が設定されいた場合に、その数をバッファ数とするという形で阿川さんの方で修正していただきました。ONScripter 以外に SDL を使用していなかったのでそこまで遅延が大きいとは思っておりませんでしたが、確かにこの形の修正が良いと思います。

もう一点の修正はそのまま取り込んでいただいたので、この阿川さんのパッチlibsdl_1.2.5-slzaurus20030704_arm.diffをあてたものに差し換えたものを、新たにライブラリパッケージとして公開しました。libSDL については、阿川さんの公開されているものと等価のはずです。

20030629

以下は古い情報です。SDL-1.2.5 に関係する以下のパッチはあてる必要がありません。

SL-C750において、VGA,QVGAいずれにおいてもスタイラスの座標と画面の表示が180度ずれる・MP3演奏において音切れが生じるという報告をいただいたため、修正パッチSDL-1.2.5-k4.diffを書きました。阿川さんのパッチlibsdl_1.2.5-slzaurus20030623_arm.diffをあてた SDL-1.2.5 に対してあてます。内容は以下の2点です。

  • 機種が SL-C750, SL-C760 である場合に、VGA, QVGA で画面とスタイラス入力が 180 度ずれる問題を修正しました。(SDL_sysvideo.cc)
  • SL-C750 でも音切れが生じるということなので、SL-A300 でのみ有効になっていた音切れ解消のためのバッファのサイズを増やす修正を、全ての機種において行うようにしました。(SDL_dspaudio.c)

20030622

以下の理由により、今後は阿川さんのパッチをベースにします。

  • 日本の Linux Zaurus においては、阿川さんがパッチを当てて公開されている SDL パッケージが、SDL としてほぼ標準となっており、これと互換性のない別の SDL パッケージを使うとユーザが不便。
  • SL-C750, SL-C760 を買う予定がないので、サポートするのがたいへん。
  • 私の以前のパッチでの修正が全て取り入れられている。

そこで、阿川さんの libsdl_1.2.5-slzaurus20030622_arm.diffをもらってこちらで libSDL-1.2.so.0.0.5 を作成して試してみたのですが、色々問題が発生したので修正パッチSDL-1.2.5-k3.diffを書きました。阿川さんのパッチをあてた SDL-1.2.5 に対してあてます。パッチの内容は以下の4点です。

  • SL-5500 に対応していないため対応させました。(SDL_sysvideo.cc)
  • rotation_ が 2 の時の画像転送において 32bit aligned された画像(x, width が偶数)を仮定しており、そうではない画像が来たときに正常に転送されないため、32bit 転送の部分はそのままとし、境界部分を別途処理することで、正常転送されるようにしました。(SDL_QWin.cc)
  • マウスカーソルを warp させたときに発行される SDL_PrivateMouseMotion に与える座標を、アプリケーションの論理座標に修正しました。(SDL_sysmouse.cc)
  • フレームバッファとアプリケーションが指定する画像の向きが異なるときに、マウス座標設定時にマージンの取り扱いがおかしかったため修正しました。(SDL_QWin.cc)

以下は古いパッチです

上記の阿川さんのパッチに取り込まれているため、現在は直接当てる必要はありません。

  • 神木さんの patch を当てました。SL-A300 で音切れが解消されるようです。
  • Qtopia で動かす場合 OK ボタンがなぜか割り当てられていないので、SDL-1.2.5/src/video/qtopia/SDL_QWin.cc に patch をあてました。
  • SDL_WarpMouse が SDL_MouseMotionEvent を発生させないので、SDL-1.2.5/src/video/qtopia/SDL_sysmouse.cc にこれを発生させる patch をあてました。これで、選択肢やボタン待ちの時に十字キーの上下を押すと、カーソルが移動するようになります。
  • (Jan. 2, 2003)SDL on Qtopiaでは、QDirectPainterを使用してFrame Buffer Driver のロックを行い、frame buffer に直接描画していますが、ロックを解除するときに(SDL_QWin::unlockScreen()) QDirectPainter::end() を呼んでから delete すると、正常にロックを解除できなくなることがあるようです。一旦不完全にロックを解除すると、Frame Buffer Driverからイベントをもらえなくなり、QAapplicationにイベントが来なくなります。
    このとき、イベントは消えるのではなくFrame Buffer Driverのキューにたまり続け、強制終了するなどしてアプリケーションがいなくなると、ロックが解放され、イベントの受取りアプリケーションが変わり、そちらにイベントが流し込まれます。ただし、コードをきちんと奥まで追っていないため、上の記述の後半は推測です。
    QDirectPainterをdeleteする前にend()を呼ぶ必要はなさそうなので、これを削除しました。

上の4つの patch を合わせたものを、SDL-1.2.5-k2.diffに置きます。

> cd SDL-1.2.5
> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux --enable-video-qtopia
    --disable-video-photon --disable-video-fbcon --disable-video-direct
    --disable-video-ggi --disable-video-svga --disable-video-aalib
    --disable-video-dummy --disable-video-dga --disable-arts --disable-esd
    --disable-alsa --disable-video-x11 --disable-nasm --disable-debug
> make
> su
> make install

libjpeg 6b

Independent JPEG Groupより、jpegsrc.v6b.tar.gzをダウンロード。

libtool がないと失敗するので、Debian のものを持ってきました。

> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux --enable-shared
> cp /usr/bin/libtool .
> make
> su
> make install

zlib-1.2.3

zlibより、zlib-1.2.3.tar.gzをダウンロード。

> setenv LDSHARED "arm-linux-gcc -shared -Wl,-soname,libz.so.1"
> configure --shared --prefix=/opt/Embedix/tools/arm-linux
> make
> su
> make install

libpng-1.4.5

libpngより、lbipng-1.4.5.tar.gzをダウンロード。

> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux
> make
> su
> make install

SDL_image-1.2.10

SDL本家より、SDL_image-1.2.10.tar.gzをダウンロード。

> setenv PKG_CONFIG
> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux --disable-lbm
    --disable-pcx --disable-tga --disable-jpg-shared --disable-png-shared

SDL-1.2.5 をベースにしてコンパイルできるように Makefile に定義を追加します。

CFLAGS = -g -O2 -I/opt/Embedix/tools/arm-linux/include/SDL -D_REENTRANT -Dmain=SDL_main -D"RW_SEEK_SET=0" -D"RW_SEEK_CUR=1" -D"RW_SEEK_END=2" -D"SDL_strcmp=strcmp"
> make
> su
> make install

SDL_mixer-1.2.11

SDL本家より、SDL_mixer-1.2.11.tar.gzをダウンロード。

神木さんの patch を当てました。SL-5500 では、ソフトウェア MIDI の演奏で、基本的に音切れしなくなりました。上の神木さんのページからコピーしたものを、SDL_mixer-1.2.6-k1.diffに置きます。(旧パッチ:SDL_mixer-1.2.4-k1.diff

> setenv PKG_CONFIG
> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux
    --enable-music-ogg-tremor
    --disable-music-ogg-shared
    --enable-music-mp3-mad-gpl --disable-music-mp3
    --disable-music-cmd --disable-music-mod
    --disable-smpegtest --disable-music-midi

SDL-1.2.5 をベースにしてコンパイルできるように Makefile に定義を追加・削除します。

CFLAGS  = -g -O2 -D"RW_SEEK_SET=0" -D"RW_SEEK_CUR=1" -D"RW_SEEK_END=2" -D"SDL_stack_alloc(type, count)=(type*)malloc(sizeof(type)*(count))" -D"SDL_stack_free(data)=free(data)" -D"SDL_abs=abs"
EXTRA_LDFLAGS =  -L/opt/Embedix/tools/arm-linux/lib -Wl,-rpath,/opt/Embedix/tools/arm-linux/lib -lSDLmain -lSDL -L/opt/Qtopia/sharp/lib -L/opt/Qtopia/sharp/lib/ -lqpe -lqte -lpthread -lvorbisidec -lm -lmad

SDL-1.2.5 をベースにしてコンパイルできるように dynamic_ogg.c を以下のように変更します。

/*#include "SDL_loadso.h"*/
extern void *SDL_LoadFunction(void *handle, const char *name);
> make
> su
> make install

bzip2-1.0.4

The bzip2 and libbzip2 official home pageより、bzip2-1.0.4-tar.gzをダウンロード。

Makefile: の下記の行を変更

CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib

PREFIX=/opt/Embedix/tools/arm-linux

all: libbz2.a bzip2 bzip2recover
> make
> su
> make install

freetype-2.1.10

the Free Type Projectより、freetype-2.1.10.tar.gzをダウンロード。

神木さんの patch を当てました。Embedded bitmap を使ったフォントも使えるということなのですが、当方ではこれをあてて msgothic を使っても改善されませんでした。試した範囲では、以前と同じ。上の神木さんのパッチと同等のものを、freetype-2.1.3-k1.diffに置きます。

> configure --host=i386-linux --target=strongarm-linux
    --prefix=/opt/Embedix/tools/arm-linux
> make
> su
> make install

make の途中で、freetype-2.3.5/objs/apinames を host compiler で作成するはずが target compiler で作成してしまい失敗するので、ここだけ手動で作成しました。

SDL_ttf-2.0.9

SDL本家より、SDL_ttf-2.0.9.tar.gzをダウンロード。

> configure --host=i686-linux --target=arm-linux
    --prefix=/opt/Embedix/tools/arm-linux --without-x
> make
> su
> make install

mad-0.14.2b

MAD: MPEG Audio Decoderより、mad-0.14.2b.tar.gzをダウンロード。

MAD は整数計算のみでMP3をデコードするライブラリです。ARM 系の CPU では、浮動小数点計算が非常に遅いため、ONScripterでは、SMPEGに差し替えこれで MP3 をデコードします。

一部の MP3 が演奏できないので、MP3 の frame header の資料と MADのソースを付き合わせ、どこがおかしいのかを調べました。結果、frame header の 15, 16 bit 目の Emphasis が2の場合、MAD は不正なヘッダとして弾いています。私が参考にした資料には、2 は reserved となっているため、MAD 的には正しいことをしているようですが、なぜかこの MP3 は 2 になっているため、2 の場合 0 (none) 扱いすることにして続行するパッチmad-0.14.2b-k1.diffをあて、演奏可能になりました。

> configure --host=armv4-linux --prefix=/opt/Embedix/tools/arm-linux
    --enable-fpm=arm --enable-speed --disable-debugging --enable-sso
> make
> su
> make install

Tremor Vorbis I Stream 20020517: 1.0.2

整数演算のみのデコーダである, the Ogg Vorbis 'Tremor' integer playback codecをダウンロード。configure.in の記述が一部おかしいので、パッチTremor-K1.diffをあてます。

> wget -r -l1 http://svn.xiph.org/trunk/Tremor/
> cd svn.xiph.org/trunk/Tremor
> sh autogen.sh --build=i686-linux --host=arm-linux
    --prefix=/opt/Embedix/tools/arm-linux
> make
> su
> make install