RK3568+Android11 GT911触控驱动移植与配置实战 电子说
在RK3568平台的Android11系统开发中,汇顶GT911作为小尺寸5点电容触控芯片是常见选型,其驱动移植核心围绕设备树适配、内核编译配置、驱动代码微调三大环节展开。本文结合实际项目修改补丁,从驱动核心分析、移植配置步骤、常见报错排查三方面,详解GT911在RK3568+Android11上的开发配置全流程,最终实现触控功能正常可用。
一、GT911触控驱动核心分析
GT911驱动基于汇顶官方gt9xx系列框架开发,核心由gt9xx.c(驱动实现)、gt9xx.h(宏定义/结构体)和GT911芯片手册组成,适配RK3568需重点理解以下核心设计:
1. 通信与工作模式
•I2C通信:GT911作为I2C从设备,支持两组从地址0xBA/0xBB和0x28/0x29,项目中配置为0x14(对应0x28/0x29,I2C地址右移一位),驱动通过gtp_i2c_read/write实现与主控的寄存器读写、坐标数据传输。
•工作模式:支持**中断模式(默认)**和轮询模式,中断引脚触发触控事件后,驱动读取芯片0x814E开始的坐标寄存器,上报触控点信息;同时芯片支持Normal/Green/Sleep三种功耗模式,驱动通过gtp_enter_sleep/gtp_wakeup_sleep实现功耗管理。
•触控能力:GT911最大支持5点触控,驱动中通过GTP_MAX_TOUCH配置,可读取触摸坐标、触摸面积、移动轨迹,适配7~8寸屏幕。
2. 驱动关键适配逻辑
gt9xx.c中通过**tp-size设备树属性**做芯片型号的差异化适配,驱动会根据设备树传入的tp-size值,设置对应的标志位和坐标参数:
•当tp-size = <911>时,驱动会将bgt911 = TRUE,匹配GT911芯片的专属配置;
•同时驱动提供gtp_change_x2y(坐标XY交换)、gtp_x_reverse/gtp_y_reverse(坐标反转)宏,解决芯片物理坐标与屏幕显示坐标的匹配问题,这是GT911适配的核心微调点。
3. 驱动架构核心函数
| 核心函数 | 功能 |
| goodix_ts_probe | 驱动入口,完成GPIO/中断申请、I2C检测、面板初始化、输入设备注册 |
| gtp_request_io_port | 申请复位(RST)、中断(INT)GPIO,完成芯片复位和I2C地址配置 |
| goodix_ts_irq_handler | 中断处理函数,触发后调度工作队列读取触控数据 |
| gtp_touch_down/up | 触控点按下/松开事件上报,完成坐标转换后通过input子系统上报 |
| gtp_init_panel | 面板初始化,加载GT911专属配置参数,发送芯片配置寄存器 |
二、RK3568+Android11 GT911移植配置全步骤
本次移植基于RK3568 EVB开发板,核心是禁用原有Focaltech触控驱动,适配GT911的I2C节点、GPIO、编译配置,所有修改均为项目实测有效补丁,分设备树、内核编译、驱动代码三部分展开。
步骤1:设备树配置修改(核心)
设备树修改集中在rk3568-evb.dtsi和rk3568-evb1-ddr4-v10.dtsi,核心是配置GT911的I2C节点、复位/中断GPIO,禁用原有FTS触控驱动,对应补丁解析如下:
1.1 配置I2C1总线的GT911节点
&i2c1 { status = "okay"; // 替换原有gt1x为gt9xx,启用GT911驱动 gt9xx: gt9xx@14 { status = "okay"; compatible = "goodix,gt9xx"; // 匹配gt9xx驱动的of_match_table reg = <0x14>; // GT911 I2C从地址(0x28右移一位) pinctrl-names = "default"; pinctrl-0 = <&touch_gpio>; // 绑定触控GPIO引脚 reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>; // 复位GPIO touch-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>; // 中断GPIO,低电平触发 max-x = <1920>; // 屏幕X轴分辨率 max-y = <1080>; // 屏幕Y轴分辨率 tp-size = <911>; // 关键:告诉驱动适配GT911芯片 }; // 禁用原有Focaltech FTS触控驱动 // focaltech: focaltech@38 { ... };};
关键修改原因:
•compatible = "goodix,gt9xx":必须与gt9xx.c中of_device_id的兼容属性一致,否则驱动无法匹配加载;
•tp-size = <911>:驱动的核心识别标志,触发GT911的专属配置逻辑;
•中断GPIO配置为IRQ_TYPE_LEVEL_LOW:与GT911芯片的中断输出模式匹配。
1.2 禁用原有GT1X驱动节点
// >1x {// status = "okay";// power-supply = <&vcc3v3_lcd0_n>;// };
1.3 注释原有FTS的GPIO引脚配置
原有FTS触控的GPIO与GT911复用,需注释避免引脚冲突:
// ft5x26 {// ft5x26_gpio: ft5x26-gpio {// rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>,// <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;// };// };
步骤2:内核编译配置修改
修改rockchip_defconfig和触控驱动Makefile,启用GT9XX驱动,禁用FTS驱动,修正驱动编译路径:
2.1 开启GT9XX/关闭FTS驱动(rockchip_defconfig)
CONFIG_TOUCHSCREEN_GT9XX=y # 启用GT9xx系列驱动# CONFIG_TOUCHSCREEN_FTS=y # 禁用Focaltech FTS驱动CONFIG_TOUCHSCREEN_GT1X=y # 保留(不影响,已在设备树禁用)
2.2 修正驱动编译路径(Makefile)
原有GT1X驱动的编译路径替换为GT9XX,避免编译冲突:
# 原配置# obj-$(CONFIG_TOUCHSCREEN_GT1X) += gt1x/# 新配置obj-$(CONFIG_TOUCHSCREEN_GT1X) += gt9xx/
步骤3:GT911驱动代码微调
核心修改gt9xx.c中GT911的坐标适配参数,解决坐标XY交换问题,这是触控点与屏幕点击位置匹配的关键:
else if (val == 911) { m89or101 = FALSE; bgt911 = TRUE; gtp_change_x2y = FALSE; // 原TRUE改为FALSE,关闭XY坐标交换 gtp_x_reverse = FALSE; gtp_y_reverse = TRUE;}
修改原因:GT911芯片的感应通道与屏幕的XY轴物理排布一致,无需交换坐标,若保持gtp_change_x2y=TRUE会出现点击屏幕X轴,触控点在Y轴移动的偏移问题。
三、编译与烧录验证
1. 内核编译
执行RK3568 Android11的内核编译命令,生成包含GT911驱动的内核镜像:
2. 烧录验证
将编译后的boot.img通过RKDevTool烧录到开发板,重启后通过以下命令验证驱动加载状态:
(1)查看驱动加载日志
dmesg | grep -i goodix
正常输出:包含GTP Driver Version: V2.2、GTP I2C Address: 0x14、GTP works in interrupt mode、X_MAX: 1920, Y_MAX: 1080等信息,说明驱动成功匹配并加载。
(2)查看触控输入设备
getevent -l
正常输出:能看到/dev/input/eventX(X为数字)的输入设备,名称为goodix-ts,表示触控设备已成功注册到input子系统。
(3)测试触控事件
getevent /dev/input/eventX
点击屏幕,会输出连续的触控点坐标、触摸压力等信息,说明触控事件正常上报,GT911功能可用。
四、GT911常见报错与排查方案
在RK3568+Android11平台适配GT911时,常见问题集中在I2C通信失败、触控无响应、坐标偏移、中断异常四大类,以下为针对性排查方案,结合芯片手册和驱动逻辑逐一解析:
问题1:dmesg提示“I2C communication ERROR!”,驱动加载失败
现象:驱动probe阶段提示I2C读写出错,无法检测到GT911芯片;
原因&排查步骤:
1.I2C地址不匹配:检查设备树reg = <0x14>是否与GT911实际地址一致(芯片地址可通过Reset/INT引脚配置,0x14对应0x28/0x29,0x5A对应0xBA/0xBB);
2.复位GPIO未拉通:GT911上电需先复位,检查reset-gpio的引脚号、电平极性(GPIO_ACTIVE_HIGH)是否正确,可通过cat /sys/class/gpio/gpioX/value查看GPIO状态;
3.I2C总线被占用:执行i2cdetect -y 1(I2C1总线),查看0x14地址是否被占用,若被占用需排查其他设备的I2C节点;
4.硬件接线问题:检查GT911的SDA/SCL引脚是否与RK3568的I2C1引脚连接正常,是否接拉电阻(4.7K)。
问题2:驱动加载成功,但屏幕触控无响应
现象:dmesg无报错,getevent能看到设备,但点击屏幕无任何事件输出;
原因&排查步骤:
1.中断GPIO异常:检查touch-gpio的引脚号、触发方式(IRQ_TYPE_LEVEL_LOW)是否正确,执行cat /proc/interrupts | grep goodix查看中断是否被注册,若中断计数为0,说明GPIO未触发中断;

2.芯片未进入工作模式:GT911若进入Sleep模式会停止扫描,可通过驱动gtp_wakeup_sleep函数唤醒,或检查硬件电源是否为2.8~3.3V(芯片推荐工作电压);
3.配置寄存器未发送:驱动gtp_init_panel会向GT911发送配置参数,若bgt911未设为TRUE,会导致配置不匹配,检查设备树tp-size = <911>是否配置正确。
问题3:触控有响应,但坐标偏移/反转(点击东,触控点西)
现象:点击屏幕某位置,触控点出现在其他位置,或X/Y轴反转;
原因&排查步骤:
1.坐标交换/反转参数错误:调整gt9xx.c中的gtp_change_x2y(XY交换)、gtp_x_reverse/gtp_y_reverse(坐标反转),逐一枚举测试(如gtp_y_reverse=FALSE);
2.屏幕分辨率不匹配:检查设备树max-x/max-y是否与实际屏幕分辨率一致,若分辨率错误会导致坐标比例失调;
3.GT911传感器配置错误:芯片的驱动/感应通道与屏幕的物理排布需匹配,若硬件做了通道调整,需修改驱动中Sensor_CH0~CH13、Driver_CH0~CH25的寄存器配置(0x80B7~0x80EE)。
问题4:触控点乱跳,或偶尔无响应
现象:屏幕无触摸时,触控点自动跳动,或点击时偶尔无响应;
原因&排查步骤:
1.抗干扰配置不足:GT911支持跳频功能,可在驱动中开启跳频(配置0x807A~0x808F跳频寄存器),避开电源、LCD的干扰频率;
2.硬件接地不良:GT911的AGND/DGND需可靠接地,否则会出现电容检测干扰,导致点飘;
3.去抖参数设置不合理:调整驱动中Shake_Count(去抖次数,寄存器0x804F),增大去抖次数可减少点飘(如设置为5)。
问题5:休眠唤醒后触控无响应
现象:系统休眠前触控正常,唤醒后触控无响应;
原因&排查步骤:
1.休眠后芯片未唤醒:驱动goodix_ts_early_resume函数中需调用gtp_wakeup_sleep唤醒GT911,检查该函数是否被正常调用;
2.中断未重新使能:休眠时驱动会禁用中断,唤醒后需重新执行gtp_irq_enable,检查中断使能逻辑是否完整;
3.电源管理问题:若触控芯片的电源被休眠关闭,需在设备树中配置power-supply,保证休眠时电源常供(如power-supply = <&vcc3v3_lcd0_n>)。
五、总结
RK3568+Android11平台的GT911触控驱动移植,核心是抓住“设备树标识匹配、GPIO/中断配置、坐标参数微调”三个关键点,本次实战的核心经验如下:
1.设备树是基础:compatible、tp-size、reg三个属性必须与驱动严格匹配,否则驱动无法加载;
2.坐标适配是关键:GT911的gtp_change_x2y是适配痛点,需根据硬件的物理排布调整,这是解决坐标偏移的核心;
3.排错先软后硬:先通过dmesg、getevent、i2cdetect排查软件配置问题,再检查硬件接线、电源、接地等问题;
4.驱动复用性强:汇顶gt9xx系列驱动框架兼容GT911/GT9110/GT9271等芯片,仅需通过tp-size做差异化配置,无需大幅修改驱动。
本次配置的补丁已在RK3568 EVB开发板实测通过,可直接作为GT911在RK3568+Android11平台的移植模板,仅需根据实际硬件的GPIO引脚、屏幕分辨率微调即可。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !