モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Raspberry piにili9431のSPI液晶を取り付けてみました

検索しても情報が錯綜しており結構苦労したので、備忘録です☺️

環境は以下の通りです。

最初から使える「fbtft」と、自分でコンパイルする「fbcp-ili9341」の2つについて書いてあります。

fbtftについて

ネット検索で出てくる情報においては、色々なOSバージョン、色々な環境、色々な目的で情報が錯綜しまくる中…

elchika.com

こちらのサイトが大変参考になりました。本当にありがとうございました。

現状のRaspberry Pi OSにおいて、fbtftは何もビルドせずに設定と接続だけで使えるようです。 この環境で、何も設定しなかった場合のデフォルト接続は以下の通りとなりました。

GPIOピン接続
LCD側端子名 ラズパイ側ピン番号 ラズパイ側BCM番号
SDO / MISO 21 GPIO 09
LED 12 GPIO 18
SCK 23 GPIO 11
SDI/MOSI 19 GPIO 10
D/C(もしくはDC/RS) 18 GPIO 24
RESET 16 GPIO 23
CS 24 GPIO 8

LEDは、 +3.3v直結でも良いようです(制御する必要のない場合)

/boot/config.txt の設定

config.txtには、以下の設定を追記します。 ほんと最後に付け足すだけでOK。

dtoverlay=rpi-display
raspi-configの設定

続けてconfig.txtを手動編集でも良いのですが、折角なのでraspi-configでInterface Option -> I3 SPI からの「はい」でSPIをEnableします。

表示テスト

以上の設定だけでfbtftがlsmodで出現するようになります(はずです)。フレームバッファとして機能し、 fbiコマンドで画像表示テストが可能です。

sudo fbi -nocomments -noverbose -a -T 1 -d /dev/fb1 hoge.jpg

縦長画像だと横トリミングで表示されるので、画像自体を回転させておいた方が楽でしょう。

デスクトップ表示

簡単な方法としてはまず、raspi-configのAdvanced OptionからwaylandをやめてX11にします。

その後、 /usr/share/X11/xorg.conf.d/に、99-my-spi-lcd.conf というようなファイル名で

Section "Device"
        Identifier      "TFT framebuffer FBDEV"
        Driver          "fbdev"
        Option          "fbdev" "/dev/fb1"
EndSection

として再起動で、320x240の狭い画面ですがデスクトップ画面が表示されます。

動きは荒いですが、まぁ使えないことはないです。 なお、このままではHDMI画面を別途接続していても、HDMIには何も表示されずSPI液晶だけに画面が出ました。何か方法があるのかもしれませんが…

fbcp-ili9341について

このSPI液晶、高速版ドライバのfbcp-ili9341を試してみたくて買ったようなものです。このfbcp-ili9341があればSPIにもかかわらず、かなりの速度で表示できるらしい!

ソースはこちら

github.com

日本語の解説ページはこちらです。本当に助かりました感謝です🙏

niccol.li

基本的には、fbcp-ili9341が起動している間は専用のフレームバッファが出来、それで表示が可能になるっぽいです。

注意事項
  • 干渉を防ぐため、fbtftと異なり、/boot/config.txtでのdt-overlay=rpi-display等は追記しない。しかし、他のフレームバッファ設定は色々追加する必要がある。
  • 干渉を防ぐため、raspi-configでfbtftの逆にSPIをdisable(選択肢で「いいえ」を選択)しておく(しなくても動作するけど、一応)
  • 64ビット環境ではビルドが通らないためfbcp-ili9341は今の所、32ビット環境でしか使えない
  • waylandでは上手く行かなかったため、 raspi-configにてX11に切り替えておく必要あり(Advanced Optionから切り替え可能)
ビルドに必要なパッケージ

aptで以下のパッケージのインストールが必要となります。

パッケージ名 備考
build-essential 大抵最初から入っている
cmake ビルド自体に必要
libraspberrypi-dev fbcp-ili9341が使用しているbcm_host.hに必要
raspberrypi-kernel-headers 同上
ビルド

私の場合はピン配置を上記fbtft互換とするため、以下のようなビルドオプションとなりました。その他の細かい設定は日本語解説に従っています。

注意点としては

  • GPIO_TFT_DATA_CONTROL、 GPIO_TFT_RESET_PIN、 GPIO_TFT_BACKLIGHT はGPIOのピン番号ではなく、BCM番号で指定します。
  • このため、 私の目的の場合は、-DGPIO_TFT_DATA_CONTROL=24 -DGPIO_TFT_RESET_PIN=23 -DGPIO_TFT_BACKLIGHT=18 となります。
  • クロック分周比設定ですが、私の環境では-DSPI_BUS_CLOCK_DIVISOR=8では正常に動きませんでした。デスクトップまでは表示されるのですが、激しい動作をするソフトを立ち上げると画面が真っ白になります。ので、-DSPI_BUS_CLOCK_DIVISOR=16にあげ(動作クロックを下げ)ました。
  • LCDを試験的に接続しているジャンパ線のクオリティが問題なのかもしれません。それか単にOCに耐えられない個体だったか…
  • -DSTATISTICSを指定しないとデフォルトは1(enabled)で、カッコイイステータス表示が上に出るのですが、普段使用する時は要らないなってことで0です😅
cmake -DILI9341=ON \
-DCMAKE_BUILD_TYPE=Release \
-DGPIO_TFT_DATA_CONTROL=24 \
-DGPIO_TFT_RESET_PIN=23 \
-DSPI_BUS_CLOCK_DIVISOR=16 \
-DARMV8A=ON \
-DUSE_DMA_TRANSFERS=ON \
-DDMA_RX_CHANNEL=5 \
-DSTATISTICS=0 \
-DBACKLIGHT_CONTROL=ON \
-DGPIO_TFT_BACKLIGHT=18

これでcmakeした後、 make -j で実行ファイルfbcp-ili9341が割とすぐに出来ます。

なお、何故か公式の説明のように「buildサブディレクトリを掘ってそこに移動してcmake」しても、エラーが出て上手く行きませんでした…cmakeをあまり使った事がないので原因はよく分かりませんが、仕方なくfbcp-ili9341のディレクトリで直でcmake & make -jで実行ファイルが生成されました。

起動設定

fbcp-ili9341が正常に起動している間、/dev/fb* が追加されるわけですが、実使用においては起動直後から動かしておくために/etc/rc.localもしくはsystemd向けにserviceファイルを作成してデーモン化しておく必要が出てきます。

Raspberry pi OS bookwormではrc-local.serviceがデフォルトでenableされていたので、取り敢えずラクチンな/etc/rc.localを選びましたが、落ちた時の自動再起動を考えればsystemdにしておきたい所ではあります。

/etc/rc.local は以下のようになりました。皆様の環境に合わせてfbcp-ili9341へのフルパスを書き換えておけば良いでしょう。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /home/dothiko/cprgs/fbcp-ili9341/fbcp-ili9341 &

exit 0

…なお、私の環境のこのディレクトリですが、本来はfbcp-ili9341/の下にbuildディレクトリを掘ってそこでcmakeしてビルドするっぽいのですが…何故か上手く行かなかったため、

南無三!

という感じでfbcp-ili9341のディレクトリで直接cmake & make -jしました😅

/boot/config.txtの設定

以下のように書き換えましたので一部抜粋。 なお、dtoverlay=vc4-kms-v3d では何故か上手く行きませんでしたので、vc4-fkms-v3dで行きました。

dtoverlay=vc4-fkms-v3dに書き換えた後、 arm_boost=1の下、[cm4] までの間に SPI専用設定を挿入してあるわけです。

# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1

# Disable compensation for displays with overscan
disable_overscan=1

# Run as fast as firmware / board allows
arm_boost=1

# ----------- FOR SPI LCD ----------------
# uncomment to force a console size. By default it will be display's size minus
# overscan.
framebuffer_width=320
framebuffer_height=240

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 1 0 0 0

[cm4]

なお、幅320, 高さ240は変更が可能で、fbcp-ili9341はパネル解像度を上回る場合は自動でスケーリングしてくれます。

そして、HDMIとの共存においては解像度320x240は存在しないため不可能だそうで。 そこで妥協策として、640x480に収めておくという対応方法があるようです。

私は実際には320x240での動作確認後、640x480に書き換えて動かしています。 この場合、HDMIモニタと同時に使用するとクローン表示になります。

追記:

…と、打ち消し線にしたのは理由がありまして…実は、640x480に書き換えて動くことは動くのです。ただし、実際には1024x600?ぐらいの大きな画面の一部を切り抜いた状態になっていて、画面隅のアイコンが見えていない事をXの@TororoLabさんの指摘で知りました😅

対応方法は、以下の記事に記してあります。

dothiko.hatenablog.com

raspi-configでの設定

SPIをdisableするのに加え、Advanced Options -> A6 Wayland -> W1 X11 を選択してwayfire(wayland)からX11に切り替えます。

動作の感想

起動直後のデスクトップ画面

以上により起動時からデスクトップ画面がLCDに、しかも滑らかに表示されるはずです😆 分周比16でも十分イケますね〜。

まぁ、8にしたい所ですが…ケーブルから考え直したほうが良さそうです。もしかすると、液晶自体がOCに耐えられないハズレなのかも…いやこれほどのOCに耐えられるほうがちょっと優秀すぎるのかもしれませんがw

試しにmednafenでomegablastをやってみましたが、PC上でやるより上手く避けれる気がするのは気の所為でしょうか…😅

おっと、この環境下でmednafenで正しくフルスクリーンするには、メガドラのomegablastの場合は ~/.mednafen/mednafen.cfgを書き換えて、

md.xres 640
md.xscalefs 1.000000
md.yres 480
md.yscalefs 1.000000

…などとしておく必要があるかもしれません (640x480時, 320x240時は当然320と240になります)

その他、ファミコンフリーゲームをやってみるのであればnes.xres/yres等も必要だと思います。

では、良きラズパイライフを ( ← youtubeのハンターチャンネルの真似w