Raspberry Pi Advent Calendar 2020の18日目です。
今日はいよいよCM4から脱して、こないだ買った240px四方の1.3インチLCDで遊ぼうと思います。
(追記)追記を繰り返したのでTwitterのような動くまでの過程をお楽しみいただける長編になっていますがご容赦ください。
こないだの
12日目に書いた記事でちらっと書いてたやつです。
Breakout Gardenに差し込める240px四方の1.3インチIPS LCDモジュールです。
1.3" SPI Colour LCD (240x240) Breakout – Pimoroni
写真の右側がモジュールです。なお、このディスプレイはPirate Audioシリーズでも使われています。
Pythonで使う
これは非常にかんたんで、ここにPimoroniのPythonライブラリが存在するので、適当にインストールしてサンプルを動かすと動きます。
これは画像を動かすサンプルで、サンプル画像を表示したなんのひねりもない写真です。
コンソール画面とかでたら便利じゃね、と思って調べたら闇を見た
そう思って調べ始めたら、fbtftとかなんとかが色々でてきて、そういえば昔PiTFTあたりでやってたかな?こう言うの、というところまでは思い出したのですが、どうも今年の途中でLinuxカーネルが5.4に切り替わったあたりでfbtft周りがまともに動かなくなる事象が起きているようです。ディスプレイ系モジュールを販売しているところが順次対応を進めているっぽいですが、わりと最近でも動く動かないをギャーギャーやっているっぽく、これは難易度が高そうです。
いくつか調べると、DeviceTreeをいい感じに差し替えると動いたという話を数件見かけましたが、どちらを試しても私の環境では動かず、みんなどうやって動かしてるんでしょ?状態です。DeviceTreeはなんもわからぬ……。
PirateAudioのディスプレイ部分でやろうとしている人の書き込みは、4.9系で動かせとのこと。いやさすがになあ。うかつにapt upgradeしたらしんじゃうし。
Raspberry Piのフォーラムでは2件ほどヒットしたもののこれでも動かず。DRAgon715205という人がここ数日チャレンジしているっぽいのですが、めちゃくちゃマルチポストしていて中の人にたしなめられています……。fbtftのIssueにもいました。気持ちはわかる。
replacement for fbtft "init=" section in 5.4+? - Raspberry Pi Forums
1.54LCD ST7789v fbtft display at kernel 5.4 - Raspberry Pi Forums
Raspberry Piのフォーラムの方はピンアサインがPiTFT向けになっているので、適宜差し替えはしてみましたが、dmesgで見るとなんか初期化に失敗しているのでダメそうでした。Pimoroni方はfb0として見えて入るようですが、画面にはなにもでず。
[ 5.507913] fbtft: module is from the staging directory, the quality is unknown, you have been warned. [ 5.511267] fb_st7789v: module is from the staging directory, the quality is unknown, you have been warned. [ 5.512061] fbtft_of_value: height = 240 [ 5.512079] fbtft_of_value: regwidth = 8 [ 5.512096] fbtft_of_value: buswidth = 8 [ 5.512118] fbtft_of_value: debug = 0 [ 5.512134] fbtft_of_value: rotate = 0 [ 5.512153] fbtft_of_value: fps = 25 [ 5.512169] fbtft_of_value: txbuflen = 32768 [ 5.868243] Console: switching to colour frame buffer device 30x30 [ 5.868931] graphics fb0: fb_st7789v frame buffer, 240x240, 112 KiB video memory, 32 KiB buffer memory, fps=25, spi0.0 at 40 MHz
fbiコマンドと言うので画像を直接表示するという方法があったので、試してみましたが特にでず。
07. ラズパイでフレームバッファ #1 :: bitset
pi@usbpi:~ $ sudo LANG=C fbi -d /dev/fb0 -T 1 -a --noverbose --noedit st7789-python/examples/cat.jpg
ソースコードになにか問題がある可能性はあるのかも?
Adafruitのドライバーに頼ってみる
Adafruitが同じディスプレイモジュールを使ったアイテムを売っており、どうもこちらは対応が進んでいるようなので、この辺のコードをベースに移植するのが近そうです。
リポジトリはこの辺に。
AfafruitはDC=25,LED=26で、PimoroniはDC=9,LED=13らしいので、DeviceTreeのdtsを書き換えてコンパイルして挑戦。しかし、なんかGPIO9がもう使われているどうとかで怒られる始末。
$dmesg|less [ 5.426689] fb_st7789v: loading out-of-tree module taints kernel. [ 5.427474] pinctrl-bcm2835 fe200000.gpio: pin gpio9 already requested by fe204000.spi; cannot claim for spi0.0 [ 5.427493] pinctrl-bcm2835 fe200000.gpio: pin-9 (spi0.0) status -22 [ 5.427512] pinctrl-bcm2835 fe200000.gpio: could not request pin 9 (gpio9) from group gpio9 on device pinctrl-bcm2835 [ 5.427529] fb_st7789v spi0.0: Error applying setting, reverse things back [ 5.427573] fb_st7789v: probe of spi0.0 failed with error -22
Pimoroniのdtsを眺めていて気づきました。もしかしてfragment@3のこれがpin gpio9 already requestedを回避するやつかな?
fragment@3 { target = <&spi0_pins>; __overlay__ { brcm,pins = <10 11>; /* exclude BCM 9 from SPI to use it as DC in fbtft driver */ brcm,function = <4>; /* alt 0 */ }; };
あたりでした。
[ 5.489767] fb_st7789v: loading out-of-tree module taints kernel. [ 5.490621] fbtft_of_value: width = 240 [ 5.490639] fbtft_of_value: height = 240 [ 5.490659] fbtft_of_value: buswidth = 8 [ 5.490681] fbtft_of_value: debug = 0 [ 5.490697] fbtft_of_value: rotate = 0 [ 5.492732] ST7789 adafruit fbtft driver [ 5.492747] Size: (240, 240) [ 5.664195] Rotation 0 offsets 0 0 [ 5.742520] Console: switching to colour frame buffer device 30x30 [ 5.743203] graphics fb0: fb_st7789v frame buffer, 240x240, 112 KiB video memory, 4 KiB buffer memory, fps=20, spi0.0 at 32 MHz
しかしコンソールは表示されず。うーむ!
まとまらない
アレな時期にちっさいディスプレイでコンソールをやりたいと思ってしまったようで、大敗北しました。もしこれやったらうまくいくで、という情報があったらぜひお願いしたいです。ツイッターのエゴサはしています。
たまには動かない記事でも……いっか!(適当)
(追記1)バックライトはピンアサインが違う
これはメモですが、バックライトのGPIOピンアサインは、BreakoutGardenとPirateAudioで違いました。BreakoutGardenは場所によってBCM18かBCM19、PirateAudioは上にあるとおりBCM13です。多分ここができてもコンソールがでないところは変わらないですが……。
Breakout Garden for Raspberry Pi (I2C + SPI) – Pimoroni
小さい方はBCM19。
https://shop.pimoroni.com/products/breakout-garden-mini-i2c-spi
なんか他のピンアサインもちょっと違ったりしていないか気になってきたのでもっとコードを読まないとダメそうです。
(追記2)動いた!!
他のピンアサインもちょっと違ったりして
特にCSがPimoroniではCE1(BCM7)を使っているのが気になっていて、パラメータを探っていたのですが、StackOverflowにヒント発見。
Raspberry Pi - SPI device tree changes - Stack Overflow
regがCS(CE)の値だったのかよ!
reg = <0>; /* CE0 */ (略) reg = <1>; /* CE1 */
というわけでregの値を1にした結果、動いた!!
そうすると、おそらく冒頭のPimoroniのフォーラムにあったDeviceTreeのソースも、regを書き換えたら動きそうな気配です。そのあたりの検証とか、状況を整理して、22日あたりのAdvent Calendarでまとめていきましょう。