当前位置:首页>Linux>Linux下输入子系统与I2C系统的结合:以GT9XX触摸屏驱动代码为例进行分析

Linux下输入子系统与I2C系统的结合:以GT9XX触摸屏驱动代码为例进行分析

  • 2026-09-21 21:16:48
Linux下输入子系统与I2C系统的结合:以GT9XX触摸屏驱动代码为例进行分析

一、输入子系统知识点回顾

输入子系统通过统一框架,让触摸屏、遥控器、键盘等输入设备复用通用接口,核心步骤:

  • 分配input_device结构体(通过input_allocate_device);
  • 设置input_device属性:
  1. 支持的事件类型(如EV_KEY按键事件、EV_ABS绝对坐标事件);
  2. 具体事件码(如BTN_TOUCH触摸按键、ABS_X/ABS_Y坐标轴);
  • 注册input_device(通过input_register_device);
  • 数据上报:在硬件中断(如触摸中断)中,通过input_event上报数据(如 X/Y 坐标、触摸按下 / 松开状态)。

二、I²C 结合输入子系统的完整驱动流程(以触摸屏GT9XX为例)

1. 硬件与设备树的初始转换

触摸屏硬件(如 GT9XX 系列)连接在某条 I²C 控制器下,其设备树节点会经历以下转换:

  • I²C 控制器驱动会解析自身节点下的触摸屏子节点;
  • 解析后构造i2c_client结构体(代表 I²C 总线上的触摸屏设备),并挂载到 I²C 总线(i2c_bus_type)。

2. I²C 驱动与 input_device 的关联

GT9XX的 I²C 驱动,流程如下:

  1. 注册 i2c_driver
    :在驱动中注册i2c_driver,其of_match_table需与设备树节点的compatible属性匹配;
  2. 触发 probe 函数
    :当i2c_driver与i2c_client匹配时,调用probe函数;
  3. 创建 input_device
    :在probe函数中,分配、设置并注册input_device(如设置触摸屏的 X/Y 坐标范围、支持EV_ABS(绝对坐标)和EV_KEY(触摸按键)事件)。

3. 最终的字符设备注册(闭环流程)

input_device创建后,会与evdev.c中的input_handler匹配:

  • 匹配成功后调用connect函数;
  • 在connect函数中注册字符设备,生成/dev/input/eventX节点;
  • 应用层通过该节点访问触摸屏数据,完成 “硬件→驱动→应用” 的全流程。

三、GT9XX 触摸屏的设备树描述

设备树需完整描述触摸屏的硬件参数,GT9XX 的设备树节点信息更复杂,核心内容包括:

  1. 匹配标识(compatible)
    :用于关联对应的驱动程序,需在驱动的of_match_table中存在匹配条目;
  2. I²C 设备地址(reg)
    :标识触摸屏在 I²C2 总线上的设备地址;
  3. 中断配置
    :指定中断引脚(如 GPRO1_5),触摸触发时通过该引脚向主控芯片发送中断,相比查询方式效率更高;
  4. 设备类型与属性
    :标注为电容触摸屏,明确设备功能;
  5. 引脚控制(pincontrol)
    :配置中断引脚、复位引脚的硬件属性;
  6. 分辨率参数
    :指定触摸屏支持的坐标范围(如 X 方向相关参数),此类参数通常由芯片厂家预设;
  7. 复位引脚配置
    :驱动程序需复位引脚完成硬件初始化,设备树需提供对应引脚信息。

设备树中各参数的必要性由驱动程序决定,例如驱动要求提供复位引脚、中断引脚信息,设备树则需对应配置。

四、GT9XX 驱动程序入口与匹配逻辑

1. 驱动入口函数核心操作

GT9XX 驱动的入口函数:

  • 注册i2c_driver结构体,通过i2c_add_driver完成注册;
  • 结构体中包含of_match_table,用于与设备树节点的compatible属性匹配,明确驱动支持的设备类型。

2. 设备与驱动的匹配触发

当设备树中 GT9XX 节点的compatible属性与驱动of_match_table匹配时,会触发probe函数执行,这是驱动初始化的核心入口。

五、probe 函数的核心初始化流程

probe函数主要完成硬件初始化与输入设备创建,步骤如下:

  1. 记录 i2c_client
    :保存当前匹配的i2c_client结构体,后续通过该结构体访问 I²C 设备;
  2. 硬件相关初始化
    :执行触摸屏芯片的硬件初始化操作(非核心关注重点,按芯片手册实现);
  3. 创建 input_device
    :
  • 调用input_allocate_device分配input_device结构体;
  • 设置支持的事件类型:按键类事件(EV_KEY)、同步类事件(EV_SYN)、绝对位移事件(EV_ABS);
  • 区分设备属性:触摸屏为绝对坐标设备(与鼠标的相对坐标不同),需设置对应属性标识 “可直接操作的设备”;
  • 细化按键事件:明确支持的具体按键类事件类型;
  • 配置绝对位移参数:设置 X 方向位移的最小值、最大值及平滑相关参数(具体含义参考芯片手册);
  1. 注册 input_device
    :调用input_register_device完成注册,接入输入系统框架;
  2. 注册中断
    :调用request_irq注册触摸屏中断服务程序,与之前简化驱动的中断注册逻辑一致,仅因硬件复杂度存在细节差异。

六、中断服务程序与数据处理流程

中断服务程序是触摸屏数据获取与上报的核心,逻辑如下:

  1. I²C 数据读取
    :
  • 触发中断后,通过i2c_client构造 I²C 消息(i2c_msg),执行 I²C 传输(i2c_transfer)读取芯片数据;
  • 具体传输的消息格式(如 “先写后读” 的两步操作)需遵循 GT9XX 芯片手册,无需深入硬件细节,明确 “启动 I²C 传输” 的核心逻辑即可;
  1. 数据解析
    :对读取到的原始数据进行解析,提取触摸坐标、触摸状态等有效信息;
  2. 数据上报
    :
  • 支持多点触摸(MT)功能,通过report_abs函数上报绝对坐标(本质是调用input_event),包括 X 方向、Y 方向坐标;
  • 上报按键类事件(如对应触摸按键 1、按键 2);
  • 调用input_sync完成一次数据上报的同步,确保应用层获取完整数据。

七、驱动框架总结与实际应用建议

1. 输入子系统与I2C系统结合驱动的框架共性

  • 基于 I²C 总线设备驱动模型,通过i2c_driver与i2c_client匹配;
  • 依赖输入系统框架,通过input_device实现数据上报;
  • 采用 “中断触发 - 数据读取 - 解析上报” 的逻辑,与简化驱动无本质差异。

2. 实际工作建议

  • 日常开发中,若对芯片细节不熟悉,优先使用厂家提供的驱动程序,按要求在设备树中配置必要参数(如引脚、分辨率);
  • 若需更换触摸屏,需确保新触摸屏的设备树配置(compatible、I²C 地址、引脚等)与驱动匹配,或适配对应驱动程序。

最新文章

随机文章