1. GT9271触摸屏驱动调试概述
在RK356X平台上调试GT9271触摸屏,是很多嵌入式工程师都会遇到的任务。这个活儿说简单也简单,说复杂也复杂,关键看你能不能抓住重点。我前前后后调试过不下十块不同型号的触摸屏,GT9271算是比较常见的一款,今天就把我的实战经验分享给大家。
GT9271是Goodix公司生产的一款电容式触摸屏控制器,支持多点触控,通过I2C接口与主控通信。在Android11系统上,我们需要完成内核配置、设备树编写、驱动调试等一系列工作。整个过程可能会遇到中断申请失败、驱动注册失败、坐标轴反转等各种问题,但只要按照正确的步骤来,一般都能解决。
调试触摸屏驱动最让人头疼的不是技术本身,而是那些隐藏很深的细节问题。比如I2C地址为什么要右移一位?中断GPIO为什么申请失败?坐标轴数据为什么会反转?这些问题看似简单,但如果不了解背后的原理,可能会浪费大量时间。接下来,我就带大家一步步解决这些问题。
2. 内核配置与设备树编写
2.1 内核配置
首先得确保内核已经包含了GT9xx系列的驱动支持。RK356X的SDK通常都会自带这个驱动,我们只需要在kernel的配置文件中打开相应选项即可:
CONFIG_TOUCHSCREEN_GT9XX=y这个配置项一般在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: gt9xx@14 { 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Ω的上拉电阻确保信号质量