やりたいこと
ちょっとしたサイネージのように延々と動画を流していたい。
あるいは、監視カメラの映像をRTSPで取得して、それを小型モニタに映しておきたい。
みたいなこと。
そして、普通にコーンソールを表示してキーボードを繋げてメンテナンスできるようにしたい。
結果できたものはこんな感じで、狭いけど普通のモニタ的に使える。

(1)でやったこととの違い
(1)ではSPIを直接叩いてた。なので速い。
速いんだけど、コンソール表示はできないし、映像を映すにもちょっと面倒くさい。ちょっとだけ。
で、結局、「別に直接叩くほど速度求めてないじゃん、俺…」となってこの(2)のやり方に落ち着いたw
てことで、SPI を直接叩くのはこっち。

用意したもの
NanoPi NEO
3.2 インチ LCD:ILI9341 SPI接続 320×240
配線
SPI:4本 その他制御用:2本 電源:2本 LEDバックライト:1本
とりあえず、この9本配線されてればOK(削ろうと思えば削れるけど…)
そして、DC と RESET がクロスしてるのは謎…
いや、RESET を一番若い番号にしておきたかった、という思いがあっただけで、今にして思えばどっちでもいいじゃん…という感じなので、これは敢えてクロスさせる必要はない。
が、まっすぐに繋げたなら、Python 側もそれぞれに指示しているピン番号を入れ替えるのを忘れないように。

NanoPi NEO の準備
Device Tree Overlay という仕組みを利用して液晶モニタを Linux (Armbian) に認識させるためのファイルを作っていく。
まずは適当なフォルダに ili9341_overlay.dts というファイルを内容を下記のようにして作る。
(ファイル名は別にテキトーでOK。わかりやすい名前で)
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun8i-h3";
fragment@0 {
target = <&spi0>;
__overlay__ {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
ili9341@0 {
compatible = "ilitek,ili9341";
reg = <0>;
spi-max-frequency = <32000000>;
rotate = <90>;
fps = <30>;
buswidth = <8>;
bgr;
/* NanoPi NEOのピン指定 */
reset-gpios = <&pio 6 8 1>; /* GPIOG8 (物理16番) */
dc-gpios = <&pio 6 9 0>; /* GPIOG9 (物理18番) */
};
};
};
};
作ったファイルに対して以下のコマンドを実行する。
$ sudo armbian-add-overlay ili9341-overlay.dts
Compiling the overlay
Copying the compiled overlay file to /boot/overlay-user/
Overlay ili9341-overlay was already added to /boot/armbianEnv.txt, skipping
Reboot is required to apply the changes
そうすると、/boot/overlay-user 内に ili9341-overlay.dtbo というファイルが出来上がる。
同時に、/boot/armbianEnv.txt に user_overlays=ili9341-overlay という一行が加えられている。
ついでなので、この /boot/armbianEnv.txt には以下を手動で追記しておく。
extraargs=fbcon=map:0 console=tty1
これを書いておくことで、Linux が起動するときにズラズラと流れる文字列が表示されるようになる。
冒頭の画像のようなやつね。
また、起動後、「login:」という表示を出して、ちゃんとコンソールとして使えるようにするには下記を実行しておく。
$ sudo systemctl enable getty@tty1.service
$ sudo systemctl start getty@tty1.service
これであとは sudo reboot すれば見慣れが画像がかなり窮屈だけど、3.2インチの液晶モニタに表示される。
動けばそれでいい…けど、いろいろ確認するためのコマンドをメモ
上記手順で液晶モニタを使えるようにすると「フレームバッファ」というものを利用することになる。
なので…
$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0 6月 26 02:58 /dev/fb0
と言った感じで、fb0 とか場合によっては fb1 と言った感じでその存在を確認できる。
また、lsmod コマンドでもちゃんと液晶モニタが認識されているかを調べられる。
$ lsmod | grep ili9341
fb_ili9341 12288 0
fbtft 32768 2 fb_ili9341
この2つが出ていればOK
さらに fbset というコマンドもあるけど、NanoPi NEO の Armbian だと、たぶんインストールされていないので、まずはインストール。
$ sudo apt install fbset
その後、下記のように実行すると、もう少し詳細な情報を見ることができる。
$ fbset -i -fb /dev/fb0
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 : fb_ili9341
Address : 0
Size : 153600
Type : PACKED PIXELS
Visual : TRUECOLOR
XPanStep : 0
YPanStep : 0
YWrapStep : 0
LineLength : 640
Accelerator : No
しっかし、何をどうやっても SPI と I2C を同時に有効にできん…
今回、/boot/armbianEnv.txt を極力シンプルに下記のようにしてみたけど、それでもダメだった…
verbosity=1
bootlogo=false
console=serial
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
overlay=i2c0
rootdev=UUID=e5206990-8683-4f21-9742-83bbe586c250
rootfstype=ext4
user_overlays=ili9341-overlay
extraargs=fbcon=map:0 console=tty1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
I2C が有効になった瞬間に SPI の MOSI が死ぬんだよなぁ…
user_overlays で SPI が I2C が有効になった後になればもしかしたら…と思ったけどダメだった…w
この記事にコメントしてみる