ConnectCore i.MX6ULスターターキットの続き
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のいずれかの手順を実施する。
実行画面
電源を投入すると、次のような画面が表示される。
次に、satoのデスクトップが使用できるようになる。
デバイスの構成
PiTFT3.5は主に2つの機能から構成されている。
機能 | 関連IC | ドライバ | 接続方式 |
---|---|---|---|
TFT液晶 | HX8357D | drivers/staging/fbtft/fb_hx8357d.c | SPI(SS0) |
タッチパネル | STMPE610 | drivers/mfd/stmpe.c | SPI(SS1) |
i.MX6ULとの関係は次のようになっている。
タッチパネルを使用するためには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に割り振れるような作りになっていたため、 無事、タッチパネルまで動作することができた。