1. GT9xx触摸驱动移植背景与准备正点原子的开发板在嵌入式Linux领域应用广泛但官方教程中关于GT9xx系列触摸芯片的驱动移植说明存在缺失。很多开发者拿到搭载GT9xx触摸IC的屏幕后面对官方文档只介绍edt-ft5x06驱动移植的情况往往需要自行摸索解决方案。我在实际项目中遇到过多次这类需求特别是使用4.3寸480x272、4.3寸800x480以及10.1寸1280x800屏幕时都需要处理GT9xx驱动的移植问题。首先需要明确的是正点原子提供了两套内核源码出厂源码和教程源码。出厂源码中已经包含了GT9xx的完整驱动实现我们可以直接从中提取所需文件。具体来说需要获取的是drivers/input/touchscreen/目录下的gt9xx.c和gt9xx.h这两个核心文件。为了方便大家使用我已经将这两个文件上传到GitHub仓库https://github.com/dzm2018/gt9xx_driver开发者可以直接下载使用。在开始移植前建议先准备好开发环境。我习惯使用Ubuntu 18.04或20.04系统需要确保已安装以下基础工具链sudo apt-get update sudo apt-get install build-essential libncurses5-dev bison flex2. 驱动文件配置与内核编译将获取到的gt9xx.c和gt9xx.h文件放置到教程源码的对应目录drivers/input/touchscreen/后需要进行两个关键配置文件的修改。首先是Kconfig文件的配置这个文件决定了驱动在内核配置菜单中的显示选项。我建议在drivers/input/touchscreen/Kconfig文件的合适位置通常在类似驱动配置的附近添加以下内容config TOUCHSCREEN_GT9XX tristate GT9XX I2C touchscreen depends on I2C help Say Y here if you have the GT9XX touchscreen connected to your system. If unsure, say N. To compile this driver as a module, choose M here: the module will be called gt9xx.接下来是Makefile的修改。在drivers/input/touchscreen/Makefile中添加编译规则obj-$(CONFIG_TOUCHSCREEN_GT9XX) gt9xx.o完成这些修改后就可以进行内核配置了。正点原子的开发板通常提供了配置脚本比如mx6ull_alientek_emmc.sh。执行这个脚本后在menuconfig界面中找到Device Drivers → Input device support → Touchscreens路径勾选GT9XX I2C touchscreen选项。这里有个实用技巧按/键可以搜索配置项直接输入GT9XX能快速定位到目标选项。3. 设备树节点配置与管脚冲突排查设备树配置是驱动移植中最容易出问题的环节。根据我的经验GT9xx触摸芯片通常使用I2C2接口需要在imx6ull-alientek-emmc.dts文件的i2c2节点下添加如下内容goodix_ts5d { compatible goodix,gt9xx; reg 0x5d; status okay; interrupt-parent gpio1; interrupts 9 0; pinctrl-0 ts_int_pin ts_reset_pin; goodix,rst-gpio gpio5 9 GPIO_ACTIVE_LOW; goodix,irq-gpio gpio1 9 GPIO_ACTIVE_LOW; };这里需要特别注意GPIO管脚的冲突问题。在i.MX6ULL平台上GPIO1_IO09这个管脚经常被其他功能复用。我遇到过多次因为这个管脚冲突导致触摸失效的情况。解决方法是在设备树中搜索MX6UL_PAD_GPIO1_IO09找到所有使用这个管脚的地方将冲突的配置注释掉。还需要添加两个关键的pinctrl配置ts_int_pin: ts_int_pin_mux { fsl,pins MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x79 ; }; ts_reset_pin: ts_reset_pin_mux { fsl,pins MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x79 ; };完成这些修改后建议使用diff工具对比检查设备树的改动确保没有遗漏任何必要的修改。编译设备树时我习惯使用如下命令确保清除之前的编译结果make dtbs -j44. 驱动测试与问题排查驱动加载后可以通过多种方式验证触摸功能是否正常工作。首先检查中断是否正常触发cat /proc/interrupts在输出中查找GT9xx对应的中断号触摸屏幕时观察中断计数是否增加。如果中断计数没有变化可能是中断配置或管脚复用存在问题。更直接的测试方法是使用hexdump查看原始输入事件hexdump /dev/input/event1触摸屏幕时应该能看到数据输出。不过这些原始数据不易解读建议使用tslib工具进行更友好的测试。tslib的安装和使用可以参考正点原子官方文档基本步骤如下tar -vxjf tslib-1.21.tar.bz2 cd tslib-1.21 ./configure --hostarm-linux-gnueabihf --prefix/usr/local/tslib make make install将编译好的tslib库复制到开发板后设置环境变量export TSLIB_TSDEVICE/dev/input/event1 export TSLIB_CONFFILE/etc/ts.conf export TSLIB_PLUGINDIR/usr/lib/ts export TSLIB_CALIBFILE/etc/pointercal然后运行校准工具ts_calibrate如果校准过程中能看到触摸点跟随说明驱动工作正常。我在实际项目中遇到过校准点位置偏移的情况这通常是由于屏幕尺寸参数未正确配置导致的需要在驱动或应用层进行相应调整。5. 常见问题与解决方案在GT9xx驱动移植过程中有几个常见问题值得特别注意。首先是I2C通信失败这可能是由于设备树中I2C地址配置错误导致的。GT9xx的I2C地址通常是0x5d或0x14不同型号可能有所不同建议查阅具体型号的数据手册确认。另一个常见问题是触摸坐标不准或镜像。这通常需要通过修改驱动中的分辨率参数来解决。在gt9xx.c文件中搜索max_x和max_y将其设置为实际屏幕的分辨率值。我在10.1寸屏项目中就遇到过这个问题将max_x设置为1280max_y设置为800后问题解决。中断不触发也是常见问题之一。除了检查设备树中的中断配置外还需要确认硬件连接是否正确。有一次我遇到中断不工作的情况最后发现是开发板上的上拉电阻未正确焊接导致的。使用万用表测量中断线的电压在无触摸时应该是高电平触摸时变为低电平。电源管理问题也不容忽视。GT9xx芯片对电源稳定性要求较高如果发现触摸偶尔失灵可以尝试在驱动中禁用电源管理功能或者检查电源电路的电容是否足够。我在一个项目中通过增加电源滤波电容解决了触摸不稳定的问题。6. 性能优化与进阶配置对于需要高性能触摸响应的应用场景可以考虑对驱动进行一些优化。首先是调整中断触发方式GT9xx支持中断触发方式配置可以根据实际需求选择上升沿、下降沿或双边沿触发。在设备树中修改interrupts属性的第二个参数即可实现interrupts 9 2; /* 2表示下降沿触发 */另一个优化方向是调整触摸采样率。GT9xx驱动中通常有配置采样间隔的参数可以根据应用场景调整。在需要快速响应的场景下可以适当减小这个值但要注意功耗会增加。对于多点触控应用需要确认驱动中是否开启了多点触控支持并正确配置最大触摸点数。GT9xx系列通常支持最多10点触控但需要在驱动和应用程序中都进行相应配置才能正常工作。调试信息输出也是一个有用的功能。在开发阶段可以开启驱动的调试输出通过以下命令查看内核日志dmesg | grep gt9xx在驱动代码中适当添加printk语句可以帮助快速定位问题。但记得在产品发布时关闭这些调试输出以免影响性能。7. 驱动维护与升级建议随着内核版本的更新GT9xx驱动也可能需要相应调整。我建议定期关注主线内核中Goodix驱动的更新必要时可以将这些改进移植到自己的驱动中。特别是在升级内核版本时要注意输入子系统API可能发生的变化。驱动代码的版本管理也很重要。我习惯为每个项目创建独立的分支记录所有的修改和调整。这样在遇到问题时可以快速回溯也方便在不同项目间共享改进。对于需要产品化的项目建议编写自动测试脚本定期验证触摸功能是否正常。可以基于tslib工具编写简单的自动化测试检查触摸坐标是否准确响应时间是否满足要求等。