raspberrypi3 yoctoでfbcp

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-raspberrypimeta-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が赤く染まるようになっている。