niccollive

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

View the Project on GitHub niccolli/log

Raspberry PiでSPIディスプレイに画面を表示させる (64bit対応)

過去の記事で、Raspberry PiでSPIディスプレイを使うにはfbcp-ili9341を使って表示させる方法を記載しましたが、残念ながらfbcp-ili9341は64bitに対応できない・参照しているライブラリが古いとの理由で開発終了となりました。

一方で、Raspberry PiでSPIディスプレイを扱うのにあたって新しいドライバがLinuxカーネルに組み込まれるようになりました。mipi-dbi-spiです。この記事では、64bit版Raspberry Pi OSでの適用方法を記載します。

設定方法

mipi-dbi-spi経由のSPIディスプレイ制御を行うにあたり、次の対応が必要になっています。

  1. /boot/firmware/config.txt に設定項目を記載
  2. “ファームウェア”をビルドして /lib/firmware/panel.bin として保存

これらの対応で、Raspberry Pi起動後にデスクトップをそのままSPIディスプレイに表示できるようになります。

config.txt に設定項目を記載

/boot/firmware/config.txt の末尾に、次のように記載します。

dtoverlay=mipi-dbi-spi,spi0-0,speed=70000000
dtparam=width=320,height=240
dtparam=reset-gpio=24,dc-gpio=22
dtparam=backlight-gpio=23

GPIO(Reset/DC/Backlight)は、自身の接続先に合わせて調整してください。

ILI9341の場合、データシートを読むと100nsが最小(18.3.4 Display Serial Interface Timing Characteristics (4-line SPI system)のtwcの値)なので、最速は10MHzとなりますが、真面目に10MHzに設定するとカクカクして扱いづらいです。実力値で70MHzを設定しているようです。

“ファームウェア”をビルドして配置

これが一番肝心なようです。Raspberry Pi環境で実行する場合、mipi-dbi-spiドライバは特に指定がない場合は/lib/firmware/panel.binをファームウェアとしてSPIディスプレイに適用します。これは下記の手順にてビルドができます。

  1. https://github.com/notro/panel-mipi-dbi から mipi-dbi-cmd をダウンロード。なかみはPythonのスクリプトです。
  2. https://github.com/notro/panel-mipi-dbi/wiki/Displays から、使用するディスプレイのコントローラーに合わせてテキストファイルを作成する。
  3. python mipi-dbi-cmd panel.bin ili9341.txt と実行してファームウェアをビルド
  4. panel.bin を /lib/firmware にコピー
  5. Raspberry Piを再起動

うまく設定できた場合、dmesgに次のように記録されます。フレームバッファが設定され、ディスプレイにデスクトップ画面が表示されます。

[   10.320278] [drm] Initialized panel-mipi-dbi 1.0.0 20220103 for spi0.0 on minor 2
[   10.949283] panel-mipi-dbi-spi spi0.0: [drm] fb0: panel-mipi-dbid frame buffer device

活用例

もたつくようなこともなくスムーズに表示されています。じっと見つめていると反映されていない箇所もあるように見えますが、動画の場合はすぐ書き換えられるのであまり気にならないと言えるでしょう。

追記:Raspberry Pi 3以前の場合

mipi-dbi-spiは、Wayland環境を前提としているようです。BookwormはWayland が標準になりましたが、Raspberry Pi 3以前(+Zeroシリーズ)では引き続きX11が標準で使われています。

Raspberry Pi 3以前の環境でWaylandを使う場合、/boot/firmware/cmdline.txtに設定を追加する必要があります。raspi-config上での設定は反映されないので注意が必要です。