ArmbianのLinuxカーネルドライバで小型TFTディスプレイを動かす

SPI接続の小型カラーTFTディスプレイst7735を接続し、Armbian上のPythonで使う方法を前回記事で取り上げた。

今回はこれ以外の方法として、デバイスツリーオーバーレイの仕組みでLinuxカーネルドライバを使う方法を試し、記事にまとめる。

スポンサーリンク

デバイスツリーオーバーレイについて

デバイスツリーオーバーレイの仕組みを使うと、カスタムカーネルを作らずにカーネルドライバを利用出来る。デバイスツリーオーバーレイについての概要は、以下の別記事を参照。この記事ではデバイスツリーオーバーレイを使ってI2Cデバイスをカーネルドライバで実際に動かした。

小型TFTディスプレイとNano Pi Neoを接続する

Pythonで動かした時と全く同じだが、再掲。SPIの他にGPIOへの配線が必要。ST7735側のDCピン・RESETピンをNano Pi Neo側のGPIOピンA0・A1にそれぞれ接続した。

ST7735Nano Pi Neoピン番号備考
DC(A0)11GPIOA0(PA0)
Vcc173.3V
SDA19SPI0_MOSI
GND20GND
RESET22GPIOA1(PA1)
SCK23SPI0_CLK
CS24SPI0_CS
LED150Ωを介して3.3Vへ

デバイスツリー上のspiバスのラベルを確認

Armbian上のNano Pi Neo2のSPIバス定義自体がデバイスツリーオーバーレイで定義されており、/boot/dtb/allwinner/overlay/sun50i-a64-spi-spidev.dtboにバイナリファイルが置かれている。これを逆コンパイルすると、SPIバスのラベル名は”spi0″と確認出来る。

$ dtc -I dtb -O dts /boot/dtb/allwinner/overlay/sun50i-a64-spi-spidev.dtbo
/dts-v1/;

/ {
    compatible = "allwinner,sun50i-a64";

    fragment@0 {
        target-path = "/aliases";

        __overlay__ {
            spi0 = "/soc/spi@1c68000";
            spi1 = "/soc/spi@1c69000";
        };
    };
:

オーバーレイするdtsファイルを作成する

spi0への子ノードとして以下のように定義する。

/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;

            st7735r: st7735r@0{
                compatible = "sitronix,st7735r";
                reg = <0>;
                status = "okay";
                spi-max-frequency = <10000000>;
                rotate = <90>;
                bgr;
                fps = <30>;
                buswidth = <8>;
                reset-gpios = <&pio 0 1 1>;
                dc-gpios = <&pio 0 0 0>;
                width = <128>;
                height = <128>;
                debug = <0>;
            };
        };
    };
};

ドライバ指定

作ったDTSファイルの12行目で指定しているのがカーネルドライバの識別子だ。

compatible = "sitronix,st7735r";

詳細は割愛するが、”sitronix,st7735r”を他の物に変えると別のディスプレイを動かすことが出来る。

GPIO指定の記述方法

21,22行目は、DCピン・RESETピンの接続先GPIOピンとしてA0・A1を指定している。
GPIOはピンコントローラー(&pioで参照している)の管轄で、ここの記述方法はプラットフォーム依存。Allwinner製SoCの場合は、

<&pio グループ番号 通し番号 信号モード>

の書式で記述される。グループ番号は通常A,B,Cで記述されるが、DTSファイルの記述ではアルファベットは用いず、A→0、B→1、C→2…のように番号で記述する。つまり20,21行目の記述を解読すると、

  • &pio 0 1 1 → A0, アクティブLow
  • &pio 0 0 0 → A1, アクティブHigh

という事になる。

デバッグメッセージを出力させる方法

24行目のdebugへの指定は通常0を指定するが、番号を増やすとドライバからデバッグメッセージを出力出来る。設定がうまく行かない時などは、以下のように数字を増やすとメッセージの情報量が増えるので設定の参考に出来るだろう。

debug = <5>

デバイスツリーオーバーレイの有効化

作ったDTSファイルを有効化する方法は、Armbianのユーザーガイドページに記載がある。

Device Tree overlays - Armbian Documentation

コンパイルして所定ディレクトリにdtboファイルを配置

ユーザー定義のdtboファイルは/boot/overlay-user/に置く決まりになっている。dtcのコンパイル出力先を/boot/overlay-user/下に指定して実行。

sudo mkdir /boot/overlay-user
sudo dtc -I dts -O dtb -o /boot/overlay-user/st7735tftfb.dtbo st7735tftfb.dts

有効化

u-boot環境変数ファイル/boot/armbianEnv.txtに以下の一行を追加する。

user_overlays=st7735tftfb

極小コンソール画面が出現!

上記変更を行いシステムを再起動すると、ST7735ディスプレイにログイン画面が表示され、極小コンソールとして使える。画面が小さすぎてあまり実用的ではないが、Nano Pi NeoにUSBキーボードを挿してユーザー名とパスワードを打てばログインは出来る。

TinyConsole

JPEG画像を表示してみる

フレームバッファ関連のコマンドをインストール。

sudo apt install fbset fbi

fbsetで解像度などを確認。

  • ST7735
$ fbset

mode "128x128"
    geometry 128 128 128 128 16
    timings 0 0 0 0 0 0 0
    nonstd 1
    rgba 5/11,6/5,5/0,0/0
endmode

極小コンソールからログインして以下のコマンドを実行すると、JPEG画像が表示出来る。

fbi -d /dev/fb0 -T 1 -a --noverbose fuji0.jpg 
写真

SSHからリモートでログインしている時に上記コマンドを実行しようとすると、ttyのパーミッションが無いと怒られる。リモートの場合は以下を実行で同じ事が出来る。

sudo fbi -d /dev/fb0 -T 1 -a --noverbose fuji0.jpg 

まとめ

デバイスツリーオーバーレイの仕組みを使って、小型TFTディスプレイのフレームバッファドライバを使う方法を試してみた。配線ミスをしたり設定ファイルの記述を間違えると全く動いてくれないし、設定変更後は再起動しないとデバイスツリーに反映出来ないのでデバッグが少々面倒なのが難点。

とはいえ一度設定が済んでしまえば、デバイス/dev/fb0として普通のフレームバッファデバイスとして取り扱う事が出来、一般的なLinuxツールが使えるようになるのは大きなメリットじゃないかと思う。前回記事で取り上げたPythonドライバを使う方法は手軽な一方、Pythonで閉じてしまうのはデメリットとも言えるので、用途に応じて使い分けたいところだ。

コメント