- fbtft overlay機能は2021年11月にLinux(bullseye)へ組み込まれました。
- これ以前と以後では設定方法が異なります。標準ドライバとして組み込まれました。
- FBTFT RPI overlaysプロジェクトです。
- fbtft = frame buffer TFT
- frame buffer とは表示内容を記憶するメモリ領域を意味します。
- TFT(Thin Film Transistor:薄膜トランジスタ)
- LCD(Liquid Crystal Display:液晶ディスプレイ)の駆動にTFTが使われます。TFTはLCDの象徴ともいえます。
- fbtftは液晶パネルをドライバで制御し、モニタにしてしまう機能です。
- Linuxの標準ドライバとして組み込まれたため、専用ドライバを必要としません。
- 設定だけでモニタとして利用できます。
- 液晶パネルを高速SPI通信(標準で32Mbps)で接続し、専用コントローラが搭載されています。
- コントローラの違いを吸収する仕組みがあります。
- 使用するRESETピン、D/Cピン、液晶のドット数、回転角度を指定します。
- 組み込み機器でちょっとした作業をしたいときに使用します。
- 表示領域が小さいため利便性は悪いが、通常モニタを使用するまでもないときに便利です。
- 例えばUSBキーボードを接続して、ネットワーク障害のエラー内容を確認します。
- ネットワーク障害を起こしているとリモートでエラー内容を確認できません。
- ちょっとしたコマンドを実行します。
- 直接間接に関わらず、いかなる損害も筆者は責任を負いません。
- 記事は無保証です。修正義務や回答義務を負いません。
- 1.77インチAE-ATM0177B3を使用します。
- フラットケーブルの変換基板付きで扱いやすいです。
- 128x160ドット
- コントローラはILI9163
- 3.3Vで動作します。
- このほかにバックライトLEDの電流制限抵抗10Ω
- 電流は(3.3V-3V)÷10Ω=30mA
- ラズパイ --- TFT変換基板(AE-ATM0177B3)
- 1:3V3 ------------- 10Ω経由で5:A
- 9:GND ------------- 8:GND
- 17:3V3 ------------ 9:VCC
- 19:MOSI ----------- 10:SDA
- 23:SCLK ----------- 11:SCK
- 18:GPIO24 --------- 12:A0
- 22:GPIO25 --------- 13:REST
- 25:GND ------------ 14:K
- 24:CE0 ------------ 15:CS
- AはバックライトLEDのアノードです。
- SDAはデータ入力です。
- SCKはクロック入力です。
- A0はデータ/コマンド識別の入力です。
- RESTはリセット入力です。Lowで有効です。
- KはバックライトLEDのカソードです。
- CSはチップセレクト入力です。Lowで有効です。
- SCLK,MOSI,MISO,CEはSPI(Serial Peripheral Interface)通信と呼ばれ、ラズパイの標準機能です。
- ラズパイがSPIマスター、TFTがSPIスレーブとして機能します。
- A0(D/C),RESTはラズパイのGPIOに接続して制御します。
/boot/config.txt
- 2行追加します。
- dtparam=spi=on
- dtoverlay=fbtft,spi0-0,ili9163,bgr,dc_pin=24,reset_pin=25,width=128,height=160,rotate=90
/boot/cmdline.txt
- SPI0を有効にします。
- fbtftを有効にします。
- spi0-0 はSPI0を指定
- ili9163はコントローラを指定(st7735r/st7789vなどから選択)
- bgrはBlueとRedを入替指定※後ほど解説
- dc_pin=24はD/CにGPIO24を指定
- reset_pin=25はRESETにGPIO25を指定
- width=128はドット列を指定
- height=160はドット行を指定
- rotate=90は回転を指定(0/90/180/270から選択)
- このほかにも通信速度なども指定できます。デフォルトは32MHzです。
- 詳細は/boot/overlays/READMEのfbtft項目を参照してください。
- 追加します。
- fbcon=map:10 fbcon=font:VGA8x8
sudo reboot
- 使用するフォントサイズ8x8を指定します。
- (128x160)ドットですから(16x20)文字になります。
- VGA8x16を指定するとフォントサイズ8x16です。
- リブートすれば、コンソール画面(CUI)になります。
- おかしなことに気が付きました。
- $ が青ではなく赤です。
- bgrの指定が効いていません。
- ソースを確認したところバグでした。
dmesg | grep fb
- ドライバの組み込みを確認します。
[ 42.774868] fbtft: module is from the staging directory, the quality is unknown, you have been warned. [ 42.946218] fb_ili9163: loading out-of-tree module taints kernel. [ 42.947101] fb_ili9163 spi0.0: fbtft_property_value: width = 128 [ 42.947133] fb_ili9163 spi0.0: fbtft_property_value: height = 160 [ 42.947155] fb_ili9163 spi0.0: fbtft_property_value: buswidth = 8 [ 42.947183] fb_ili9163 spi0.0: fbtft_property_value: rotate = 90 [ 42.947204] fb_ili9163 spi0.0: fbtft_property_value: fps = 30 [ 46.964080] graphics fb1: fb_ili9163 frame buffer, 160x128, 40 KiB video memory, 4 KiB buffer memory, fps=33, spi0.0 at 32 MHzlsmod | grep fb
- ドライバの常駐を確認します。
fb_ili9163 16384 1 fbtft 45056 1 fb_ili9163 syscopyarea 16384 1 fbtft sysfillrect 16384 1 fbtft sysimgblt 16384 1 fbtft fb_sys_fops 16384 1 fbtft backlight 20480 2 fbtft,drmfbset -i -fb /dev/fb1
- 作成されたデバイスを確認します。
- この例ではfb1ですがfb0かもしれません。
mode "160x128" geometry 160 128 160 128 16 timings 0 0 0 0 0 0 0 nonstd 1 rgba 5/11,6/5,5/0,0/0 endmode Frame buffer device information: Name : fb_ili9163 Address : 0 Size : 40960 Type : PACKED PIXELS Visual : TRUECOLOR XPanStep : 0 YPanStep : 0 YWrapStep : 0 LineLength : 320 Accelerator : No
/etc/X11/xorg.conf.d/fbtft.conf
- 画面が小さいため使用することはないと思いますが、X Windowを起動します。
- /etc/X11/xorg.conf.d/fbtft.confファイルを作成します。
- cd /etc/X11/xorg.conf.d/
- sudo wget https://gist.github.com/notro/63fc8f563b5f85010d30/raw/5e68d6c6df9471f973b3da5305e73a5017590a69/fbtft.conf
- ファイルを編集します。
Section "Device" Identifier "DeviceTFT" Driver "fbdev" # これを追加 Option "fbdev" "/dev/fb1" # /dev/fb* はコマンドで確認した番号 EndSection
sudo startx -- -layout TFT
- なお、この設定を行うと xrdp が動作しません。
- X11の設定を行うので当然です。
- ファイルを削除すればもとに戻ります。
- $ sudo rm /etc/X11/xorg.conf.d/fbtft.conf
- ゴミ箱しか表示できません。
- 何も指定しない場合も TFT が起動します。
- HDMIを起動したいとき
- sudo startx -- -layout HDMI
- bgr指定が効かないことから、ソースを確認したところバグを発見しました。
- いずれ修正されると思いますが、今すぐ直したいときはソースからコンパイルします。
- カーネルドライバのコンパイル方法は割愛します。
- 必要なソースはここにあります。
- fb_ili9163.c
- fbtft.h
- ビット操作を間違っています。ビット番号の誤りと、ビットセットとビットクリアの多重誤りです。
- 誤
- if (par->bgr)
- mactrl_data |= BIT(2);
- 正
- if (par->bgr)
- mactrl_data -= BIT(3);
- 修正してコンパイルしインストールした結果が上記(夕焼けに浮かぶゴミ箱)です。
- RGBを正しく表示しました。
- ※こちらで作成したドライバ(バイナリ)を皆さんに提供できません。
- ※Linuxはカーネルのバージョンと異なるドライバを異物とみなし、起動しません。
- ※嫌がらせで提供しないのではありません。提供しても(カーネルのバージョンが適合しない限り)動かないからです。
- コントローラの種類や解像度がわかれば、同様の方法でTFTパネルを利用できます。
- 標準で組み込まれたので面倒な操作は必要ありません。
- ただし、バグがあるかもしれません。
- 要望があればLinuxドライバの修正を有償で受けるかもしれません。いわゆるサポート費用です。
- Linuxのカーネルを解析しないと解決できません。
- 高い技術力、分析力が必要です。
- 結果を知ってしまえば簡単ですが、ここまで情報をまとめるのは容易ではありません。