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

2024-01-07

我在 Android 5 平台上使用 Atmel MXT641T 驱动的触摸屏时遇到问题。

我的设置如下:

  • 硬件:Inforce 6309 SBC,配备 Qualcomm Snapdragon 410 msm8916 ARM64 处理器。
  • 采用 Atmel MXT641T 控制芯片的定制触摸屏。
  • Atmel 和 Snapdragon 之间的 I2C 连接连接到 I2C0。
  • Android 5操作系统使用Linux内核3.10git://codeaurora.org/kernel/msm-3.10.git branch Rel_V1.3(这是 SBC 附带的 BSP 的一部分)...
  • ...但使用最新版本的 Atmel 驱动程序atmel_mxt_ts.c覆盖在内核树上(但也使用以下版本进行了测试atmel_maxtouch_ts.c in msm-3.10.git显示出相同的行为)。
  • Atmel 芯片的 INT 线连接到 GPIO 53(这是EXT_CONN_GPIO_1该板)并带有外部上拉电阻至1.8V。
  • Atmel 芯片的 RESET 线已断开。

为此,我所做的是修改设备树以包含 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 芯片的 INT 线就会被芯片拉低,但示波器上看不到 I2C 流量。
  • 我验证了中断触发条件(0x0, 0x8 or 0x2008作为设备树中中断单元中的第二个元素)通过在中断线上手动引起高电平和低电平并不重要:在任何情况下都不会触发中断。

进入/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。

中没有显示 maxtouch 驱动程序的 GPIO/sys/kernel/debug/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>; and interrupts = <53 0>识别 Snapdragon 的 GPIO 引脚 53。我测试了两者<53 0> and <53 8>.
  • 我有时看到人们使用0x2008作为单元格中的第二个条目。我觉得0x0008就是设置中断为低电平触发,但是第13位是做什么的呢?我测试了两者0x0 and 0x8,没有什么区别(还:-))。
  • 我应该期待进入/sys/kernel/debug/gpio?
  • 设备树中是否需要任何其他条目才能将 maxtouch 中断连接到物理引脚?
  • IRQ号在哪里326 in /proc/interrupts来自,有没有办法验证它链接到哪个引脚?
  • 是否可以配置 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 定义已位于qcom/msm8916-pinctrl.dtsi但是,对于我的情况,我必须将引脚 12 更改为 54,将引脚 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";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 基于 ASP .NET MVC 3 的 Facebook 应用程序:使用默认模型绑定器解析查询字符串数组?

    简而言之 在用户使用 fb request form 控件选择好友后 Facebook 向我的 MVC 3 应用程序传递以下查询字符串 我假设默认模型绑定器会解析查询字符串中的 ids 数组 并将其绑定到以下操作中的 ids 参数 publ
  • JSON.stringify 在我的 Json 对象中添加额外的 \ 和 "" 时出现问题

    您好 我正在使用 Javascript 创建一个带有键和值的对象数组 使用以下代码 ValuesArray push key this attr someattribute value this val 结果我有一个像这样的对象数组 key
  • Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?

    假设我有一个 User 模型 其中 facebook uid 字段对应于用户的 facebook id 我想允许用户取消其 Facebook 帐户的链接 这样做 我需要将此属性设置为零 我目前看到有两种方法可以做到这一点 第一种方法 创建自
  • Magic Suggest - 从 MVC 模型中预先选择多个项目

    我正在寻找一种用多个值填充 Magic Suggest 控件的方法 我正在使用 ASP NET MVC 并希望根据模型中的属性设置这些值 Part 1 Magic 建议支持多个值 A相关问题 https stackoverflow com
  • 单击 jquery 中的单选按钮时显示动态价格的总和

    我的一个与旅游网站相关的项目的处境非常糟糕 我不知道如何计算每位乘客首选房型的总金额 我的数据库中有两名乘客的记录 1 玛吉2 以斯帖 每位乘客的默认价格为 125000 如果用户点击选择自己的房型 则所选乘客的价格为 150000 这是我
  • 如何读取/打印(_io.TextIOWrapper)数据?

    使用以下代码 我想 gt 打开一个文件 gt 读取内容并删除不需要的行 gt 然后将数据写入文件并读取文件以进行下游分析 with open chr2 head25 gtf r as f open test output txt w as
  • 使用 coord_polar() 进行“缩放”/“缩放”

    我有一个使用 geom smooth 的极坐标图 平滑的黄土线非常小 围绕着地块的中心 我想 放大 这样你就能看得更清楚 使用类似的东西scale y continuous limits c 05 7 将使 geom smooth 环变大
  • 如何指定颜色条范围并保持它而不考虑绘图值

    我昨晚打了这个 然后当我准备提交它时我想通了 提交以防其他人需要 我正在底图上绘制多天每小时的气象值 我想为每张地图始终保留相同的颜色条值 假设每个图的范围是 0 10 有时这些值都非常接近于零 而另一些则介于 0 10 之间 for fi
  • 在 Windows Phone 中拖放

    我正在尝试实现拖放功能来排列列表框的内容 我能够拖动该项目 当我尝试将第二个项目拖动到第一个项目时 它会出现在第一个项目上方 但是当我尝试将第一个项目拖动到第二个项目时 第一个项目会出现在第二个项目下方 我也无法赶上掉落 以便我可以安排物品
  • 缩放至适合:嵌入 HTML 中的 PDF

    我正在将本地 pdf 文件嵌入到一个简单的网页中 并且希望设置初始缩放以适合对象大小 这是我尝试过的 但它不影响缩放 有谁知道如何修改代码 以便将其初始缩放设置为适合对象大小 回复有点晚了 但我注意到这些信息很难找到 而且还没有找到答案 所
  • 为什么 scipy 的稀疏 csr_matrix 的向量点积比 numpy 的密集数组慢?

    我遇到一种情况 我需要从稀疏矩阵中提取一行 并用密集行获取其点积 使用 scipy 的 csr matrix 这似乎比使用 numpy 的密集数组乘法慢得多 这让我感到惊讶 因为我预计稀疏点积将涉及更少的操作 这是一个例子 import t
  • 如何在react-router中创建锚标记?

    我在内部使用react boilerplate 3 4 0 和react router来进行路由 我尝试创建一个链接 当我点击它时 我希望滚动到 divid anchor tag 即使我使用 Link 组件而不是 标记 它也只是滚动到页面顶
  • Symfony 3.0.4 使用 FOSRestBundle 序列化期间检测到循环引用

    我在 Symfony 项目中使用 FOSRestBundle 当我尝试处理视图时 在使用 Symfony 序列化器和 JMSSerializer 序列化数据期间失败 这是呈现响应的方法 默认控制器 php em this gt getDoc
  • 将数据写入一行

    我将数据写入 csv 文件 格式如下 789 255 25 33 0 855 275 25 33 0 我希望将其转换为如下格式 1 789 255 25 33 0 2 855 275 25 33 0 所以我想要的就是将列表中的元组转换为一个
  • 创建 WCF Web 服务时出错

    我创建了一个新的 WCF Web 服务 但是当我尝试运行它时 出现此错误 未生成任何代码 如果您尝试生成客户端 这可能是因为元数据文档不包含任何有效的合同或服务 或者因为发现所有合同 服务都存在于 reference 程序集中 验证是否已将
  • SQL 未知与 NULL 相同吗?

    我很困惑 UNKNOWN 在 SQL 中的三值逻辑中意味着什么 它实际上意味着 NULL 吗 NULL 和 UNKNOWN 在所有布尔上下文中是否可以互换 简单回答 3 2 gt FALSE 3 3 gt TRUE NULL 3 gt UN
  • PerformSelectorInBackground 是否为每次调用生成新线程?

    Does performSelectorInBackground为每个调用生成一个新线程 还是为所有调用 可能排队 共享一个线程 不是主线程 每次调用都会创建一个新线程 performSelectorInBackground withObj
  • HTML5 中的输入类型=“文本”与输入类型=“搜索”

    我是 HTML5 的新手 因为我开始使用 HTML5 的新表单输入字段 当我使用表单输入字段时 尤其是
  • PHP 在多维数组中创建动态数组

    我想根据多维数组内的数字动态创建一个数组 这是代码 meta box array id gt my meta box title gt Custom Input Fields page gt page context gt normal p
  • 如何在Android 5内核设备树中正确配置Atmel MXT641T触摸芯片的INT线中断?

    我在 Android 5 平台上使用 Atmel MXT641T 驱动的触摸屏时遇到问题 我的设置如下 硬件 Inforce 6309 SBC 配备 Qualcomm Snapdragon 410 msm8916 ARM64 处理器 采用