This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TSC2046:TSC2046不能在 TI SDK10 (AM62P)中工作

Guru**** 1818760 points
Other Parts Discussed in Thread: AM62P, TSC2046, ADS7846
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1422761/tsc2046-tsc2046-not-work-in-ti-sdk10-am62p

器件型号:TSC2046
主题中讨论的其他器件:AM62P、、 ADS7846

工具与软件:

尊敬的 TI 专家:

我们的电路板使用 TI AM62P SOC 与 SDK10 (内核6.6)。

我们 在 MCU_spi0和 GPIO0_7中进行了 TSC2046触控、用于 PEN 中断

DTS 如下所示

&main_pmx0 {
	bootph-all;
	// Touchscreen PEN IRQ
	penirq_pins: pinmux_penirq_pins {
		pinctrl-single,pins = <
			AM62PX_IOPAD(0x001c, PIN_INPUT, 7) /* (N21) OSPI0_D4.GPIO0_7 TS2046_PENIRQ */
		>;
	};
};	
&mcu_pmx0{
	// MCU_SPI0
	mcu_spi0_pins_default: mcu-spi0-pins-default {
		pinctrl-single,pins = <
			AM62PX_MCU_IOPAD(0x0008, PIN_OUTPUT, 0) /* (C10) MCU_SPI0_CLK */
			AM62PX_MCU_IOPAD(0x0000, PIN_OUTPUT, 0) /* (B10) MCU_SPI0_CS0 */
			AM62PX_MCU_IOPAD(0x000c, PIN_OUTPUT, 0) /* (B11) MCU_SPI0_D0 */
			AM62PX_MCU_IOPAD(0x0010, PIN_INPUT, 0) /* (D10) MCU_SPI0_D1 */
		>;
	};
};
&mcu_spi0{
		status = "okay";
		pinctrl-names = "default";
		pinctrl-0 = <&mcu_spi0_pins_default>;
		#address-cells = <1>;
		#size-cells= <0>;
		ti,pindir-d0-out-d1-in = <1>;

		tsc2046@0{
			reg = <0>;
			compatible = "ti,tsc2046";
			spi-max-frequency = <1000000>;
			pinctrl-names = "default";
			pinctrl-0 = <&penirq_pins>;
			interrupt-parent = <&main_gpio0>;
			interrupts = <7 IRQ_TYPE_NONE>;    /* (N21) OSPI0_D4.GPIO0_7 TS2046_PENIRQ */
			pendown-gpio = <&main_gpio0 7 GPIO_ACTIVE_HIGH>;

			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 <200>;
			/*ti,pressure-min = /bits/ 16 <50>;*/
			ti,pressure-max = /bits/ 16 <4095>;

			ti,debounce-max = /bits/ 16 <10>;
			ti,debounce-tol = /bits/ 16 <5>;
			ti,debounce-rep = /bits/ 16 <1>;

			ti,penirq-recheck-delay-usecs = /bits/ 16 <2>;
			/*ti,swap-xy;*/
			/*ti,settle-delay-usec = /bits/ 16 <150>;*/

			ti,vref-delay-usecs = /bits/ 16 <2>;
			ti,vref-mv = /bits/ 16 <0>;
			ti,keep-vref-on;

			wakeup-source;
		};
};

目前、当我使用ts_calibrate和时ts_test、触摸输入没有响应。

我检查中断是否正常、但 dmesg 没有为 ti、tsc2046显示 spi_device_id

root@am62pxx-evm:~# dmesg | grep ads
[    0.819277] SPI driver ads7846 has no spi_device_id for ti,tsc2046
[    0.825597] SPI driver ads7846 has no spi_device_id for ti,ads7843
[    0.831912] SPI driver ads7846 has no spi_device_id for ti,ads7845
[    0.838229] SPI driver ads7846 has no spi_device_id for ti,ads7873
[    6.109755] ads7846 spi0.0: supply vcc not found, using dummy regulator
[    6.124741] ads7846 spi0.0: touchscreen, irq 303
root@am62pxx-evm:~# cat /proc/interrupts | grep 303
303:     255937          0          0          0      GPIO   7 Edge    -davinci_gpio  ads7846

您能帮助我检查 DTS 中配置错误的位置吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对于延迟、我们深表歉意、我们将于本周更新主题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Daveon:

    我已将调试消息插入ads7846.c

    我观察到、当我第一次触摸面板时、代码会进入ads7846_irq()功能。

    之后、它仍然卡在循环中、因为get_pendown_state(ts)一直返回 true。

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/input/touchscreen/ads7846.c?h=ti-linux-6.6.y#n921

    但我们不触摸屏幕、我不知道为什么"get_pendown_state (ts)"始终返回 true。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yuyan。

    我已经提出了一个注意事项、想了解我们是否有适用于 TSC 器件的 Linux 支持专家。 感谢您的耐心

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Daveon:

    更新我的状态。
    我们的 EE 发现有些设置错误,所以我更新了我的 DTS 如下,但这个 DTS 设置是在内核5.10与相同的触摸屏(我们的上一代机器,但使用 AM654. TSC2046的外围电路没有改变。)

    &main_pmx0 {
    	bootph-all;
    	// Touchscreen PEN IRQ
    	penirq_pins: pinmux_penirq_pins {
    		pinctrl-single,pins = <
    			AM62PX_IOPAD(0x001c, PIN_INPUT, 7) /* (N21) OSPI0_D4.GPIO0_7 TS2046_PENIRQ */
    		>;
    	};
    };	
    &mcu_pmx0{
    	// MCU_SPI0
    	mcu_spi0_pins_default: mcu-spi0-pins-default {
    		pinctrl-single,pins = <
    			AM62PX_MCU_IOPAD(0x0008, PIN_OUTPUT, 0) /* (C10) MCU_SPI0_CLK */
    			AM62PX_MCU_IOPAD(0x0000, PIN_OUTPUT, 0) /* (B10) MCU_SPI0_CS0 */
    			AM62PX_MCU_IOPAD(0x000c, PIN_OUTPUT, 0) /* (B11) MCU_SPI0_D0 */
    			AM62PX_MCU_IOPAD(0x0010, PIN_INPUT, 0) /* (D10) MCU_SPI0_D1 */
    		>;
    	};
    };
    &mcu_spi0{
    		status = "okay";
    		pinctrl-names = "default";
    		pinctrl-0 = <&mcu_spi0_pins_default>;
    		#address-cells = <1>;
    		#size-cells= <0>;
    		ti,pindir-d0-out-d1-in = <1>;
    
    		tsc2046@0{
    			reg = <0>;
    			compatible = "ti,tsc2046";
    			spi-max-frequency = <1000000>;
    			pinctrl-names = "default";
    			pinctrl-0 = <&penirq_pins>;
    			interrupt-parent = <&main_gpio0>;
    			interrupts = <7 IRQ_TYPE_EDGE_FALLING>;    /* (N21) OSPI0_D4.GPIO0_7 TS2046_PENIRQ */
    			pendown-gpio = <&main_gpio0 7 IRQ_TYPE_EDGE_FALLING>;
    
    			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 <200>;
    			/*ti,pressure-min = /bits/ 16 <50>;*/
    			ti,pressure-max = /bits/ 16 <4095>;
    
    			ti,debounce-max = /bits/ 16 <10>;
    			ti,debounce-tol = /bits/ 16 <5>;
    			ti,debounce-rep = /bits/ 16 <1>;
    
    			ti,penirq-recheck-delay-usecs = /bits/ 16 <2>;
    			/*ti,swap-xy;*/
    			/*ti,settle-delay-usec = /bits/ 16 <150>;*/
    
    			ti,vref-delay-usecs = /bits/ 16 <2>;
    			ti,vref-mv = /bits/ 16 <2500>;
    			ti,keep-vref-on;
    
    			wakeup-source;
    		};
    };
    

    这是比较不同的

    更新 DTS 之后、我们现在可以正确地退出 IRQ 函数。 但是、我注意到 X 和 Y 位置仍然没有更新。

    使用新 DTS 后:  

    当我触摸屏幕时、我观察到了这一点。 IRQ 函数将调用  ads7846_read_state()

    将从失败3次  ads7846_filter() (then continue in while loop)

    离开 ads7846_read_state()后、next 将调用 ads7846_report_state() 函数   
    该函数将从这里返回。 调试消息是" 忽略1个压力0 "

    能否告诉我是否应该修改任何特定的设置? 或者、我应该如何着手调试该问题?
    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Daveon:

    好消息、我们的触控已经可以工作了  

    我们更新了 DTS 设置

    		tsc2046@0{
    			reg = <0>;
    			compatible = "ti,tsc2046";
    			spi-max-frequency = <1000000>;
    			pinctrl-names = "default";
    			pinctrl-0 = <&penirq_pins>;
    			interrupt-parent = <&main_gpio0>;
    			interrupts = <7 IRQ_TYPE_EDGE_FALLING>;    /* (N21) OSPI0_D4.GPIO0_7 TS2046_PENIRQ */
    			pendown-gpio = <&main_gpio0 7 GPIO_ACTIVE_LOW>;
    
    			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 <400>;
    			ti,y-plate-ohms = /bits/ 16 <100>;
    			ti,pressure-min = /bits/ 16 <50>;
    			ti,pressure-max = /bits/ 16 <4095>;
    
    			ti,debounce-max = /bits/ 16 <10>;
    			ti,debounce-tol = /bits/ 16 <5>;
    			ti,debounce-rep = /bits/ 16 <1>;
    
    			ti,penirq-recheck-delay-usecs = /bits/ 16 <2>;
    			/*ti,swap-xy;*/
    			ti,settle-delay-usec = /bits/ 16 <15>;
    
    			ti,vref-delay-usecs = /bits/ 16 <2>;
    			ti,vref-mv = /bits/ 16 <0>;
    			ti,keep-vref-on;
    
    			wakeup-source;
    		};

    谢谢