ILI9341(SPI)をOrangePiのコンソールとして使う


前回、ILI9341の2.4インチTFT/2.8インチ SPI-TFT を、 RaspberryPiのコンソールとして使う手順を紹介しました。
今回はOrangePi(Armbian)のコンソールとして使う手順を紹介します。
但し、ArmbianのSPIドライバーには不具合があるようで、長時間(3時間程度)連続して使うとカーネルがクラッシュします。
今のところ解決策は見つかっていません。





まずはお試しで、コンソールとして使えるかどうか試してみます。
OrangePiとTFTの結線は、以下の様になります。
Raspberryと同じピン番号ですが、GPIOの番号が変わります。
ILI9341 TFT Opi(Pin#)
MISO N/C
LED 3.3V(※1)
SCK SCLK(23)
MOSI MOSI(19)
D/C GPIO12(03)(※2)
RES GPIO11(05)(※2)
CS CS0(24)
GND GND
VCC 3.3V

(※1)バックライトが明るすぎるときは100Ω程度の抵抗を挟んで下さい
(※2)このピンは変更できますが、変更した場合、モジュールロード時に指定するgpiosパラメータが変わります。

最初に、fbtft_deviceモジュールを読み込みます。
D/CはGPIO12、RESETはGPIO11を使うので、[gpios=dc:12,reset:11]となります。(ここがキモです)
sudo modprobe fbtft_device name=flexfb gpios=dc:12,reset:11 speed=3200000

dmesgには以下のように表示されます。
[   39.678800] fbtft_device:  SPI devices registered:
[   39.678822] fbtft_device:      spidev spi0.0 33000kHz 8 bits mode=0x00
[   39.678833] fbtft_device:  'fb' Platform devices registered:
[   39.678905] fbtft_device: Deleting spi0.0
[   39.679366] fbtft_device:  GPIOS used by 'flexfb':
[   39.679378] fbtft_device:    'dc' = GPIO12
[   39.679387] fbtft_device:    'reset' = GPIO11
[   39.679395] fbtft_device:  SPI devices registered:
[   39.679405] fbtft_device:      flexfb spi0.0 3200kHz 8 bits mode=0x00

次に、flexfbモジュールを読み込みます。
この部分はRaspberryと同じです。
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

新しいデバイス[/dev/fb8]ができます。fbsetで内容を確認することができます。
orangepi@orangepipc:~$ ls /dev/fb*
/dev/fb0  /dev/fb2  /dev/fb4  /dev/fb6  /dev/fb8
/dev/fb1  /dev/fb3  /dev/fb5  /dev/fb7
orangepi@orangepipc:~$ fbset -i -fb /dev/fb8

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
orangepi@orangepipc:~$

最後に表示テストです。
con2fbmap 1 8

これでTFTがコンソールになります。

お試しでうまく動いたら、次は起動時にモジュールを読み込むことにします。
以下の2つのファイルを作ります。

@/etc/modules-load.d/fbtft.conf

flexfb
fbtft_device

flexfb と fbtft_device の順番は逆でも構いません。

A/etc/modprobe.d/fbtft.conf

options 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
options fbtft_device name=flexfb gpios=dc:12,reset:11 speed=3200000

Raspberryでは/boot/cmdline.txtの末尾に[fbcon=map:1]をすることで、
再起動時に自動的に FrameBuffferコンソールが有効になりますが
OrangePiではそのやり方がよく分かりません。

@/boot/armbianEnv.txt に設定する
https://kaspars.net/blog/linux/spi-display-orange-pi-zero

A/mnt/uEnv.txt に設定する
http://www.orangepi.org/Docs/Settingup.html

B/boot/boot.cmd に設定してコンパイルする
http://www.orangepi.org/Docs/Settingup.html

legacyカーネルの場合、/boot/boot.cmd に設定した後、コンパイルして/boot/boot.scr を作るみたいですが
/boot/boot.cmd にどのように記載すればいいのか、手掛かりが有りません。
今のところ、/etc/rc.local にcon2fbmap を登録して、しのいでいます。



縦画面への変更(gpiosの違いに注意)、フォントサイズの変更はRaspberryと全く同じ手順です。


MidnightCommanderもきれいに表示されました。






Orangepi ZEROを使う場合、注意が必要です。
ZEROのSPIはSPI1なので、以下の様にbusnum=1を指定する必要が有ります。
sudo modprobe fbtft_device name=flexfb gpios=dc:12,reset:11 speed=3200000 busnum=1



2回にわたりSPI-TFTをRaspberryPi/OrangePiのコンソールとして使う方法を紹介しました。
手順をまとめると以下の様になります。

・TFTモジュールに使われているコントローラチップを求める。
SPIのモジュールはそれほど多くないので、ググればわかると思います。

・TFTモジュールのピンアサインを確認する。
特にDCとRESETピンが重要です。
DCピンはCommandとDataを切り替えるピンですが、RSピンとかA0ピンと記載されている場合もあります。

・TFTモジュールの初期化シーケンスを求める。
初期化シーケンスについてはArduinoの事例がたくさん公開されています。

これらが分かれば(原則)どのようなSPI-TFTもFrameBufferコンソールとして使うことができます。
また縦画面/横画面を切り替えるには、初期化パラメータを一部変更する必要が有ります。
ここは、コントローラチップのデータシートと首っ引きになります。

次回はパラレル接続のTFTをFrameBufferコンソー ルとして使う手順を紹介します。