2021年1月8日金曜日

NanoPi NEOにSPI LCD - TinyDRM

  ここのところ、GPSや多軸加速度センサを使った工作をarduinoでやったりしていたのですが、あるデバイスをコントロールするための、CUIあるいはGUI付きの箱を一つ作る必要がありそうで、以前このblogにも書いた、NanoPi NEO + LCDで構成することを考えました。

以前の記事、もう2年以上前になっているわけですが、当時はLinux4系列で、fbtftを使っていました。その時でもfbtftはstagingで、すでにtinydrmの紹介はされていましたが、多くの情報があるfbtftをそのまま使い、そのメモ書きを残していたわけです。

いま、armbianはLinux5.9、TinyDRMを使わなければなりません。

fbtftでは、fbtft_deviceを呼ぶ際に、使用するgpio端子を記述でき、initコードもquick hack的に試すことができました。TinyDRMではdevice treeを作成する必要がありますし、使用できるコントローラも限られそうです。initコードを変更する必要があった場合には、ドライバを変更しないとならないようです。手元には、いずれもaitendoで入手したものですが、SPIを使用するQVGA LCD、コントローラがili9328のもの、ili9341のものがあり、ドライバの観点では、ili9341なら容易に動かせるかもしれません。(スタンドアロンでili9328を動かすコードを公開されているかたが居られるので、それを参考に、notroさんが公開しているili9325用のドライバを修正できるかもしれませんが、将来…。)

 ということで始めてはみたものの。

Device treeのドキュメントは存在してはいるようですが、汎用的なため、体系的理解が進めば良いのかもしれませんが、LCDを動かすためにはちょっとだいぶ重荷だったので、世間の皆様に頼ることにしました。

試行錯誤の結果、次のようなdevice treeを作成: 

/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun8i-h3";

        fragment@0 {
                target = <&spi0>;
                __overlay__ {
                        status = "okay";
                        spidev@0{
                                status = "disabled";
                        };
                };
        };

        fragment@1 {
                target = <&pio>;
                __overlay__ {
                        M028C9341SD_pins: M028C9341SD_pins {
                                pins = "PG9", "PA1";
                                function = "gpio_out";
                        };
                };
        };

        fragment@2 {
                target = <&spi0>;
                __overlay__ {
                        /* needed to avoid dtc warning */
                        #address-cells = <1>;
                        #size-cells = <0>;

                        M028C9341SD: M028C9341@0{
                                compatible = "mi,mi0283qt";
                                /* compatible = "ilitek,ili9341"; */
                                reg = <0>;

                                spi-max-frequency = <32000000>;
                                spi-cpol;
                                spi-cpha;
                                buswidth = <8>;
                                rotation = <0>;
                                reset-gpios = <&pio 0 201 0>; /* PG9 */
                                dc-gpios = <&pio 0 1 0>;    /* PA1 */
                        };
                };
        };
};

相手はNanoPi NEOなのでSPI0、それにD/C(RS)と、resetで使用するピン、それぞれPA1とPG9を使っていますが、それを宣言してやります。

これを適当な名前でsaveして、armbian-add-overlayし、rebootすると、TinyDRM関連ドライバおよびmi0283qtがロードされ、コンソールとしてブートメッセージが流れてくれるのを見たときには、ちょっと感動しました(笑)。

SPIを使用するLCDなら、それに合ったドライバを指定し直すことで、上記の構造はそのまま使えるはずです。このLCDモジュールにはSDカードコネクタもあるので、SPIモードであれば動かすことができると思いますし、もし、タッチパネル付きのものの場合は、それに応じた追加指定が必要です。NanoPiNEOの場合SPIは1ポートしかなく、armbian-configを使ってSPI1用のCSを追加してやれば、SPIの仕様的にはそれら更なるデバイスの追加は可能なように思えますが、LCDのパフォーマンス的にどうなのかな?とは思うところです。

 

さて、これを元に、 「箱」に仕立てる算段をすることにしましょう。キー入力とかどうしようかな…。

0 件のコメント:

コメントを投稿