Armadilloフォーラム

500FXから610への置き換え_タッチスクリーン

haana

2023年8月10日 10時23分

お世話になります。
ホリウチと申します。

500FXのSPI接続によるタッチスクリーンの外部インタフェースはそのままに
610に置き換えたいのですが下記にて実現が可能でしょうか?
610はI2Cのコントローラのようですが500FXの様にSPIでIFしたいのです。
よろしくお願いいたします。

 -記-
・ソフト:X WINDOW,GTK+2.0
・接続図 500FX.JPGと610.JPG の2つを添付
・610は SPI2をアサイン、割り込み出力はGPIO04_IO28にアサイン
・タッチスクリーンの仕様書添付
                    以上

ファイル ファイルの説明
500fx.jpg 500FXの接続(動作確認済み)
610.jpg 610での接続_設計案
TCG057VGLBL-C00和文.pdf タッチスクリーンの仕様書
TSC2046.pdf タッチコントローラIC仕様書
コメント

at_ohsawa

2023年8月10日 13時57分

添付のデータシートにADS7846と互換とあるので、
ADS7846のデバイスドライバを使えばできそうですね。

kernel configとしてはCONFIG_TOUCHSCREEN_ADS7846
です。

ちなみに開発は既に進めて居る状態でしょうか?
Armadillo-600シリーズ向けにはDebianとArmadillo Base OSの二種のOS
提供しており、後者が最新ですが既にDebianで開発している場合は
kernelのバージョン等異なりますので、手順も違います。

haana

2023年8月10日 16時56分

ありがとうございます。
開発は進めている状態でkernelのバージョンは
linux-v4.14-at57 です。
ad7879-spi.cというドライバになりますでしょうか。
もう1つ下記の問題を抱えていまして、アドバイスをいただけたら幸甚に存じます。
ー記ー
640×480で作った画面が収まらずに困っています。
デバイスツリーでは以下の様に設定
front-porch:16
hback-porch:114
hsync-len:30
vback-porch:7
vfront-porch:35
vsync-len:3
★いろいろ数値を変えてみましたが変化がありません。

at_akihito.irie

2023年8月18日 18時59分

入江です。

> ad7879-spi.cというドライバになりますでしょうか。

いいえ。

ドライバのソースコードは
drivers/input/touchscreen/ads7846.c
デバイスツリーの書き方に関するドキュメントは
Documentation/devicetree/bindings/input/touchscreen/ads7846.txt
です。

タッチスクリーン対応のためにお客様が行うべきことは以下のとおりです。

1. デバイスツリーを正しく設定する
2. カーネルコンフィギュレーションを設定してads7846のドライバがカーネルに組み込まれるようにする
3. カーネル & dtbをビルドする
4. Armadillo-610にデバイスを接続、カーネルイメージとdtbを書き換え
5. 動作確認

1. デバイスツリーを正しく設定する

前述のデバイスツリーの書き方に関するドキュメントを参考に、dtsを作成してください。

2. カーネルコンフィギュレーションを設定してads7846のドライバがカーネルに組み込まれるようにする

menuconfigからカーネルコンフィギュレーションを変更します。

[ATDE]$ make ARCH=arm menuconfig

以下を有効化してSaveします。

Device Drivers
    Input device support --->  
        Touchscreens --->
            [*]   ADS7846/TSC2046/AD7873 and AD(S)7843 based touchscreens   <- これを有効化

3. カーネル & dtbをビルドする

[ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
[ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

4. と 5. の手順は割愛します。

> もう1つ下記の問題を抱えていまして、アドバイスをいただけたら幸甚に存じます。
> ー記ー
> 640×480で作った画面が収まらずに困っています。
> デバイスツリーでは以下の様に設定
> front-porch:16
> hback-porch:114
> hsync-len:30
> vback-porch:7
> vfront-porch:35
> vsync-len:3
> ★いろいろ数値を変えてみましたが変化がありません。

データシートと照らし合わせて確認したわけではないので、設定された値が正しいかはわかりかねます。
少なくとも、hactiveやvactive、clock-frequencyなどのパラメータが抜けているのが気になります。

display-timingについては、
Documentation/devicetree/bindings/display/panel/display-timing.txt
にドキュメントがありますので、そちらとLCDのデータシートを照らし合わせてパラメータを設定してみてください。

全体を通して不明点がございましたら、ご質問ください。

haana

2023年9月1日 11時42分

入江様
アドバイスありがとうございます。お手数にて恐縮ですが以下、どうか助けてください。
Device tree SPIインタフェースの定義記述が具体的によくわからないのでよろしくお願いします。
下記を *.dtsi ファイルの何処に追記すれば良いでしょうか?
&spi_controller { と書くのでしょうか?
また、interruptは【60番ピン_GPIO4_IO28に接続したい】のですが記述方法が良くわかりません。
よろしくお願いいたします。
--記--
spi_controller {
tsc2046@0 {
reg = <0>; /* CS0 */
compatible = "ti,tsc2046";
interrupt-parent = <&gpio4>;      【60番ピン_GPIO4_IO28に接続したい】
interrupts = <8 0>; /* BOOT6 / GPIO 8 */【60番ピン_GPIO4_IO28に接続したい】
spi-max-frequency = <1000000>;
pendown-gpio = <&gpio1 8 0>;      【60番ピン_GPIO4_IO28に接続したい】
vcc-supply = <&reg_vcc3>;

ti,x-min = /bits/ 16 <0>;
ti,x-max = /bits/ 16 <8000>;
ti,y-min = /bits/ 16 <0>;
ti,y-max = /bits/ 16 <4800>;
ti,x-plate-ohms = /bits/ 16 <40>;
ti,pressure-max = /bits/ 16 <255>;

wakeup-source;
};
};

以上 よろしくお願いいたします。

at_akihito.irie

2023年9月4日 16時18分

入江です。

> Device tree SPIインタフェースの定義記述が具体的によくわからないのでよろしくお願いします。

一例を示します。
以下の手順で生成されたdtbについて、当方では全く動作確認などをしておりません。ご了承ください。

まず、at-dtwebを使用してベースとなるdtsを生成します。
at-dtwebの使用方法については、以下を参照してください。
https://manual.atmark-techno.com/armadillo-610/armadillo-610_product_ma…

今回は例として、デバッグコンソール用にUART1(RXD/TXD)と、ECSPI2(SCLK/MOSI/MISO/SS0)のみ有効にして、Saveします。
ここはお客様のハードウェア構成に合わせて読み替えてください。

すると、linux-v4.14-at[version]/arch/arm/boot/dts/armadillo-610-expansion-interface.dtsi が生成されます。

armadillo-610-expansion-interface.dtsi の、

MX6UL_PAD_CSI_DATA07__GPIO4_IO28    0x400010b0 // CON2_60

の行を削除し、以下を追記してください。

	pinctrl_ecspi2: ecspi2grp {
		fsl,pins = <
			MX6UL_PAD_CSI_DATA02__ECSPI2_MOSI	0x1b0b0 // CON2_61
			MX6UL_PAD_CSI_DATA01__GPIO4_IO22	0x1b0b0 // CON2_62
			MX6UL_PAD_CSI_DATA03__ECSPI2_MISO	0x1b0b0 // CON2_63
			MX6UL_PAD_CSI_DATA00__ECSPI2_SCLK	0x1b0b0 // CON2_64
 
		>;
	};
 
	// 追記ここから
        pinctrl_tsc2046_pendown: tsc2046_pendown {
		fsl,pins = <
			MX6UL_PAD_CSI_DATA07__GPIO4_IO28    0x130b0 // CON2_60
		>;
	};
	// 追記ここまで
};

0x130b0 としている箇所は、割り込み用ピンのPAD設定です。
この例では適当な値にしているので、必ず以下のマニュアル及び i.MX 6ULL Applications Processor Reference Manual を一読の上、適切な値を設定してください。
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…

また、

&ecspi2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi2>;
	cs-gpios =
		<&gpio4 22 GPIO_ACTIVE_LOW>	// CS0
		;
	status = "okay";
	spidev2_0: spi@0 {
		compatible = "spidev";
		reg = <0>;
		spi-max-frequency = <5000000>;
	};
};

を、

&ecspi2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi2>;
	cs-gpios =
		<&gpio4 22 GPIO_ACTIVE_LOW>	// CS0
		;
	status = "okay";
	tsc2046@0 {
		reg = <0>;
		compatible = "ti,tsc2046";
		interrupt-parent = <&gpio4>;
		interrupts = <28 0>;
		spi-max-frequency = <1000000>;
		pinctrl-names ="default";
		pinctrl-0 = <&pinctrl_tsc2046_pendown>;
		pendown-gpio = <&gpio4 28 0>;
		ti,x-min = /bits/ 16 <0>;
		ti,x-max = /bits/ 16 <8000>;
		ti,y-min = /bits/ 16 <0>;
		ti,y-max = /bits/ 16 <4800>;
		ti,x-plate-ohms = /bits/ 16 <40>;
		ti,pressure-max = /bits/ 16 <255>;
		wakeup-source;
	};
};

のように編集してください。

その後、linux-v4.14-at[version]直下で以下のコマンドを実行することで、修正後のdtsから
armadillo-610-at-dtweb.dtbを生成できます。

[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-610-at-dtweb.dtb
[ATDE ~/linux-v4.14-at[version]]$ ls arch/arm/boot/dts/armadillo-610-at-dtweb.dtb
arch/arm/boot/dts/armadillo-610-at-dtweb.dtb

不明点等ございましたらご質問ください。

haana

2023年9月5日 17時28分

入江様
ありがとうございます。
こちらの環境のdtsi(dtb生成できます)にご教示いただいた内容で編集したのですが添付のエラーとなってしまいます。
お手数にて大変恐縮ですが、今一度ご教示いただけると大変にありがたく存じます。
編集前後のファイル.txtとして添付いたします。

ファイル ファイルの説明
ok-armadillo-610-cdj2444-interface .txt
sc2023-09-05 (4).png
err-armadillo-610-cdj2444-interface .txt

haana

2023年9月5日 17時57分

入江様
お騒がせしました。コンパイルできました。
動作確認に進みます。

haana

2023年9月6日 18時35分

タッチスクリーンの反応位置について
500FXと同様に610にてSPIによるタッチスクリーンの動作はしましたが、
1点におくと反応位置カーソルの暴れが大きいのと、Xもyも両端でタッチ位置とカーソル表示位置のズレが片側で大きく生じます。
XもYも平行四辺形の様に4スミでA/D値が徐々にズレています。全く同じハードで旧アルマジロ500FXと接続した場合には4スミに追随し問題ありません。
何処を検討して、どのように修正したら良いのでしょうか?
どうかご教授願います。
ちなみに、デバイスツリーはいろいろ試して下記の様に書いています。
タッチスクリーンは500FX用のLCD(640×480)のサイズです。

&ecspi2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2>;
cs-gpios =
<&gpio4 22 GPIO_ACTIVE_LOW> // CS0
;
status = "okay";
tsc2046@0 {
reg = <0>;
compatible = "ti,tsc2046";
interrupt-parent = <&gpio4>;
interrupts = <28 0>;
spi-max-frequency = <1000000>;
pinctrl-names ="default";
pinctrl-0 = <&pinctrl_tsc2046_pendown>;
pendown-gpio = <&gpio4 28 0>;
ti,x-min = /bits/ 16 <500>;
ti,x-max = /bits/ 16 <3280>;
ti,y-min = /bits/ 16 <540>;
ti,y-max = /bits/ 16 <3430>;
ti,x-plate-ohms = /bits/ 16 <40>;
ti,pressure-max = /bits/ 16 <255>;
wakeup-source;
};
};

よろしくお願いいたします。