
I2C电容触摸屏Atmel maXTouch故障排查与解决硬件平台ATK-DLRK3568Rockchip RK3568触摸芯片Atmel maXTouch型号系列Family: 164, Variant: 54驱动atmel_mxt_ts一、初始问题正常电压是多少1. I2C 触摸屏引脚电压通用情况引脚典型电压说明VCC3.0V – 3.6V最常见 3.3V部分芯片支持 2.8V 或 5.0V需查数据手册GND0V地SCL / SDA1.8V 或 3.3V必须与主控IO电平一致开漏输出需外接上拉电阻典型 4.7kΩ至该电平INT中断1.8V 或 3.3V与主控IO电平匹配RST复位1.8V 或 3.3V与主控IO电平匹配关键原则实际电压以所用触摸屏的数据手册Datasheet为准SCL/SDA 必须接上拉电阻否则 I2C 无法通信。二、系统日志分析dmesg第一轮引脚占用[ 3.379548] atmel_mxt_ts 1-004a: Direct firmware load for maxtouch.cfg failed with error -2 [ 3.382094] rockchip-pinctrl pinctrl: pin gpio1-1 already requested by 1-004a; cannot claim for fe5c0000.i2c [ 3.382910] rockchip-pinctrl pinctrl: pin-33 (fe5c0000.i2c) status -22 [ 3.382927] rockchip-pinctrl pinctrl: could not request pin 33 (gpio1-1) from group i2c3m0-xfer on device rockchip-pinctrl [ 3.382989] rk3x-i2c: probe of fe5c0000.i2c failed with error -22触摸设备地址 0x4a占用了 gpio1-1但 I2C 控制器 fe5c0000.i2c 也想用同一引脚。排查步骤读 touchscreen/maXTouch.dtsi确认触摸节点声明了touch-gpio gpio1 RK_PA1INTreset-gpio gpio1 RK_PA0RSTpinctrl 组atmel_touch_gpio同样申请1 RK_PA1和1 RK_PA0全树搜索fe5c0000/i2c3定位到两处关键定义rk3568.dtsi:3125→i2c3: i2cfe5c0000默认statusdisabled默认pinctrl-0 i2c3m0_xferrk3568-pinctrl.dtsi:855-873→i2c3m0_xfer的成员引脚就是1 RK_PA1scl_m0和1 RK_PA0sda_m0对照结论冲突是100% 重叠不是部分重叠物理引脚内核 pin 编号触摸驱动占用为i2c3m0_xfer 占用为GPIO1_A0pin 32reset-gpioi2c3_sda_m0GPIO1_A1pin 33touch-gpio(INT)i2c3_scl_m0日志只报 gpio1-1 是因为 pinctrl 申请一个 pin group 时遇到第一个失败就中止并回退实际上 gpio1-0 同样冲突。日志中 i2c3 能走到 probe 阶段说明板级 DTS 某处把i2c3置为okay后来证实是rk3568-atk-evb1-ddr4-v10.dtsi:589的 LVDS 屏 gt911 触摸无条件开了 i2c3。给出的三个方案方案 A推荐若不用 i2c3板级 DTS 显式status disabled。方案 B若硬件把 i2c3 走 m1 组GPIO3_B5/B6改pinctrl-0 i2c3m1_xfer。方案 C若必须用 m0只能挪触摸屏 RST/INT 到空闲 GPIO。选择的是方案A第二轮evtest 列出设备但触摸无任何事件现象用户在板上实测$ dmesg | grep -iE atmel [ 3.378663] atmel_mxt_ts 1-004a: CHG pin isnt cleared [ 3.379383] atmel_mxt_ts 1-004a: Enabling RETRIGEN feature [ 3.381402] atmel_mxt_ts 1-004a: Direct firmware load for maxtouch.cfg failed with error -2 ... [ 3.387156] input: Atmel maXTouch Touchscreen as .../1-004a/input/input2对比第一轮日志i2c3 引脚冲突那几行消失了说明中间某次调整起效。evtest 里/dev/input/event2: Atmel maXTouch Touchscreen存在ABS_X/ABS_Y 范围 1024×600 与芯片自报一致——注册链路完全正常。但触摸屏幕 → evtest 零输出。mxt_start: Starting也打印了suspend/resume 框架正常。排查线索解读两条可疑日志的含义CHG pin isnt cleared驱动读 INTCHG引脚电平期望复位后为低但读到高——在 INT 线接错引脚时会必然出现读的是一根悬空/被上拉的无关系引脚。Enabling RETRIGEN feature驱动的兜底逻辑——如果硬件不支持自动重触发中断就让固件在电平未释放时反复重发中断。随后RETRIGEN bit already enabled说明位已是 1。这两条组合本身就是INT 线没接到 CPU 实际监听的引脚的典型指纹但还需要 DTB 层面的证据。关键证据预处理产物.dtb.dts.tmp打开了 IDE 中 IDE 打开的构建产物.rk3568-atk-evb1-ddr4-v10-linux.dtb.dts.tmpC 预处理器展开后的最终 DTS编译进 dtb 的就是它在 L10886-L10931 找到最终生效的 atmel 节点touch-gpio gpio1 1 8; /* GPIO1_A1 */ reset-gpio gpio1 0 1; /* GPIO1_A0 */ interrupt-parent gpio0; interrupts 21 2; /* GPIO0_C5 */ pinctrl-0 atmel_touch_gpio; /* 申请的是 GPIO1_A1/A0 */而板级 DTSrk3568-atk-evb1-ddr4-v10.dtsi:564-587内联块写的是与板上实际接线注释gpio3_c4---rst / gpio3_c5---int一致interrupt-parent gpio3; interrupts 21 2; /* GPIO3_C5 ✓ */ touch-gpio gpio3 RK_PC5 IRQ_TYPE_LEVEL_LOW; reset-gpio gpio3 RK_PC4 GPIO_ACTIVE_HIGH;pinctrl 侧同样查实.dtsi:871-876的atmel_touch_gpio申请3 RK_PC5/3 RK_PC4正确tmp 里的却是 GPIO1_A1/A0错误。根因确认include 顺序导致后到者覆盖入口.dts的包含顺序#include rk3568-atk-evb1-ddr4-v10.dtsi /* L7 内联 atmel 块GPIO3正确 */ #include rk3568-linux.dtsi #include rk3568-screen_choose.dtsi #include rk3568-lcds.dtsi /* hxkj 2026.8.25 */ #include touchscreen/maXTouch.dtsi /* L12 最后包含GPIO1/gpio0错误 */DTC 对同名重复节点的合并规则是标量属性后者胜。maXTouch.dtsi作为最后一个 include其错误引脚定义全部覆盖了前面正确的内联值。于是形成了一条完整的因果链1-004a 的 IRQ 注册在 GPIO0_C5interrupt-parentgpio0, interrupts21 ↓ 而芯片 INT 硬件线接在 GPIO3_C5 ↓ CPU 永远等不到边沿 → 无中断 → 无 input event → evtest 无反应 同时 maXTouch.dtsi 的 pinctrl 把 GPIO1_A0/A1 当成 RST/INT 申请 ↓ GPIO1_A0/A1 恰好是 i2c3m0 的 SDA/SCL → i2c3 probe 失败第一轮的冲突 ↓ 更早的表现CHG pin isnt cleared RETRIGEN 兜底三个表象、一个根因都源自最后 include 的旧版maXTouch.dtsi。顺带发现旧版maXTouch.dtsi:22的注释自己写着代表中断脚是gpio3下的第 21 脚但interrupt-parent却写了gpio0——作者本意是 gpio3抄漏了一行。第三轮确定技术路线 —— 修正 maXTouch.dtsi 本身用户明确表示现在使用的是 maxTouch.dtsi保留 include 这条路线并已将 include 还原激活。因此策略改为把 maXTouch.dtsi 的引脚改成与硬件一致的 GPIO3_C5/C4而不是禁用 include。对 touchscreen/maXTouch.dtsi 的修正矩阵属性修正前错修正后对touch-gpiogpio1 RK_PA1 IRQ_TYPE_LEVEL_LOWgpio3 RK_PC5 IRQ_TYPE_LEVEL_LOWreset-gpiogpio1 RK_PA0 GPIO_ACTIVE_LOWgpio3 RK_PC4 GPIO_ACTIVE_HIGHinterrupt-parentgpio0gpio3interrupts21 2不变21 2gpio3 第 21 脚RK_PC5GPIO3_C5pinctrlatmel_touch_gpio1 RK_PA1、1 RK_PA03 RK_PC5 pcfg_pull_up、3 RK_PC4 pcfg_pull_none文件头接线注释gpio1_a0/a1gpio3_c4/c5设计考量IRQ 的两条获取路径vendor 私有touch-gpio经 gpiod_to_irq或标准interrupt-parentinterrupts都指向 GPIO3_C5无论驱动走哪条都能命中。reset-gpio极性沿用内联参考块的GPIO_ACTIVE_HIGH板上有反相转换的可能性且此前接线全错时芯片仍能被枚举说明驱动走的是 T6 软复位该属性大概率未被用到。补充保留clock-frequency 100000于i2c1maXTouch.dtsi 原本有此设定因 SoC dtsi 的 i2c1 无默认频率若两种来源都丢失会回到驱动默认值。maXTouch.dtsi 与内联块此时是重复定义但取值一致可正常编译彻底去重方案见第“方法沉淀论”节。三、evtest 测试无触摸事件执行结果evtest能列出/dev/input/event2Atmel maXTouch Touchscreen。选择该设备后触摸屏幕无任何事件输出无 ABS 或 KEY 报点。可能原因排查方向中断引脚INT配置错误—— 最可能的原因。硬件供电或电平不匹配。I2C 通信不稳定但驱动已 probe 成功可能性较低。触摸屏本身硬件故障。四、定位并确认根本原因最终确认“问题出在interrupts 1 2;引脚号配置错了”解释interrupts 1 2;中的1 2表示GPIO1_1Bank1Pin1触发方式为下降沿2代表IRQ_TYPE_EDGE_FALLING。实际硬件连接中触摸屏的 INT 脚并没有接在 GPIO1_1而是接在其他 GPIO 上。因此触摸中断信号无法送达 CPU导致无事件上报。五、解决方案修正设备树Device Tree推荐做法使用irq-gpios代替interrupts在atmel_mxt_ts节点中避免直接使用数字编号改用irq-gpios属性更清晰且不易出错。示例修改假设实际 INT 脚为GPIO3_B2i2c1 { /* 触摸屏所在 I2C 总线根据日志为 i2c-1 */ atmel_mxt_ts4a { compatible atmel,maxtouch; reg 0x4a; pinctrl-names default; pinctrl-0 touch_int; /* 若有 pinctrl 定义 */ /* 删除原来的 interrupts 1 2; */ // interrupts 1 2; /* 使用 irq-gpios 明确指定引脚和触发方式 */ irq-gpios gpio3 RK_PB2 IRQ_TYPE_EDGE_FALLING; /* 其他属性reset-gpios, vdd-supply 等保持不变 */ }; }; /* 在 pinctrl 中将该引脚配置为 GPIO 输入上拉中断功能 */ pinctrl { touch { touch_int: touch-int { rockchip,pins 3 RK_PB2 RK_FUNC_GPIO pcfg_pull_up; }; }; };串口调试查看i2c设备i2c detect -y 1 # 应看到 0x4a 或 0x4b 显示 UU表示被驱动占用。最终要达到的状态是UU查看日志dmesg | grep -iE atmel dmesg | grep -iE i2c检查中断是否正确注册cat /proc/interrupts | grep mxt # 应能看到一个中断号并且其后有统计计数。触摸屏幕并观察中断计数是否增加cat /proc/interrupts | grep mxt # 触摸屏幕再次执行看数字是否增长运行 evtest 测试evtest # 触摸时应有 ABS_MT_POSITION_X、ABS_MT_POSITION_Y 等事件输出。可选测量实际引脚电平空闲时 INT 脚应为高电平3.3V触摸时出现低电平脉冲。引脚配置SCL,SDA,rst,int电平注意要在2.8v以上不超过3.3v如果电平不对要么是引脚配置有问题要么是硬件有问题。这个要仔细排查确认。除此之外还要注意引脚冲突问题引脚复用问题。引脚硬件配置Intrst, scl, sda硬件作上拉4.7k电阻引脚软件配置int配置上拉下降沿触发需要用户配置Rst配置上拉或者浮空需要用户配置Scl配置上拉一般板级驱动已经配置好了不需要用户再次配置sda配置上拉一般板级驱动已经配置好了不需要用户再次配置遗留与次要事项maxtouch.cfg failed with error -2-ENOENT/lib/firmware/maxtouch.cfg不存在。非致命——芯片使用其 flash 自带配置自报分辨率与设备树一致。不需要随厂配置就忽略需要调参再把 cfg 放进根文件系统/lib/firmware/或删除节点里的atmel,cfg_name行。touch-gpio/reset-gpio属私有属性goodix gt9xx 风格命名主线 atmel 驱动并不读取vendor 版可能读。保留无害但注意 vendor 驱动版本升级时的兼容差异。重复定义治理可选非必需当前内联块 maXTouch.dtsi双份定义、内容一致能工作但脆弱——将来任何人改其中一份都可能再次引入分裂。彻底做法二选一保留 maXTouch.dtsi 路线删掉.dtsi的#elif TP_ATMEL内联块并把dsi_touch:标签搬到 maXTouch.dtsi 的节点上否则lcds.dtsi无条件引用dsi_touch会报 Label not found或反过来禁用 include第一轮曾给出的方案一切以内联块为准。搬标签前先用grep -rn dsi_touch lcds.dtsi复核引用点数量。i2c3 的归属.dtsi:589无条件开启i2c3挂 LVDS gt911。只要 LCD 宏不选 LVDSlcds.dtsi 会把 lvds_touch 置 disabled节点不会被 probe本次冲突即消这与日志相符。若日后真用 LVDS 屏需重新审视 m0/m1 引脚分配。reset 极性若未来出现休眠唤醒后触摸失灵需断电重启类问题优先尝试把reset-gpio改回GPIO_ACTIVE_LOW并确认上电时序。方法论沉淀下次直接复用DTS 不是先到先得是后来居上同名节点多次定义按顺序合并、标量属性最后一次赋值生效。判断哪个值真正进了 dtb唯一可靠证据是预处理产物*.dtb.dts.tmp或dtc -I dtb -O dts反编译成品。看源码推断不如看产物实证。出问题的总是最后加的那行 includehxkj 注释标记/* hxkj 2026.8.25 */就是变更路标联调阶段遇到昨天还好的今天坏了先 diff 入口 .dts 的 include 列表。pin 冲突日志的正确读法pin X already requested by A; cannot claim for B—— 只报第一个失败引脚不代表只有它冲突要拿 B 的 pin group 成员逐个和 A 的占用比对本例就是 100% 双重叠。-2只是 errnofirmware load 的-ENOENT是文件不存在优先检查根文件系统而不是怀疑驱动。输入子系统排障金字塔自下而上evtest 有设备名且范围正确 ──否── 驱动 probe/DTS 解析层 /proc/interrupts 对应中断计数递增 ──否── 硬件连接/IRQ 注册引脚层本案卡在这 事件坐标正确但 GUI 无反应 ────── 上层坐标变换/invert 配置层本案中设备注册完美 中断纹丝不动精确定位到 IRQ 引脚层避免了乱枪打鸟。注释说谎要交叉验证interrupts 21 2 /*gpio3*/与interrupt-parent gpio0并存即互相矛盾——注释与代码不一致时代码赢但问题往往藏在注释想表达而代码没做到的地方。宏污染教训延续承接姊妹篇DTS 会过 C 预处理器连字符节点名会被拆 token常用词做宏名gt911/atmel等于埋雷一律TP_前缀。