作れるものはなんでも作ります
Raspberry PiのSPIバスを使うディスプレイも、fbcpを使うと動画も流せることがわかりました。使い方をまとめます。
秋月電子で購入できるMSP2807を使います。その他通販だとタッチコントローラーがないものもあるようですが、使わないので問題ありません。
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 ..
HDMIケーブルの接続なくデスクトップ画面を表示するには、/boot/config.txtを次のように設定します。下記gistを参照してください。dtoverlayのSPIは設定してもいいですが、誤って他のプロセスやシェルから同じバスを呼び出してしまうと、fbcpが止まります。CSで他の部品を呼ぶ余裕もないほどバスを占有する前提として、設定しないほうがいいでしょう。
滑らかに動くし、音声とのズレも感じなくて気に入っています。
使い方がわかってきた pic.twitter.com/YTankWKmp9
— 𝕟𝕚𝕔𝕔𝕠𝕝𝕝𝕚 (@niccolli) June 30, 2022
/etc/rc.localのexit 0の前に、fbcp-ili9341の起動コマンドを追加します。
[パス]/fbcp-ili9341 &
Known Issuesにもあるように、ビルドが通らず動きません。