パラレルのTFTをRaspberryPiのコンソールとして使う


こちら
で、fbtft+flexfbを使って、SPI接続の TFTモジュールをコンソールとして使う方法を紹介しました。
そこで、今回はfbtft+flexpfbを使って、パラレル接続のTFTモジュールをコンソールとして使う方法を紹介します。
flexfb と flexpfb は紛らわしいですが、以下の違いが有ります。
flexfb 汎用のSPI用モジュール
flexpfb 汎用のパラレル用モジュール

今回はILI9341とILI9342のパラレル接続TFTモジュールを紹介しますが、使われているコントローラチップと初期化コードさえ分かれ ば、
他のコントローラチップを使っているTFTでも手順は同じです。
右がILI9341 左がILI9342






写真の様に、これらは完全にArduino UNOのシールド用のTFTです。
見た目はそっくりですが、大きな違いがいくつか有ります。

・コントローラーがILI9341とILI9342
これはこちらのツールを使って調べま した。

・駆動電圧が5Vと3.3V
これはレギュレータが実装されているかどうかで判断できます。
レギュレータが実装されていれば5V駆動、実装されていなければ3.3V駆動です。

RaspberryPiとTFTの結線は、以下の様になります。
TFT RPi(Pin#)
LCD_RST Pin#7
LCD_CS Pin#3
LCD_RS Pin#5
LCD_WR Pin#26(*1)
LCD_RD Pin#28(*1)
LCD_D0 Pin#29
LCD_D1 Pin#31
LCD_D2 Pin#33
LCD_D3 Pin#35
LCD_D4 Pin#37
LCD_D5 Pin#32
LCD_D6 Pin#36
LCD_D7 Pin#38
5V 5V(*2)
3.3V 3.3V(*3)
GND GND

(※)全てのピンは変更できますが、変更した場合、モジュールロード時に指定するgpiosパラメータが変わります。
(*1)組み合わせによって動かない組み合わせが有ります。何度も確認しましたが、原因不明です。
  WR=Pin#24 RD=Pin#28 → 動く
  WR=Pin#26 RD=Pin#28 → 動く
  WR=Pin#24 RD=Pin#26 → 動かない(原因不明)
(*2)5V駆動モデルの時に使います。
(*3)3.3V駆動モデルの時に使います。


ILI9341

Jessiの時はfbtft_deviceモジュールを読み込んでから、flexfbモジュールを読み込んでも動きましたが、
Stretchになって順番が逆になりました。
ILI9341の初期化コードはこちらで紹介している初期化コー ドと同じです。
$ 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,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "320x240"
    geometry 320 240 320 240 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 640
    Accelerator : No

$ con2fbmap 1 1



横書きを180度回転するには以下のパラメータです。
rotationパラメータを指定しても回転しません。
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0xF8,\
-1,0x3A,0x55,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "320x240"
    geometry 320 240 320 240 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 640
    Accelerator : No

$ con2fbmap 1 1

上の写真と比べるとTFTの向きが180度回転します。



ILI9342

データシートを見る限り、ILI9341とILI9342はほとんど同じパラメータです。
なぜか0x21(Display Inversion ON)の初期化コードが必要です。
どうもTFT内部で反転のラインがONになっているようです。
また、0x36は文字の向きを決めるパラメータで、ILI9341もILI9342も全く同じコマンドのはずです。
ILI9341と同じパラメータでは動かないところを見ると、X,Yの信号線がTFT内部で逆に接続されているみたいです。
この辺りは、データシートを見ながら片っ端からパラメータを変えて試すしかないです。
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0x08,\
-1,0x3A,0x55,\
-1,0x21,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "320x240"
    geometry 320 240 320 240 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 640
    Accelerator : No

$ con2fbmap 1 1



横書きを180度回転するには以下のパラメータです。
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0xC8,\
-1,0x3A,0x55,\
-1,0x21,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "320x240"
    geometry 320 240 320 240 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 640
    Accelerator : No

$ con2fbmap 1 1





表示を縦書きにするには初期化のパラメーターを少し変更します。

ILI9341

$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0x58,\
-1,0x3A,0x55,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb rotate=90 \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "240x320"
    geometry 240 320 240 320 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 480
    Accelerator : No

$ con2fbmap 1 1



縦書きを180度回転するには以下のパラメータです。
rotationパラメータを指定しても回転しません。
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0x98,\
-1,0x3A,0x55,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb rotate=90 \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "240x320"
    geometry 240 320 240 320 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 480
    Accelerator : No

$ con2fbmap 1 1

上の写真と比べるとTFTの向きが180度回転します。



ILI9342

$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0x68,\
-1,0x3A,0x55,\
-1,0x21,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb rotate=90 \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "240x320"
    geometry 240 320 240 320 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 480
    Accelerator : No

$ con2fbmap 1 1



縦書きを180度回転するには以下のパラメータです。
$ sudo modprobe flexfb width=320 height=240 buswidth=8 init=\
-1,0x01,-2,5,\
-1,0x28,\
-1,0x36,0xA8,\
-1,0x3A,0x55,\
-1,0x21,\
-1,0x11,-2,100,\
-1,0x29,-2,20,\
-3

$ sudo modprobe fbtft_device name=flexpfb rotate=90 \
gpios=reset:4,dc:3,wr:7,cs:2,db00:5,db01:6,db02:13,db03:19,db04:26,db05:12,db06:16,db07:20

$ fbset -i -fb /dev/fb1

mode "240x320"
    geometry 240 320 240 320 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        : flexfb
    Address     : 0
    Size        : 153600
    Type        : PACKED PIXELS
    Visual      : TRUECOLOR
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 480
    Accelerator : No

$ con2fbmap 1 1



続く...