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

BeagleBone Blackを使う

最近、Linux on ARM に興味を持ち、いろいろと構成を知りたくなりました。特にLinuxの構成がどのようになっているのか、ドライバの作り方等々。既に Raspberry Pi を持っていますが、これ1種類では Raspberry Pi 固有なのかどうかの判断が付きにくいので、かねてより他の安価なボードを買おうか迷っていました。そんな矢先、秋月電子通商で BeagleBone Black を売っているのを知り、購入してみました。

これ、購入して初めて知ったのですが、Raspberry Piに比べてWEB上での情報が格段に少ないです。特に日本語のサイトとなると数えられるくらいです……。これは面白いと思いました。私の目的が「Linuxの構成を知る」事にあるので、余分な情報が少なければ少ないほど自分で試行錯誤を繰り返し、資料を読みあさる必要があるからです。Raspberry Pi の時(主にLinuxアプリの使用方法を検討)とは異なり、Bootからrootfsの構成、Linuxドライバを含む下回りをメインに見ていこうと思います。もちろん、随時 Raspberry Pi と見比べて Linux固有なのか、ボード依存なのかといった判断をしながらです。

Raspberry Pi と BeagleBone Black との最大の違いは、前者はSDブートのみ、後者はNAND-Flashブート(on Board)とSDブートの両対応といった点です。BeagleBone Blackは2つのROM領域とブート方法があるが故にWEB上の情報を読む時に「どっちの事だ?」と考え込むことがあります。実に面白いです。

いろいろと御託を並べましたが、先ずは普通に起動する所まで持って行きます。Raspberry Pi では一切お目にかかっていない X-Window の起動を第1ステップとして設定しました。挑戦しながらの記事なので、間違いが散在する可能性が十分にありますが、課程を楽しむといった点で記録を残したいと思います。


私が購入したのは 「BeagleBone Black Rev.A5C」です。これには出荷時に NAND-Flash に Angstrom Linux が入れられていて、モニター(microHDMI)、キーボード、マウス、電源を繋げばLinuxマシンのできあがりです。なので、先ずは Angstrom Linux のお顔を拝見……と思ったのですが、思わぬ自体に。なんと microHDMI と USB の口が接近しすぎて両方を同時に刺す事ができません!?

1379858116338.jpg

PC専用モニターを持っていないので、液晶TVを代わりに使おうとして、HDMIのコネクタ変換(A→D)をかましたのが原因です。いきなりの衝撃的事実で意気消沈しそうでしたがそこは頭を切り換えて、変換機をもっとスマートな物を購入するとして、今できる事をする事にしました。

やりたい事は Ubuntu をSDカードで起動させて X-Window の画面を拝む事です。まっ、上記した様に変換機が届くまで拝む事はできませんが、準備だけはしてみましょう。

CircuitCo Wiki Support の Installing LXDE を参考に LXDE版12.04.2 LTSをインストールします。

ARM HF Linux にあるイメージファイルを取ってきてSDに書き込むのです。

ubuntu-precise-12.04.2-armhf-3.8.13-bone20.img.xz をDLして解凍します。解凍にはLhazを使いましたが、xz形式を解凍できるソフトであれば何でも可です。解凍したファイルを Win32DiskImager を使って microSDカード に書き込みます。1.78 GBあるので結構時間がかかります。
※指定するドライブには十分に注意してください。

書き終えた microSDカード を BeagleBone Black に挿入します。
本当はここでモニターとキーボード、マウスを繋ぐ所ですが、先に記載したようにコネクタが干渉して全部を繋ぐことができないので、大きな賭に出てみます。SSHが起動する事を前提にLANケーブルを繋いで S2-SWを押下したまま電源コネクタを接続します。

USER LED(4つ並んでいる)が点滅し起動した感じがしたら(私は1分くらい待ちました)S2-SWを放します。で、ルータで割り振っている BeagleBone Black のIPアドレスを調べます(接続前後で比べて増えた物だと思います)。そのIPアドレスを使ってターミナルからSSH接続します。ターミナルには TeraTerm を使いました。

User: ubuntu
Password: ubuntu

上記内容でログインした所、SSH接続できたので、賭に勝ったみたいです。

$ sudo apt-get update
$ sudo apt-get -y install lxde lxde-core lxde-icon-theme

通信速度にもよりますが、15分くらいで終了します。

$ sudo shutdown -h now

一度終了させて電源を抜いて S2-SW を押下しながら電源を刺すと X-window で起動している……はずです。

試しに、microHDMI端子にTVを繋いで表示してみたところ、ログイン画面が写りました。LXDE版12.04.2 LTSのログイン画面っぽいのでここまでは成功でしょう。

20130923_160504.jpg


せっかくSSHで接続しているので、状態確認です。

各容量を確認。

$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mmcblk0p2 ext4 1811704 797216 920792 47% /
devtmpfs devtmpfs 253768 4 253764 1% /dev
none tmpfs 50784 244 50540 1% /run
none tmpfs 5120 0 5120 0% /run/lock
none tmpfs 253912 0 253912 0% /run/shm
/dev/mmcblk0p1 vfat 1004 472 532 48% /boot/uboot


mmcblk0p1 と mmcblk0p2 をあわせても2GBくらいしか領域を確保されていません。4GBの microSDカード を使用しているので残り2GBがもったいないです。何とか領域の拡大ができないか調べてみたら、fdiskコマンドでパーティションの拡張ができる様です。

$ fdisk /dev/mmcblk0

Command (m for help): p ← 内容確認

Disk /dev/mmcblk0: 3965 MB, 3965190144 bytes
4 heads, 16 sectors/track, 121008 cylinders, total 7744512 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x80000000

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 2048 4095 1024 1 FAT12
/dev/mmcblk0p2 4096 3751935 1873920 83 Linux

Command (m for help): d ← パーティション削除(表面上の話しです)
Partition number (1-4): 2

Command (m for help): n ← パーティション作成(拡張)
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (4096-7744511, default 4096):
Using default value 4096
Last sector, +sectors or +size{K,M,G} (4096-7744511, default 7744511):
Using default value 7744511

Command (m for help): w ← 設定した内容を保存
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


パーティションの拡張設定はできたのですが、システムに反映されていないので再起動します。microSDカードから起動するので、S2-SWを押下しながら以下のコマンドを実行。

$ sudo reboot

再びSSH接続してパーティションが拡大されているか確認します。

$ sudo fdisk /dev/mmcblk0

Command (m for help): p

Disk /dev/mmcblk0: 3965 MB, 3965190144 bytes
4 heads, 16 sectors/track, 121008 cylinders, total 7744512 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x80000000

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 2048 4095 1024 1 FAT12
/dev/mmcblk0p2 4096 7744511 3870208 83 Linux

Command (m for help): q


$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mmcblk0p2 ext4 1811704 797324 920684 47% /
devtmpfs devtmpfs 253768 4 253764 1% /dev
none tmpfs 50784 244 50540 1% /run
none tmpfs 5120 0 5120 0% /run/lock
none tmpfs 253912 0 253912 0% /run/shm
/dev/mmcblk0p1 vfat 1004 472 532 48% /boot/uboot


パーティションは拡大されている。しかし、ファイルシステム上のサイズが変更されていないみたい。調べてみると resize2fs というコマンドで行う様だが…、入ってないです~。apt-cache search で調べてると、system-config-lvm に入っているらしい、でもこれってGUI側も入っているみたいなんだよな~、と思いつつインストール。

$ sudo apt-get install system-config-lvm

$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 967552 blocks long.

$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/mmcblk0p2 ext4 3778576 829248 2779472 23% /
devtmpfs devtmpfs 253768 4 253764 1% /dev
none tmpfs 50784 244 50540 1% /run
none tmpfs 5120 0 5120 0% /run/lock
none tmpfs 253912 0 253912 0% /run/shm
/dev/mmcblk0p1 vfat 1004 472 532 48% /boot/uboot


無事にファイルシステムとしても4GBを認識しました。

早くHDMIの変換機来ないかな~。

tag : BeagleBoneBlack

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

jujurou

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

カレンダー
01 | 2017/02 | 03
- - - 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 - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

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

FC2 Blog Ranking

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