わかる方、自力で何とか出来る方のみ参考にしてください。
すべて自己責任でお願いします。
(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 なので当たり前といえば
当たり前です。
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
他に触ってる方はいないかもしれませんが、念のため追加情報:
「(CONFIG_MODVERSIONS を無効化するなど> 例 Module versioning support を外す)」
だけではだめだそうです。
ちなみに自分は最初にいきなりカーネルソースを書き換えてしまい、
あとから CONFIG_MODVERSIONS の定義があることに気がつきました。
希望があればさらに詳しく説明します。
結局 3Gモデム対応ツールは入れなくても大丈夫らしい。
また GLES 対応化の副作用で、カーネルを入れ替えても無線 LAN がきちんと
繋がるようになってしまった。
もちろん最初からそうなっていない理由があるはずなので、この辺は自己責任で。
同じく L2.6.~ の中から fbset を install すると色々実験できます。
展開してパッチを当ててコンパイル。
これで画面モードを変えられると良いのですが。
フレームバッファが倍の容量あるのは、余りをxserver-xorg-video-imxの2Dアクセラレーション用のオフスクリーンバッファに使用するためのようです。
ビデオアクセラレータがあったんですね。
tcpp さんありがとうございます。