我在 Android 5 平台上使用 Atmel MXT641T 驱动的触摸屏时遇到问题。
我的设置如下:
- 硬件:Inforce 6309 SBC,配备 Qualcomm Snapdragon 410 msm8916 ARM64 处理器。
- 采用 Atmel MXT641T 控制芯片的定制触摸屏。
- Atmel 和 Snapdragon 之间的 I2C 连接连接到 I2C0。
- Android 5操作系统使用Linux内核3.10
git://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
.