SPI接続の小型カラーTFTディスプレイst7735を接続し、Armbian上のPythonで使う方法を前回記事で取り上げた。
今回はこれ以外の方法として、デバイスツリーオーバーレイの仕組みでLinuxカーネルドライバを使う方法を試し、記事にまとめる。
デバイスツリーオーバーレイについて
デバイスツリーオーバーレイの仕組みを使うと、カスタムカーネルを作らずにカーネルドライバを利用出来る。デバイスツリーオーバーレイについての概要は、以下の別記事を参照。この記事ではデバイスツリーオーバーレイを使ってI2Cデバイスをカーネルドライバで実際に動かした。
小型TFTディスプレイとNano Pi Neoを接続する
Pythonで動かした時と全く同じだが、再掲。SPIの他にGPIOへの配線が必要。ST7735側のDCピン・RESETピンをNano Pi Neo側のGPIOピンA0・A1にそれぞれ接続した。
ST7735 | Nano Pi Neoピン番号 | 備考 |
---|---|---|
DC(A0) | 11 | GPIOA0(PA0) |
Vcc | 17 | 3.3V |
SDA | 19 | SPI0_MOSI |
GND | 20 | GND |
RESET | 22 | GPIOA1(PA1) |
SCK | 23 | SPI0_CLK |
CS | 24 | SPI0_CS |
LED | – | 150Ωを介して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のユーザーガイドページに記載がある。
コンパイルして所定ディレクトリに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キーボードを挿してユーザー名とパスワードを打てばログインは出来る。
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で閉じてしまうのはデメリットとも言えるので、用途に応じて使い分けたいところだ。
コメント