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のいずれかの手順を実施する。
実行画面
電源を投入すると、次のような画面が表示される。
次に、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に割り振れるような作りになっていたため、
無事、タッチパネルまで動作することができた。