ラズパイ便利ですよね!で,ちょっとしたしたディスプレイがついてると便利ですよね.SPI接続のTFTモジュールをframebuffer経由で使うことができるfbtftとflexfbを使ってみました.
以下は,2021年10月時点ではオリジナルのfbtftに少し改変が必要でした,という話.
改変したコードはこちらhttps://github.com/miyo/fbtft/tree/for_linx_5.10.17
ことのはじまり
今更ながらSPIのTFTをRaspBerryPiのコンソールとして使う を見て,やってみたくなったのがはじまり.これができれば,ラズパイだけじゃなくていろんな組み込みLinuxボードに手軽にコンソールが接続できるのでは?とわくわくとします.
上記のページには,「最近のカーネルでは,コンパイルは必要ないことがわかりました.」と書いてあるのですが,ところがどっこい,それから年月が流れてカーネルから取り除かれてしまったようです fbtft_device and flexfb are gone in 5.4.というわけで自分でビルドして使ってみました.
実行環境
- Raspberry Pi 3 Mode B+
- 2021-05-07-raspios-buster-armhf.img
sudo apt install build-essential raspberrypi-kernel-headers
しておく- raspi-configでSPIを有効にしておく
- 「3. Interface Options」 -> 「P4 SPI」
- ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807
カーネルは, Linux raspberrypi 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l GNU/Linux
でした.
ビルド
すなおに,https://github.com/notro/fbtft をcloneしてビルドすればいいと思いきや,いくつか変更が必要でした.改変したコードは,https://github.com/miyo/fbtft/tree/for_linx_5.10.17 にアップロードしています.
ビルドとインストールの手順は次の通り.
$ cd /lib/modules/$(uname -r)/kernel/drivers/video/
$ sudo -s
# git clone https://github.com/miyo/fbtft.git
# cd fbtft
# git checkout for_linx_5.10.17
# make
# make install
# depmod
# exit
これでドライバのビルドとインストールは完了です.
使ってみる
ここからは,冒頭の参考URLの通りです.ラズパイとTFTモジュールの接続も,まんま真似します(ピン配は自分で要確認です).
TFTモジュール(ピン名は基板裏シルクを参照) | Raspberry Pi 3 |
[9] SDD(MISO) | N.C. |
[8]LED | 3.3V(17) |
[7]SCK | GPIO11/SCLK(23) |
[6]SDI(MOSI) | GPIO10/MOSI(19) |
[5]DC | GPIO02(3) |
[4]RESET | GPIO3(5) |
[3]CS | CS0#/GPIO8(24) |
[2]GND | GND(9) |
[1]VCC | 3.3V(17) |
接続できたらmodprobe
でドライバをロードします.
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0x38,\
-1,0x3A,0x55,\
-1,0x11,-2,120,\
-1,0x29,-2,20,\
-3
$ sudo modprobe fbtft_device name=flexfb gpios=dc:2,reset:3 speed=3200000
無事にドライバをロードできたら,dmesgで
[ 38.947027] fbtft: loading out-of-tree module taints kernel.
[ 39.008529] fbtft_device: SPI devices registered:
[ 39.008549] fbtft_device: spidev spi0.0 125000kHz 8 bits mode=0x04
[ 39.008557] fbtft_device: spidev spi0.1 125000kHz 8 bits mode=0x04
[ 39.008563] fbtft_device: 'fb' Platform devices registered:
[ 39.008600] fbtft_device: soc:fb id=-1 pdata? no
[ 39.008643] fbtft_device: Deleting spi0.0
[ 39.664536] graphics fb1: flexfb frame buffer, 320x240, 150 KiB video memory, 4 KiB DMA buffer memory, fps=20, spi0.0 at 3 MHz
[ 39.664772] fbtft_device: GPIOS used by 'flexfb':
[ 39.664778] fbtft_device: 'dc' = GPIO2
[ 39.664784] fbtft_device: 'reset' = GPIO3
[ 39.664790] fbtft_device: SPI devices registered:
[ 39.664798] fbtft_device: spidev spi0.1 125000kHz 8 bits mode=0x04
[ 39.664806] fbtft_device: flexfb spi0.0 3200kHz 8 bits mode=0x04
というメッセージを確認できました.
ここまでできたら,
$ con2fbmap 1 1
で,ページ冒頭の写真のように,SPI接続なTFTモジュールにラズパイのコンソールが表示されました.
せっかくなので,次はタッチパネルも使えるようになりたいですね.