Raspberry Pi Advent Calendar 2020の22日目です。19日目はまめもさんの自作ファンコントローラー、20日目はつぼさんのネットワーク遅延装置づくり、21日目はgyaboさんでPi 4のベアメタル環境で V3Dレジスタにアクセスするまでのお話でした。
今日からはまた私のターン!今日は18日に1.3インチLCDでfbtftができるできないを追記でごっちゃにしたので整理していきます。
できました
まず、18日目の記事ではfbtftがカーネル5.xに上がったと同時に動いてたものが動かなくなったりなんだりしていて情報が錯綜していると書きましたが、なんとか1.3インチLCD(ST7789v)でも動作させられるようになりました。表示させられるようになって満足した!
やりかた
基本的にはPimoroniのフォーラムで書かれている方の手順でOKです。
以下から最新のdtsをダウンロードします(フォーラムでは直接Rawのリンクになってますが、元のページ見れたほうがいい場合もあるよね)。
device tree overlay to use pidi with fbtft driver for rpi 2 B · GitHub
$ wget https://gist.githubusercontent.com/hgroll/2731ae6d05350df663b123615f765bf5/raw/f8fe3829136296c20ba670dcd572e8a5c60da995/pidi-overlay.dts
dtsをダウンロードしたらエディターで開いて、regの行を0から1に書き換えます。regは何かというと、Chip Selectの値が当てはまるらしく、CE0(BCM8)なら0、CE1(BCM7)なら1となるようです。Pimoroniの1.3インチLCDは、Breakout Garden向けモジュールも、PirateAudioもCE1が使われていたため、regが0では動作しなかったというわけでした。
(参考) Raspberry Pi - SPI device tree changes - Stack Overflow
reg = <0>; ↓ reg = <1>;
また、バックライトの設定がなぜか反対?になっていて消灯してしまっていたので、1から0に書き換えてみたところ点灯しました。13の値はPirateAudioの場合のバックライトLED用ピン番号で、ブレイクアウトのときは19になります。もしかするとconfig.txtの方で上書きできるかもしれないですが、やり方は不明なので必要に応じてここを書き換えてしまうのも手です。
led-gpios = <&gpio 13 1>; ↓ led-gpios = <&gpio 13 0>;
書き換えたらdtcコマンドでdtsをコンパイルします。
$ sudo dtc -@ -I dts -O dtb -o /boot/overlays/pidi.dtbo pidi-overlay.dts
/boot/config.txtにpidiを読み込む設定を追記します。
dtoverlay=pidi
/boot/cmdline.txtにコンソール向け設定を追記します。rootwaitのあとにスペースを入れてから続けて追記します。
fbcon=map:10 fbcon=font:VGA8x16
コンソールセットアップで、コンソールの文字サイズの設定を変更します。
$ sudo dpkg-reconfigure console-setup 以下の通り選択する コンソールで使うエンコーディング: UTF-8 コンソールフォントとしてサポートすべき文字セット: 最適な文字セットを指定してください コンソールのフォント: システムに適当なフォントを選ばせる フォントのサイズ: 8x16
あとはSPIの有効化も忘れずにやります。
$ sudo raspi-config nonint do_spi 0
ここまでできたら再起動して、1.3インチLCDにコンソールが出ることを確認します。
GUIも出したいときは
小さくてあまり使い物になりませんがfbcpを使えばGUIも出ます。
インストールは略しますが、手順通り設定すればデスクトップが映るようになります。ただ、解像度の設定次第では何がなんだかわからない感じになるので、VGAくらいに設定しておくと良いかもしれません。
また、Pimoroniのフォーラムやdtsファイルのコメントにも書かれているとおり、結構ちらつきが激しいです。dtsのinitパラメーターをいじっらた改善できるんかしら?
まとめ
Pimoroni製品についてる1.3インチ240x240LCDを最近(Linux Kernel 5.4くらい)のRaspberry Piでfbtftとして使う手順でした。
映るには映ったんですが、まあ文字が小さくて読み安くはないので、IPアドレスを読み取るとか、CM4でカーネルクラッシュしたときの表示を軽く拾う(拾えるのか?)とか、そんくらいの用途になりそうです。