みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

ConnectCore i.MX6UL スターターキット: PiTFT3.5を動かす

ConnectCore i.MX6ULスターターキットの続き

その1 その2 その3 その4 その5

PiTFT3.5

PiTFT3.5をccimx6ul starterのラズベリーパイ互換ピンヘッダに実装して動かしてみる。

meta-pitft35-digiの使用

ccimx6ul starterでPiTFT3.5を使用できるようにするためにmeta-pitft35-digiを作成した。

環境の設定

次の要領でmeta-pitft35-digiをダウンロードし、ビルド対象に追加する。

$ cd ~/yocto/dey-2.0/sources
$ git clone https://github.com/mickey-happygolucky/meta-pitft35-digi.git
$ cd ~/yocto/dey-2.0/build
$ source dey-setup-environment
$ bitbake-layers add-layer ../sources/meta-pitft35-digi

bitbakeの実行

今回はGUIのイメージを作成する。

$ bitbake dey-image-qt

イメージのインストール

生成されたOSイメージのインストールはその2その3のいずれかの手順を実施する。

実行画面

電源を投入すると、次のような画面が表示される。

f:id:mickey_happygolucky:20170130022625j:plain

次に、satoのデスクトップが使用できるようになる。

f:id:mickey_happygolucky:20170130022632j:plain

バイスの構成

PiTFT3.5は主に2つの機能から構成されている。

機能 関連IC ドライバ 接続方式
TFT液晶 HX8357D drivers/staging/fbtft/fb_hx8357d.c SPI(SS0)
タッチパネル STMPE610 drivers/mfd/stmpe.c SPI(SS1)

i.MX6ULとの関係は次のようになっている。

f:id:mickey_happygolucky:20170130022723p:plain

タッチパネルを使用するためにはSS1(Slave Select/Chip Select)がRPiコネクタに接続される必要がある。 ラズベリーパイでは26ピン(GPIO7)がSPI0_CE1_Nに切り替えられるため、LCDとタッチパネルを同時に使用することができた。 しかし、ccimx6ul startterのRPiコネクタの26ピンはLCD_DATA9と接続されている。 このピンにはeCSI_SS1の機能は割り当てられていないため、SPIのChip SelectをGPIOで出力する方法がないかを確認する。

 imx6ul-ccimx6ul {
        pinctrl_ecspi3: ecspi3grp {
            fsl,pins = <
                MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK    0x10b0
                MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI  0x10b0
                MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO  0x10b0
                MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x10b0 /* Chip Select */
            >;
        };

SS0のピンのPINMUXを設定しているのはMX6UL_PAD_UART2_TX_DATA__GPIO1_IO20となる。 しかし、このピンはGPIO1_IO20に設定されている。 つまりSS0の信号を出力するためにSS0のピンファンクションではなくGPIOを使用していることになる。

つまり、SS1の機能がないピンでSS1の出力ができる可能性がある。

HX8357Dドライバ

まずはLCDの部分を使用できるようにする。 ドライバをバックポートしたあとは、デバイスツリーを修正する。

 pitft: pitft@0{
                compatible = "himax,hx8357d";
                reg = <0>;
                pinctrl-names = "default";
                pinctrl-0 = <&pitft_pins>;
                
                spi-max-frequency = <32000000>;
                rotate = <90>;
                fps = <25>;
                bgr;
                buswidth = <8>;
                dc-gpios = <&gpio 25 0>;
                debug = <0>;
        };

dc-gpiosはD/C(Data/Command)ピンのこと。ラズベリーパイではGPIO_IO25(22ピン)に接続されている。 ccimx6ul startterのRPiコネクタの22ピンはLCD_DATA8と接続されている。 pinmuxの設定を下記のように追加して、GPIOとして使用できるようにする。

     pinctrl_pitft: pitftgrp {
            fsl,pins = <
                MX6UL_PAD_LCD_DATA08__GPIO3_IO13    0x10b0 /* D/C */
            >;
        };

LCD_DATA8のピンにははGPIO3_IO13が割り当てられている。そして、dc-gpiosにGPIO3_IO13を割り当てる。

                dc-gpios = <&gpio3 13 0>;

STMPE610

ドライバを有効化する。

CONFIG_STMPE_SPI=y
CONFIG_TOUCHSCREEN_STMPE=y

まずはSS1の接続を考える。 LCDの表示ができていることからSS0のGPIO出力は問題ない。

そこで、SS1が接続されているピン(LCD_DATA9)をGPIO(GPIO3_IO14)に割りあてる。

/* ECSPI3 (Raspberry PI Expansion header) */
&ecspi3 {
    fsl,spi-num-chipselects = <2>;
    cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW
            &gpio3 14 GPIO_ACTIVE_LOW>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_ecspi3>;
    status = "disabled";
};

...(snip)...

        pinctrl_ecspi3: ecspi3grp {
            fsl,pins = <
                MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK    0x10b0
                MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI  0x10b0
                MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO  0x10b0
                MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x10b0 /* Chip Select0 */
                MX6UL_PAD_LCD_DATA09__GPIO3_IO14    0x10b0 /* Chip Select1 */
            >;
        };

また、STMPE620の割り込みには、ラズベリーパイの18ピン(GPIO24)が接続されているため、 ccimx6ul startterのRPiコネクタの18ピンをGPIO(GPIO3_IO12)に割り当てる。

まとめ

ラズベリーパイ互換ピンヘッダにラズベリーパイ用のデバイスを接続して使用できることがわかった。 SPIのChipEnableが1つしかピンに出せなかったが、LinuxのドライバがChipEnableをGPIOに割り振れるような作りになっていたため、 無事、タッチパネルまで動作することができた。