PiTFTなどSPI接続のLCDではGPUを使用した描画処理は行えない。 そのためOpenGLESなどのアプリケーションはPiTFTでは使用できない。
しかし、fbcpを使用するとこの問題が解決できる。
fbcpは「Framebuffer Copy」のことで、GPUに描画されているデータをSPI側のフレームバッファにコピーするというアプリケーション。
実装を見ると、dispmanxでLCDデバイス(HDMIへの出力)を開いて、必要に応じて縮小し/dev/fb1に転送している。 このアプリケーションは、実はすでに有名なようでちょっと筆者としては出遅れた感がある。
以前、PiTFT3.5でQML(Quick2)アプリケーションが実行できない理由の時に「2.2インチや2.8インチのPiTFTではGPUを使用せずにOpenGLを描画することができる」というところでリンクを紹介したがこの内容も実はfbcpを使用することだった。 リンク先で「The 3.5" PiTFT (480x320) is NOT recommended for this project 」とされていたので深追いしなかったが、実は意外と使えるということが今回の実験でわかった。
とりあえず、yoctoprojectで使用できるようにmeta-rpi-fbcp
を作成した。
環境の作成
raspberrypi3 yoctoでPiTFT35の環境をベースに作業を行う。
meta-rpi-fbcpのダウンロード
gitでmeta-rpi-fbcpを取得する。
$ cd ~/rpi3/poky $ git clone https://github.com/mickey-happygolucky/meta-rpi-fbcp.git
ビルド環境の設定
oe-init-build-env
を読み込む。
$ cd ~/rpi3 $ source poky/oe-init-build-env build_pitft35
自動的にbuild_fbcpに移動される。
レイヤの設定
ビルド対象にはすでに、meta-raspberrypi
とmeta-pitft35-rpi
は追加されているので、次のコマンドでmeta-rpi-fbcp
を追加する。
$ bitbake-layers add-layer ../poky/meta-rpi-fbcp
conf/local.conf
local.conf
からRPI_PITFT35 = "1"
の行を削除し、RPI_PITFT35_FBCP = "1"
を追加する。
カーネル4.1の場合だと次のようになる。
MACHINE ?= "raspberrypi3" DL_DIR ?= "${TOPDIR}/../downloads" KERNEL_DEVICETREE_append = " overlays/pitft35-resistive-overlay.dtb" RPI_PITFT35_FBCP = "1"
設定が衝突するため、RPI_PITFT35 = "1"
とRPI_PITFT35_FBCP = "1"
は同時に指定できない。
動作確認
この環境では、PiTFT35のタッチパネルは無効化される。 今回は、X11環境で動作を確認する。
ビルド
$ bitbake core-image-sato
SDカードへ書き込み
$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M
/dev/sdb
のSDカードデバイスは環境によって変化することがあるのでfdisk -l
などで確認すること。
このままではただsatoのGUI環境が表示されるだけなので、fbcpなしの環境と比較するとタッチパネルが無効化されただけのように見えるが、
前回の記事で作成したfirst_window.c
のコンパイル結果を実行すると、PiTFT35が赤く染まるようになっている。