niccollive

作れるものはなんでも作ります

View the Project on GitHub niccolli/log

Raspberry PiでSPIディスプレイをフル活用する

Raspberry PiのSPIバスを使うディスプレイも、fbcpを使うと動画も流せることがわかりました。使い方をまとめます。

画面

秋月電子で購入できるMSP2807を使います。その他通販だとタッチコントローラーがないものもあるようですが、使わないので問題ありません。

ソフトウェア

fbcp-ili9341

fbcp-ili9341を使います。Building and runningにある手順でビルドできます。必ずRaspberry Pi OS (Bullseye)の32bit版を使ってください。

fbcpは、基本構造はフレームバッファに入ってきた描画データをSPIに置き換えて流し込み続けます。が、それではSPIのバス速度では全ピクセルの書き換えが間に合いません。READMEには各フレームで差分のみ更新していると記載されています。

ビルドオプションは次のように設定しました。SPI_BUS_CLOCK_DIVISORはREADMEに記載の6だとうまく表示できなかったので8 (250MHz/8=31.25MHz) にしています。もともとILI9341のSPI最大周波数は10MHzらしく、かなりのオーバークロックで使うことになります。DMA_RX_CHANNEL=5は指定しなくても大丈夫なんですが、実行時に衝突しているメッセージが出たら適宜設定してください。

cmake -DILI9341=ON -DGPIO_TFT_DATA_CONTROL=22 -DGPIO_TFT_RESET_PIN=24 -DSPI_BUS_CLOCK_DIVISOR=8 -DARMV8A=ON -DUSE_DMA_TRANSFERS=ON -DDMA_RX_CHANNEL=5 -DBACKLIGHT_CONTROL=ON -DGPIO_TFT_BACKLIGHT=23 ..

config.txtの設定

HDMIケーブルの接続なくデスクトップ画面を表示するには、/boot/config.txtを次のように設定します。下記gistを参照してください。dtoverlayのSPIは設定してもいいですが、誤って他のプロセスやシェルから同じバスを呼び出してしまうと、fbcpが止まります。CSで他の部品を呼ぶ余裕もないほどバスを占有する前提として、設定しないほうがいいでしょう。

動作の様子

滑らかに動くし、音声とのズレも感じなくて気に入っています。

その他

Raspberry Pi起動時にfbcp-ili9341も起動させる

/etc/rc.localのexit 0の前に、fbcp-ili9341の起動コマンドを追加します。

[パス]/fbcp-ili9341 &

64bit版OSでは動きません

Known Issuesにもあるように、ビルドが通らず動きません。