BeagleBone Black の OpenGL ES対応(Linux版) その1

先ずはじめに"その1"としたのは、まだ動作確認までできてないからです。とりあえず物は作れますが、今日は気力が尽きました…。

BeagleBone Black は XAM3359AZCZ という Core: Cortex-A8, GPU:PowerVR SGX 3D GFX(SGX530) とその他諸々を含んだプロセッサを積んでいます。GPUはOpenGL ES 1.1/2.0 のハードウェアアクセラレーションを可能としています。これは面白そうだと思ったのがそもそもの購入の動機なのです。が、結構ハマりにハマってます。

そもそも、ハマる要因となっているのが GPU 周りの実装はベンダー任せな所です。GPUのマニュアルなんて社外秘なんでしょう。見たことがありません。例え見られたとしてもドライバを作る何て相当な知識が必要です。Androidは4.2からOpenGL ESのハードウェアアクセラレーションが必須になっていたと思います。BeagleBone BlackのAndroid版も例外なくハードウェアアクセラレーションしています。しかし、私はAndroidに興味が無くLinuxのWindow上でOpenGLを使いたい…もっと言えば、ハードウェアアクセラレーションされた環境でWebGLを使いたいのです。自分で勝手にハードルをおもいっきし上げまくってます。

前述した様にGPU周りはベンダー(TI)任せなので、ベンダーからドライバが出てくるのを待つしかありません。ベンダー側も OpenGL ES 対応をうたっているので何もしないという訳にはいかずチョロチョロとドライバを出してくれます。ま~TIはましな方かな。

TIはつい最近、AM335xに対応したSDKを出してきました。以前から対応はしていたのですが、正式対応とは言い難かったのです。今回のドライバ(gfxsdk 4_10_00_01)は…ま~前回よりはましといった内容になってます。ただし、対応kernelは3.2.xなんですね。これは微妙。BeagleBone Blackのユーザ再度の開発はkernel 3.8.x以降で進んでます。RobertCNelsonさんがハッキングされてるのをベースにしてる訳で、有名所はeewikiでしょうか。

kernel 3.2.x と 3.8.x で大きな違いがあるの? と思われるでしょう。ま~これがあるんです。実際には 3.7.x の後半で DTB (Device Tree Blob)という考えが取り込まれていて、Linux kernelを実行する前の段階でこれに必要なデータを準備しておく必要があるのです。組み込み系では主にkernelコンパイル時にデータを作成してkernelを呼び出すU-bootでRAM上への配置を行いkernelに場所を教える。といったことをすることになります。このようにした背景に Linus Torvalds さんが怒り狂ったというのがあるとかないとか…。

国内外の掲示板を見てもBeagleBone BlackのGPUドライバ(SGXドライバ)がkernel 3.8以降に対応していない点が幾度も議論されています。TIへの問い合わせ殺到状態だったのです。BeagleBone Blackが発売(2013年4月22日)されてから半年、ようやく動きが出てきました。TIの中の人の良心なのか何かは分かりませんが、3.8以降に対応してくれるような動きが出てきたのです。こちらの質問の回答にTIの中の人(Prathap Srinivasさん)がパッチを公開されました。自分にとってこれは願ったりかなったりです。早速試して見ました……。

ベースはeewikiの内容です。それに Texas Instruments Wiki の Graphics SDK Quick installation and user guide の内容を入れ込みました。


***********************************
2013/11/04 時点ではバイナリを作っただけで動作の確認はしていません。
***********************************


先ずは、必要そうな物をDLしておきます。あっ、ちなみにクロスコンパイルはIntel Core i7 の Windows上にVMwareをインストールし、その上で Ubuntu 12.04 を走らせています。


$ mkdir bbb_sgx
$ cd ./bbb_sgx/
$ mkdir sgx_patch
$ cd ./sgx_patch
$ wget http://e2e.ti.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-791-01-00-01-04-39-47/sgx_5F00_kernel_5F00_patches.tar.gz
$ tar zxvf ./sgx_5F00_kernel_5F00_patches.tar.gz
$ wget http://e2e.ti.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-791-01-00-01-04-53-12/Change_2D00_for_2D00_interfacing_2D00_with_2D00_SGX_2D00_DT_2D00_node.patch.tar.gz
$ tar zxvf ./Change_2D00_for_2D00_interfacing_2D00_with_2D00_SGX_2D00_DT_2D00_node.patch.tar.gz

本丸の Graphics SDK はTIのページからDLしますが、ユーザ登録が必要です。そこから Graphics_SDK_setuplinux_4_10_00_01.bin をDLしました。

必要な環境を構築します。


$ sudo apt-get install ia32-libs
$ wget -c https://launchpad.net/linaro-toolchain-binaries/trunk/2013.07/+download/gcc-linaro-arm-linux-gnueabihf-4.8-2013.07-1_linux.tar.xz
$ tar xJf gcc-linaro-arm-linux-gnueabihf-4.8-2013.07-1_linux.tar.xz
$ export CC=`pwd`/gcc-linaro-arm-linux-gnueabihf-4.8-2013.07-1_linux/bin/arm-linux-gnueabihf-

$ ${CC}gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.8-2013.07-1 - Linaro GCC 2013.07) 4.8.2 20130624 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Linux kernel作成直前まではeewikiの通りです。
kernelのソースコードにDTB系のパッチをあてる必要があるのですが、kernelのソースコードの取得からコンパイルまで自動で行うスクリプトを使用するので、このスクリプトにパッチをあてる形になります。具体的には、kernelのソースコードにパッチをあてているファイルは patch.sh に集約されているので、これに継ぎ足します。(※)の部分で継ぎ足し用に自分で作ったパッチを適用しています。

何故パッチを作ったのか。それは、Prathap Srinivasさんが作ってくれたパッチがどのバージョンのkernelに対するパッチなのかさっぱり分からなく、3.8.13-bone28 ではパッチの修正が必要で、何回もこの行程を実行したからです。修正済みパッチ(v3.8.13-bone28用)を置いておきます。


$ git clone git://git.denx.de/u-boot.git
$ cd ./u-boot/
$ git checkout v2013.07 -b tmp
$ wget https://raw.github.com/eewiki/u-boot-patches/master/v2013.07/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
$ patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
$ make ARCH=arm CROSS_COMPILE=${CC} distclean
$ make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_config
$ make ARCH=arm CROSS_COMPILE=${CC}

$ cd ../

$ wget -c https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh
$ chmod +x dtc.sh
$ ./dtc.sh

$ git clone git://github.com/RobertCNelson/linux-dev.git
$ cd ./linux-dev/
$ git checkout origin/am33x-v3.8 -b tmp
$ patch -p1 < ../bbb_sgx_patch-v3.8/sgx.patch (※)

$ sudo apt-get update
$ sudo apt-get install device-tree-compiler lzma lzop

$ ./build_kernel.sh

$ cd ../

ここからが本番で Graphics SDK を使って必要なカーネルモジュール等を生成します。


$ ./Graphics_SDK_setuplinux_4_10_00_01.bin

これを実行すると、GUI-windowが開きます。ライセンス等の確認と展開場所の選択をし、展開する種別を選択します。AM335xはes8.x系で自分はそれ以外の環境は必要ないので何かあった時用にSDKをプラスして展開しました。


$ cd ./Graphics_SDK_4_10_00_01/
$ patch -p1 < ../bbb_sgx_patch-v3.8/Change-for-interfacing-with-SGX-DT-node.patch

各種環境設定です。何を設定してもうまくいかず、途方に暮れた残骸です。
Graphics SDK Quick installation and user guide に書かれている内容も間違っていて、結果的に展開されたファイルの1つである Rules.make ファイルに記載されている内容が反映される構成になっていました。上記の環境設定も無駄ではないですが、Rules.makeを自分の環境に合わせて編集する方が楽です。


$ export HOME=/home/jujurou/BeagleBoneBlack/bbb_sgx/
$ export CSTOOL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/
$ export CSTOOL_PREFIX=arm-linux-gnueabihf-
$ export KERNEL_INSTALL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/linux-dev/KERNEL
$ export TARGETFS_INSTALL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/sgx_target_rootfs
$ export GRAPHICS_INSTALL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/Graphics_SDK_4_10_00_01
$ export ARCH=arm
$ export SDK_INSTALL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/
$ export LINUX_DEVKIT_PATH=/home/jujurou/BeagleBoneBlack/bbb_sgx/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/
$ export CROSS_COMPILE=/home/jujurou/BeagleBoneBlack/bbb_sgx/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin/arm-linux-gnueabihf-
$ export LINUXKERNEL_INSTALL_DIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/linux-dev/KERNEL
$ export DESTDIR=/home/jujurou/BeagleBoneBlack/bbb_sgx/sgx_target_rootfs

コンパイルと仮インストールです。


$ make BUILD=release OMAPES=8.x FBDEV=yes SUPPORT_XORG=1 PM_RUNTIME=1 all
$ sudo make BUILD=release OMAPES=8.x FBDEV=yes SUPPORT_XORG=1 PM_RUNTIME=1 install

ここでは自分の見落としから来た次のエラーで悩みました。


make[4]: *** No rule to make target `/home/jujurou/BeagleBoneBlack/bbb_sgx/Graphics_SDK_4_10_00_01/GFX_Linux_KM/services4/3rdparty/linux_drm/drm_sman.o', needed by `/home/jujurou/BeagleBoneBlack/bbb_sgx/Graphics_SDK_4_10_00_01/GFX_Linux_KM/services4/3rdparty/linux_drm/drm.o'. Stop.

なんじゃこりゃ。って内容です。
TI E2E Community でも同様の質問をされている人がいました。その回答を見て納得です。
分かってしまえば簡単な事で、es8.x用にコンパイルする人は GFX_Linux_KM/services4/3rdparty/linux_drm/Kbuild を編集してdrm_sman.o を drm_prime.o に置き換える事になってました。ちゃんと Texas Instruments Wiki にも載ってます。


If you are not able to build Graphics SDK with SUPPORT_XORG=1 & are getting the drm related errors -
Edit GFX_Linux_KM/services4/3rdparty/linux_drm/Kbuild to remove drm_sman.o from the list for 3.3 kernel.
For 3.4 till 3.8 kernel, edit GFX_Linux_KM/services4/3rdparty/linux_drm/Kbuild to remove drm_sman.o and add drm_prime.o to list
Also if you are getting a warning with 3.4 & above kernels - pci_bus_read_config_dword() undefined, then define a dummy function in GFX_Linux_KM/services4/3rdparty/linux_drm/pvr_drm_stubs.c of the graphics SDK release package & build. This should help in getting rid of the warning
For 3.2 & below kernels(till 2.6.37) no modification required & the default Kbuild provided in release package should work without any changes.

make all の方のエラーが取れて喜んでいたのもつかの間、make install でどうしても取れないエラーが発生してしまいました。demoなんて入れる予定は無いからコメントアウトしてもいい気もしますが、何処かに影響が出ないか調べている間に本日の作業としてはタイムアウトになりました。


exporting necessary variables and installing...
########################################################
Please ensure that PSP Linux kernel is re-built atleast once,
Please refer online guide for further details.
########################################################
creating directories...
copying startup files...
cp: cannot stat `/Graphics_SDK_4_10_00_01/targetfs/335x_xorg-demo': No such file or directory
make: *** [install_km] Error 1

コメントアウトでOKだと思います。make all の段階で必要なカーネルモジュール(*.ko)と開発用のライブラリは生成されているので、これらを適所に配置すればOKかと思います。


で、うかつだったのが、ここまできて最後にDTB用のパッチをあてている事に気がついたという事です。kernelモジュール生成の時に既にDTBを生成しているので、この時点でDTBの元データができても意味がありません。これは…次回へ持ち越しと言うことで。

宿題が多くなってしまいました…。
実際に画面が出るのはいつになることやら…。

tag : BeagleBoneBlack

tag : OpenGL

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
12 | 2025/01 | 02
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ Linux RaspberryPi 三段化 6P43P-E 全段差動プッシュプル トランジスタ式ミニワッター 6P43P TRminiWatterPart4 ギターアンプ MPD RaspberryPi_pico イーサネットコンバータ OpenOCD FON2405E DAC buildroot Bluetooth BeagleBoneBlack FM3ペリフェラル windows map UVC USB TL-WR700N FM4 ODROID-U2 mingw FM3評価ボード library ミニワッター OpenGL VMware 計測 プリアンプ Windows KiCad bitbake シングル Edison 6N6P 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter