RK3576调试gt9xx
这篇文章主要介绍了触摸的实现原理,配置GT9XX触摸IC,及如何设置休眠唤醒
这篇文章主要介绍了触摸的实现原理,配置GT9XX触摸IC,及如何设置休眠唤醒
首先我们先要知道触摸的实现原理
工作原理
GT911和大部分现代触摸屏(特别是电容式触摸屏)是采用了电容阵列来检测触摸。
首先当手指接触屏幕的时候,会引起GT911内部的电容阵列产生电容变化,触摸IC检测到电容变化并计算触摸点的坐标存入I2C寄存器,然后通过 IRQ(中断)通知 CPU 读取数据,Linux 内核驱动 读取 I2C 数据,解析触摸点坐标,上报给 Linux 输入子系统,接下来就是上层应用的处理,Linux 通过 input event 机制,把触摸点信息传给上层应用(如 Android),Android 的 EventHub 和 InputReader 读取触摸数据,并用于 UI 交互。
上层处理一般安卓原生或者原厂都已经是给做好了,我们需要只需要移植驱动层就好了一般别的不用做修改
原理图


原理图很简单,gt911触摸使用的i2c通信,需要配置的也没啥,也就上面的四个角,复位,中断,时钟,数据,需要关注有没有引脚复用。
DTS


下面解释下DTS里面重要的参数含义
reg 字段指定了该设备在 I2C 总线上的地址为 0x5d。这是 GT9xx 芯片通过 I2C 通信时的唯一标识,这个地址需要在手册中看怎么定义的。
irq-flags 设置了中断的标志,这里值为 2,通常表示一个特定的中断类型或触发方式(如电平触发、边缘触发等)
touchscreen-size设置触摸屏的横向和纵向分辨率
max-x 设置触摸屏支持的最大 X 坐标值,max-y 设置触摸屏支持的最大 Y 坐标值,这两个参数通常与 touchscreen-size相同
goodix,slide-wakeup这个参数与触摸屏的滑动唤醒功能有关。当设置为 1 时,触摸屏支持通过滑动来唤醒设备。
需要注意的是部分内核版本与移植的触摸驱动使用的内核版本相差较大,导致无法使用原厂提供的手势识别功能即使设置为1也无法通过滑动来唤醒设备,触摸唤醒的功能下面会讲到
goodix,type-a-report该字段与触摸屏的数据报告模式有关,通常与是否使用“Type A”的报告格式相关。0 可能表示采用默认的报告方式。
goodix,driver-send-cfg表示驱动是否会在启动时通过配置发送参数。
goodix,resume-in-workqueue 这个表示设置触摸屏在恢复(resume)时是否使用工作队列。如果设置为 0,表示不使用工作队列。
goodix,int-sync表示中断同步的设置,可能影响触摸屏的中断响应机制。设置为 1 可能表示启用中断同步。
goodix,swap-x2y表示是否交换触摸屏的 X 和 Y 轴。如果设置为 0,则不交换坐标轴。
goodix,auto-update-cfg表示是否自动更新配置。如果设置为 0,表示不自动更新配置。
goodix,power-off-sleep表示启用电源关闭后进入睡眠模式的功能。如果设置为 0,表示禁用该功能。
goodix,pen-suppress-finger表示启用或禁用手指压制笔(如触摸笔与手指同时接触时,是否抑制手指)。设置为 0 表示不抑制手指输入。
goodix,cfg-group2这个包含了一段十六进制的数据,通常用来配置触摸屏的硬件参数。这些数据代表了触摸屏的配置,包含了各种传感器的初始化参数、触摸灵敏度、过滤器设置、屏幕校准等。
上述参数需要特别关注的是goodix,auto-update-cfg,goodix,driver-send-cfg和goodix,cfg-group2
有些触摸屏控制器出厂时已经烧录了固件和默认配置,一般情况下是不会去主动解析goodix,cfg-group2所定义的配置信息,Goodix 触摸屏驱动通常会检查 goodix,driver-send-cfg 这个选项(你已经设置为 <1>),当该值为 1 时,驱动会尝试加载 cfg-group2 并写入到触摸屏控制器。
如果触摸屏(TP)内部 没有存储配置,驱动在初始化时会 强制写入 DTS 里的 cfg-group2 配置,确保 TP 能正常工作。但如果 TP 本身已经烧录了完整的固件和配置,驱动可能不会覆盖,而是直接使用出厂默认值。
类似的驱动头文件也有这样一段

这个 #define CTP_CFG_GROUP0 是 Goodix 触摸屏驱动的默认固件配置(触摸参数),它和 DTS 里的 goodix,cfg-group2 类似,都是用来 配置触摸屏的工作参数,比如触摸灵敏度、报告速率、扫描时间等。
所以当驱动初始化触摸屏时,会根据 不同情况 选择:
1,优先使用触摸屏内部存储的固件参数(出厂烧录的配置)。
2,如果 goodix,driver-send-cfg = <1>;,则驱动会尝试写入 DTS 里的 cfg-group2。
3,如果 DTS 里没有 cfg-group2,则可能会回退到 CTP_CFG_GROUP0(编译进驱动的默认配置)。
所以CTP_CFG_GROUP0 是 驱动内置的默认配置,它通常用于作为备用配置(如果 DTS 里没有 cfg-group2,或者 goodix,driver-send-cfg = <0>),一般情况下无论触摸原厂是否烧录了内部存储的固件参数都会给一份用来优化矫正触摸的参数也就是CTP_CFG_GROUP同时也可以用的DTS当中。
触摸唤醒
不同的内核版本驱动情况不一样,可以参考下这个博主的文章
基于“xxx” Androidx平台的驱动及系统开发 之 触摸板篇_android驱动开发-CSDN博客
类似的。我这边所用的驱动也不支持手势识别功能,上述博主的补丁我这边也用不了 驱动版本不一致,但是触摸唤醒的原理是一样的,通过上报触摸事件,上报“KEY_POWER”事件来开启屏幕。
static void gtp_early_suspend(struct early_suspend *h)
{
struct goodix_ts_data *ts = container_of(h,
struct goodix_ts_data, early_suspend);
if (ts) {
dev_dbg(&ts->client->dev, "Suspend by earlysuspend module.");
gtp_suspend(ts);
lcd_en_flag = 0;
}
}
这个函数的作用是 在系统进入休眠(suspend)时,关闭触摸屏,进入低功耗模式。我们在这里引用这个lcd_en_flag标识,表示触摸屏关闭。
static void gtp_work_func(struct goodix_ts_data *ts)
{
u8 point_state = 0;
u8 key_value = 0;
s32 i = 0;
s32 ret = -1;
static u8 pre_key;
struct goodix_point_t points[GTP_MAX_TOUCH_ID];
if (test_bit(PANEL_RESETTING, &ts->flags))
return;
if (!test_bit(WORK_THREAD_ENABLED, &ts->flags))
return;
if(lcd_en_flag == 0){
input_report_key(ts->input_dev, KEY_POWER, 1);
input_sync(ts->input_dev);
input_report_key(ts->input_dev, KEY_POWER, 0);
input_sync(ts->input_dev);
lcd_en_flag = 1;
}
/* gesture event */
if (ts->pdata->slide_wakeup && test_bit(DOZE_MODE, &ts->flags)) {
ret = gtp_gesture_handler(ts);
if (ret)
dev_err(&ts->client->dev,
"Failed handler gesture event %d\n", ret);
return;
}
这个函数是Goodix 触摸屏驱动的主要工作函数,用于 处理触摸事件、手势唤醒事件、按键事件,并向上层报告触摸数据。
我们在这里通过检查标识位状态模拟一次电源按键事件,通过这种方式来唤醒触摸。
更多推荐



所有评论(0)