検索しても情報が錯綜しており結構苦労したので、備忘録です☺️
環境は以下の通りです。
- Raspberry Pi 4 (4GB)
- Raspberry Pi OS (bookworm, kernel 6.1)
最初から使える「fbtft」と、自分でコンパイルする「fbcp-ili9341」の2つについて書いてあります。
fbtftについて
ネット検索で出てくる情報においては、色々なOSバージョン、色々な環境、色々な目的で情報が錯綜しまくる中…
こちらのサイトが大変参考になりました。本当にありがとうございました。
現状の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にもかかわらず、かなりの速度で表示できるらしい!
ソースはこちら
日本語の解説ページはこちらです。本当に助かりました感謝です🙏
基本的には、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さんの指摘で知りました😅
対応方法は、以下の記事に記してあります。
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