gpt4 book ai didi

android - 如何在Android 5内核设备树中正确配置Atmel MXT641T触摸芯片的INT线中断?

转载 作者:搜寻专家 更新时间:2023-11-01 09:36:54 24 4
gpt4 key购买 nike

在android 5平台上,我很难让atmel mxt641t驱动的触摸屏工作。
我的设置如下:
硬件:带高通Snapdragon 410 MSM8916 ARM64处理器的Inforce 6309 SBC。
带有ATMEL MXT641T控制器芯片的定制触摸屏。
ATMEL和Snapdragon之间的I2C连接连接到I2C0。
android 5操作系统,使用linux内核3.10 fromgit://codeaurora.org/kernel/msm-3.10.gitbranchRel_V1.3(这是sbc附带的bsp的一部分)。
…但是最新版本的atmel驱动程序atmel_mxt_ts.c覆盖在内核树上(也用atmel_maxtouch_ts.c中显示相同行为的msm-3.10.git版本测试)。
ATMEL芯片的内线连接到GPIO 53(这是该板的EXT_CONN_GPIO_1),外部上拉电阻为1.8V。
ATMEL芯片的重置线路断开。
我所做的是修改设备树以包含ATMEL设备,如下所示:

&i2c_0 {

atmel_maxtouch_ts@4a {
compatible = "atmel,maxtouch";
reg = <0x4a>;
interrupt-parent = <&msm_gpio>;
interrupts = <53 0>;
atmel,panel-coords = <0 0 1024 768>;
atmel,display-coords = <0 0 1024 768>;
atmel,family-id = <164>;
atmel,variant-id = <2>;
atmel,version = <21>;
atmel,build = <0xaa>;
};

};

作为参考, msm_gpio在bsp中定义如下(未触及)。
&soc {
tlmm_pinmux: pinctrl@1000000 {
compatible = "qcom,msm-tlmm-8916";
reg = <0x1000000 0x300000>;
interrupts = <0 208 0>;

/*General purpose pins*/
gp: gp {
qcom,num-pins = <122>;
#qcom,pin-cells = <1>;
msm_gpio: msm_gpio {
compatible = "qcom,msm-tlmm-gp";
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
num_irqs = <122>;
};
};

我将内核编译为一个模块( CONFIG_TOUCHSCREEN_ATMEL_MXT=m),并手动运行 insmod
我看到的是:
当使用atmel实用程序 mxt-app时,设备工作:当我触摸屏幕时,消息进入,因此i2c连接正常(但它使用轮询)。
加载驱动程序时调用 mxt_start,其中启用了中断。我向驱动程序添加了一些调试语句,以验证它是否正在加载。
加载驱动程序时,从设备读取信息块,并在示波器上显示简短的I2C流量。i2c地址是从设备树中读取的,因此我确信我的设备树已加载。
输入设备注册为 /dev/input/event6,可以用 cat打开(但触摸屏幕时不会显示任何消息)。
中断在 /proc/interrupts中可见,但从不触发(见下文)。
每当我触摸屏幕时,芯片会拉低ATMEL芯片的整数线,但示波器上看不到I2C通信。
我通过手动引起中断线的高低来验证中断触发条件( 0x00x80x2008作为设备树中中断单元的第二个元素)没有关系:在任何情况下都不会触发中断。
输入 /proc/interrupts
 $ cat /proc/interrupts
...
326: 0 0 0 0 msm_tlmm_irq maxtouch
...

这是 dmesg中出现的内容:
<6>[   55.290620] atmel_mxt_ts 0-004a: Family: 164 Variant: 2 Firmware V1.5.AA Objects: 43
<4>[ 55.291252] atmel_mxt_ts 0-004a: Enabling RETRIGEN workaround
<6>[ 55.365918] atmel_mxt_ts 0-004a: Touchscreen size X1024Y768
<6>[ 55.367017] input: Atmel maXTouch Touchscreen as /devices/soc.0/78b6000.i2c/i2c-0/0-004a/input/input6

我从阅读 atmel_mxt_ts.c中的驱动程序代码中了解到,驱动程序应该在该中断线上触发,然后通过启动I2C传输来查询设备以读取T5消息,设备将在该消息上返回一个触摸列表,然后将其传递到操作系统。我还没有找到一个数据表或文档来正确解释这一点,但根据我目前所看到的情况,这正是我所怀疑的。
我已经通过执行以下操作手动测试了GPIO引脚53(我通常将ATMEL芯片的int线连接到该引脚):
$ echo 955 > /sys/class/gpio/export     # 955 because EXP_CONN_GPIO_1 is GPIO pin 53, which has offset 902
cat /sys/class/gpio/gpio955/value

当我将int线连接到v+或接地时,该值会发生变化,因此我确信我必须使用gpio 53。
/sys/kernel/debug/gpio中未显示MaxTouch驱动程序的GPIO:
$ cat /sys/kernel/debug/gpio
GPIOs 576-607, platform/qcom,smp2pgpio-ssr-smp2p-4-out.19, master-kernel:

GPIOs 608-639, platform/qcom,smp2pgpio-ssr-smp2p-4-in.18, slave-kernel:

GPIOs 640-671, platform/qcom,smp2pgpio-ssr-smp2p-1-out.13, master-kernel:

GPIOs 672-703, platform/qcom,smp2pgpio-ssr-smp2p-1-in.12, slave-kernel:

GPIOs 704-735, platform/qcom,smp2pgpio-smp2p-4-out.16, smp2p:

GPIOs 736-767, platform/qcom,smp2pgpio-smp2p-4-in.14, smp2p:

GPIOs 768-799, platform/qcom,smp2pgpio-smp2p-1-out.10, smp2p:

GPIOs 800-831, platform/qcom,smp2pgpio-smp2p-1-in.8, smp2p:

GPIOs 832-863, platform/qcom,smp2pgpio-smp2p-7-out.6, smp2p:

GPIOs 864-895, platform/qcom,smp2pgpio-smp2p-7-in.4, smp2p:

GPIOs 896-899, spmi/qpnp-pin-ffffffc031550c00, pm8916-gpio:
gpio-898 (qcom,hub-reset-gpio ) out hi
gpio-899 (qcom,sw-sel-gpio ) in lo

GPIOs 900-901, spmi/qpnp-pin-ffffffc031550800, pm8916-mpp:

GPIOs 902-1023, platform/1000000.pinctrl, msm_tlmm_gpio:
gpio-922 (adv7533_hpd_irq_gpio) in lo
gpio-923 (led1 ) out lo
gpio-927 (disp_rst_n ) in hi
gpio-933 (adv7533_irq_gpio ) in hi
gpio-934 (hdmi_lvds ) in lo
gpio-940 (7864900.sdhci cd ) in hi
gpio-1009 (volume_up ) in hi
gpio-1010 (camera_focus ) in hi
gpio-1011 (camera_snapshot ) in hi
gpio-1022 (led2 ) out lo
gpio-1023 (USB_ID_GPIO ) in hi

我提出了一些具体的问题来帮助解决这个难题:
注册中断的正确方法是什么?我使用 interrupt-parent = <&msm_gpio>;interrupts = <53 0>来识别Snapdragon的GPIO引脚53。我用 <53 0><53 8>进行了测试。
我有时看到人们在单元格中使用 0x2008作为第二个条目。我认为 0x0008是将中断设置为低电平触发,但是第13位是做什么的?我用 0x00x8两种方法进行了测试,结果没有什么不同(但是:-)。
我是否应该在 /sys/kernel/debug/gpio中输入?
设备树中是否需要其他条目来将maxtouch中断连接到物理pin?
326中的irq编号 /proc/interrupts来自何处,是否有方法验证它链接到哪个pin?
是否可以配置Int线将由Snapdragon上拉,而不必使用外部上拉电阻器?
提前谢谢你的帮助。
PS:还有一个与此无关的问题:如何快速测试设备树的更新,而不必等待20分钟,等待所有makefile加载,内核重新编译,然后将新的 boot.img闪存到设备并重新启动?我使用命令 make bootimage

最佳答案

在发现设备树中已经有一个或多或少工作的触摸屏定义,但是管脚不同之后,我得到了以下设备树:

&i2c_0 {

atmel_maxtouch_ts@4a {
compatible = "atmel,maxtouch";
reg = <0x4a>;
interrupt-parent = <&msm_gpio>;
interrupts = <53 0x2008>;
pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_suspend";
pinctrl-0 = <&ts_int_active &ts_reset_active>;
pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
pinctrl-2 = <&ts_release>;
atmel,irq-gpio = <&msm_gpio 53 0x2008>;
atmel,reset-gpio = <&msm_gpio 54 0>;
atmel,panel-coords = <0 0 800 480>;
atmel,display-coords = <0 0 800 480>;
atmel,family-id = <164>;
atmel,variant-id = <2>;
atmel,version = <21>;
atmel,build = <0xaa>;
};

};

所以,下面几行是不同的:
interrupts = <53 0x2008>;
pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_suspend";
pinctrl-0 = <&ts_int_active &ts_reset_active>;
pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
pinctrl-2 = <&ts_release>;
atmel,irq-gpio = <&msm_gpio 53 0x2008>;
atmel,reset-gpio = <&msm_gpio 54 0>;

需要0x2008才能使Snapdragon拉上中断线并在下降沿触发。
pinctrl定义已经位于bsp附带的 qcom/msm8916-pinctrl.dtsi中,但是,对于我的情况,我必须将pin 12更改为54,pin 13更改为53:
diff --git a/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi
index 204c718..80a2a6d 100644
--- a/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8916-pinctrl.dtsi
@@ -30,16 +30,6 @@
};
};

- atmel-int-pin {
- qcom,pins = <&gp 53>;
- qcom,num-grp-pins = <1>;
- label = "atmel-int-pin";
- default {
- drive-strength = <0>;
- bias-pull-up;
- };
- };
-
ext-cdc-tlmm-lines {
qcom,pins = <&gp 116>, <&gp 112>, <&gp 117>,
<&gp 118>, <&gp 119>;
@@ -1175,7 +1165,7 @@

/* add pingrp for touchscreen */
pmx_ts_int_active {
- qcom,pins = <&gp 13>;
+ qcom,pins = <&gp 53>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "pmx_ts_int_active";
@@ -1187,7 +1177,7 @@
};

pmx_ts_int_suspend {
- qcom,pins = <&gp 13>;
+ qcom,pins = <&gp 53>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "pmx_ts_int_suspend";
@@ -1199,7 +1189,7 @@
};

pmx_ts_reset_active {
- qcom,pins = <&gp 12>;
+ qcom,pins = <&gp 54>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "pmx_ts_reset_active";
@@ -1211,7 +1201,7 @@
};

pmx_ts_reset_suspend {
- qcom,pins = <&gp 12>;
+ qcom,pins = <&gp 54>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "pmx_ts_reset_suspend";
@@ -1223,7 +1213,7 @@
};

pmx_ts_release {
- qcom,pins = <&gp 13>, <&gp 12>;
+ qcom,pins = <&gp 53>, <&gp 54>;
qcom,num-grp-pins = <2>;
label = "pmx_ts_release";

关于android - 如何在Android 5内核设备树中正确配置Atmel MXT641T触摸芯片的INT线中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com