一、输入子系统知识点回顾
输入子系统通过统一框架,让触摸屏、遥控器、键盘等输入设备复用通用接口,核心步骤:
- 分配
input_device结构体(通过input_allocate_device);
- 支持的事件类型(如
EV_KEY按键事件、EV_ABS绝对坐标事件); - 具体事件码(如
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 驱动,流程如下:
- 注册 i2c_driver:在驱动中注册
i2c_driver,其of_match_table需与设备树节点的compatible属性匹配; - 触发 probe 函数:当
i2c_driver与i2c_client匹配时,调用probe函数; - 创建 input_device:在
probe函数中,分配、设置并注册input_device(如设置触摸屏的 X/Y 坐标范围、支持EV_ABS(绝对坐标)和EV_KEY(触摸按键)事件)。
3. 最终的字符设备注册(闭环流程)
input_device创建后,会与evdev.c中的input_handler匹配:
- 在
connect函数中注册字符设备,生成/dev/input/eventX节点; - 应用层通过该节点访问触摸屏数据,完成 “硬件→驱动→应用” 的全流程。
三、GT9XX 触摸屏的设备树描述
设备树需完整描述触摸屏的硬件参数,GT9XX 的设备树节点信息更复杂,核心内容包括:
- 匹配标识(compatible):用于关联对应的驱动程序,需在驱动的
of_match_table中存在匹配条目; - I²C 设备地址(reg)
- 中断配置:指定中断引脚(如 GPRO1_5),触摸触发时通过该引脚向主控芯片发送中断,相比查询方式效率更高;
- 设备类型与属性
- 引脚控制(pincontrol)
- 分辨率参数:指定触摸屏支持的坐标范围(如 X 方向相关参数),此类参数通常由芯片厂家预设;
- 复位引脚配置:驱动程序需复位引脚完成硬件初始化,设备树需提供对应引脚信息。
设备树中各参数的必要性由驱动程序决定,例如驱动要求提供复位引脚、中断引脚信息,设备树则需对应配置。
四、GT9XX 驱动程序入口与匹配逻辑
1. 驱动入口函数核心操作
GT9XX 驱动的入口函数:
- 注册
i2c_driver结构体,通过i2c_add_driver完成注册; - 结构体中包含
of_match_table,用于与设备树节点的compatible属性匹配,明确驱动支持的设备类型。
2. 设备与驱动的匹配触发
当设备树中 GT9XX 节点的compatible属性与驱动of_match_table匹配时,会触发probe函数执行,这是驱动初始化的核心入口。
五、probe 函数的核心初始化流程
probe函数主要完成硬件初始化与输入设备创建,步骤如下:
- 记录 i2c_client:保存当前匹配的
i2c_client结构体,后续通过该结构体访问 I²C 设备; - 硬件相关初始化:执行触摸屏芯片的硬件初始化操作(非核心关注重点,按芯片手册实现);
- 创建 input_device
- 调用
input_allocate_device分配input_device结构体; - 设置支持的事件类型:按键类事件(
EV_KEY)、同步类事件(EV_SYN)、绝对位移事件(EV_ABS); - 区分设备属性:触摸屏为绝对坐标设备(与鼠标的相对坐标不同),需设置对应属性标识 “可直接操作的设备”;
- 配置绝对位移参数:设置 X 方向位移的最小值、最大值及平滑相关参数(具体含义参考芯片手册);
- 注册 input_device:调用
input_register_device完成注册,接入输入系统框架; - 注册中断:调用
request_irq注册触摸屏中断服务程序,与之前简化驱动的中断注册逻辑一致,仅因硬件复杂度存在细节差异。
六、中断服务程序与数据处理流程
中断服务程序是触摸屏数据获取与上报的核心,逻辑如下:
- I²C 数据读取
- 触发中断后,通过
i2c_client构造 I²C 消息(i2c_msg),执行 I²C 传输(i2c_transfer)读取芯片数据; - 具体传输的消息格式(如 “先写后读” 的两步操作)需遵循 GT9XX 芯片手册,无需深入硬件细节,明确 “启动 I²C 传输” 的核心逻辑即可;
- 数据解析:对读取到的原始数据进行解析,提取触摸坐标、触摸状态等有效信息;
- 数据上报
- 支持多点触摸(MT)功能,通过
report_abs函数上报绝对坐标(本质是调用input_event),包括 X 方向、Y 方向坐标; - 调用
input_sync完成一次数据上报的同步,确保应用层获取完整数据。
七、驱动框架总结与实际应用建议
1. 输入子系统与I2C系统结合驱动的框架共性
- 基于 I²C 总线设备驱动模型,通过
i2c_driver与i2c_client匹配; - 依赖输入系统框架,通过
input_device实现数据上报; - 采用 “中断触发 - 数据读取 - 解析上报” 的逻辑,与简化驱动无本质差异。
2. 实际工作建议
- 日常开发中,若对芯片细节不熟悉,优先使用厂家提供的驱动程序,按要求在设备树中配置必要参数(如引脚、分辨率);
- 若需更换触摸屏,需确保新触摸屏的设备树配置(
compatible、I²C 地址、引脚等)与驱动匹配,或适配对应驱动程序。