1. GT9271触摸屏驱动调试概述在RK356X平台上调试GT9271触摸屏是很多嵌入式工程师都会遇到的任务。这个活儿说简单也简单说复杂也复杂关键看你能不能抓住重点。我前前后后调试过不下十块不同型号的触摸屏GT9271算是比较常见的一款今天就把我的实战经验分享给大家。GT9271是Goodix公司生产的一款电容式触摸屏控制器支持多点触控通过I2C接口与主控通信。在Android11系统上我们需要完成内核配置、设备树编写、驱动调试等一系列工作。整个过程可能会遇到中断申请失败、驱动注册失败、坐标轴反转等各种问题但只要按照正确的步骤来一般都能解决。调试触摸屏驱动最让人头疼的不是技术本身而是那些隐藏很深的细节问题。比如I2C地址为什么要右移一位中断GPIO为什么申请失败坐标轴数据为什么会反转这些问题看似简单但如果不了解背后的原理可能会浪费大量时间。接下来我就带大家一步步解决这些问题。2. 内核配置与设备树编写2.1 内核配置首先得确保内核已经包含了GT9xx系列的驱动支持。RK356X的SDK通常都会自带这个驱动我们只需要在kernel的配置文件中打开相应选项即可CONFIG_TOUCHSCREEN_GT9XXy这个配置项一般在make menuconfig的Device Drivers - Input device support - Touchscreens路径下可以找到。如果你用的是厂商提供的SDK建议先检查一下内核源码中是否已经有这个驱动路径通常是drivers/input/touchscreen/gt9xx/。2.2 设备树配置设备树配置是触摸屏调试中最关键的环节之一。GT9271通过I2C接口连接所以首先要确认硬件接在哪组I2C上。RK356X一般有多组I2C控制器比如I2C0、I2C1等。这里有个容易踩坑的地方I2C地址的配置。GT9271的I2C地址是0x28但在设备树中我们需要填写的是右移一位后的值0x14。这是因为I2C协议中地址实际上是7位的最低位是读写标志位。datasheet给出的8位地址包含了读写位而驱动使用的是7位设备地址所以需要右移一位。完整的设备树配置如下i2c1 { status okay; gt9xx: gt9xx14 { status okay; compatible goodix,gt9xx; reg 0x14; pinctrl-names default; pinctrl-0 tp_gpio; reset-gpio gpio0 RK_PB6 GPIO_ACTIVE_HIGH; irq-gpio gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW; tp-size 9271; max-x 800; max-y 1280; }; }; pinctrl { touch { tp_gpio: tp-gpio { rockchip,pins 0 RK_PB6 RK_FUNC_GPIO pcfg_pull_up, 0 RK_PB5 RK_FUNC_GPIO pcfg_pull_none; }; }; };注意gpio的配置reset引脚一般需要上拉而中断引脚不需要上拉。pinctrl的配置也很重要它决定了GPIO的工作模式。3. 常见问题排查3.1 中断GPIO申请失败编译烧录后如果发现驱动没有加载首先检查中断GPIO的申请是否成功。这个问题我遇到过好几次根本原因是设备树中的中断label名称与驱动代码中的名称不匹配。驱动代码中是这样获取GPIO的ts-irq_pin of_get_named_gpio_flags(np, touch-gpio, 0, (enum of_gpio_flags *)(ts-irq_flags)); ts-rst_pin of_get_named_gpio_flags(np, reset-gpio, 0, rst_flags);可以看到驱动中期望的中断label名称是touch-gpio但很多人在设备树中写的是irq-gpio这就导致驱动申请不到中断GPIO。解决方法很简单要么修改设备树中的label名称要么修改驱动代码保持两者一致即可。3.2 驱动注册失败驱动注册失败通常会打印一些错误信息根据这些信息可以快速定位问题。最常见的有两种错误第一种是提示no max-x defined。这是因为设备树中缺少tp-size属性。GT9xx驱动需要通过这个属性来确定触摸屏的型号和参数。对于GT9271我们需要在设备树中添加tp-size 9271;第二种错误也是no max-x defined但这次是因为缺少max-x和max-y属性。这两个属性定义了触摸屏的最大坐标值必须根据实际屏幕分辨率进行设置max-x 800; max-y 1280;有时候即使添加了这些属性驱动还是获取不到正确的值。这是因为驱动代码中虽然读取了属性值但没有正确保存到结构体中。检查驱动代码确保有这样的赋值操作of_property_read_u32(np, max-x, ts-abs_x_max); of_property_read_u32(np, max-y, ts-abs_y_max);4. 坐标校准与数据修正4.1 坐标轴数据反转触摸屏能正常响应触摸但坐标数据反转这是调试过程中经常遇到的问题。GT9xx驱动中有几个关键变量控制坐标轴的变换gtp_change_x2y FALSE; // X轴和Y轴数据是否交换 gtp_x_reverse TRUE; // X轴数据是否反转 gtp_y_reverse TRUE; // Y轴数据是否反转根据实际情况调整这些变量的值可以解决坐标反转的问题。如果修改后没有效果可能需要检查驱动中是否有其他地方覆盖了这些设置。4.2 触摸屏配置信息表有时候即使坐标轴设置正确触摸点的坐标值还是不对。这可能是因为触摸屏的配置信息表(CFG_GROUP)不正确。GT9xx驱动中定义了几组配置信息我们需要根据实际使用的触摸屏型号选择合适的配置。在gt9xx.h文件中找到CTP_CFG_GROUP1的定义确保它与你的触摸屏匹配。如果不确定正确的配置可以联系触摸屏厂商获取。#define CTP_CFG_GROUP1 \ {0x41,0x00,0x04,0x58,0x02,0x05,0x0D,0x00,0x01,0x0F,0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x19,0x1D,0x14,0x8B,0x2B,0x0C,0x33,0x35,0xB5,0x06,0x00,0x00,0x00,0x9A,0x03,0x11,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x50,0x94,0xC5,0x02,0x08,0x00,0x00,0x00,0x83,0x30,0x00,0x6B,0x36,0x00,0x59,0x3D,0x00,0x4D,0x46,0x00,0x43,0x52,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0F,0x10,0x12,0x13,0x14,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x01}5. 调试技巧与注意事项调试触摸屏驱动时掌握一些技巧可以事半功倍。首先善用内核打印信息。在驱动代码中添加适当的打印语句可以帮助你了解驱动的执行流程和数据变化。其次使用i2c-tools工具包可以方便地检测I2C设备是否正常工作i2cdetect -y 1这个命令会扫描I2C总线上的设备如果GT9271连接正常你应该能看到它的地址(0x14)出现在列表中。另一个有用的工具是evtest它可以显示输入设备的事件信息evtest /dev/input/eventX选择对应的输入设备然后在触摸屏上操作就能看到原始的触摸事件数据。最后提醒几个容易忽略的细节确保复位时序正确GT9271需要在上电后保持复位引脚低电平至少5ms检查供电电压是否稳定不稳定的电源会导致触摸屏工作异常如果使用硬件中断确保中断触发电平设置正确上升沿、下降沿或电平触发注意I2C总线的上拉电阻一般需要4.7kΩ的上拉电阻确保信号质量