简单流程
首先注册 i2c 设备,添加 tp 驱动,然后在 tp 驱动上响应中断、获取用户操作的
数据,通过筛选等一系列操作将数据上报。
*中断、线程、工作队列生成
*放大缩小、xy 对调等算法
*get_event 函数使用
1. 系统调用 TP 驱动
TP 驱动的调用流程大体类似,通过 module_init 和 module_exit 函数调用与卸载
驱动,同时注册了两个函数,分别是 tpd_device_init 和 tpd_device_exit 用以驱
动初始化。
在 tpd_device_init 函数中向 i2c_broad 注册 i2c 设备,同时通过 tpd_driver_add 将
tpd_device_drive 添 加 到 tpd_driver_list 中 。 在 tpd_device_exit 函 数 中 通 过
tpd_driver_remove 注销我们注册的函数。
系统通过 tpd_driver_add 添加驱动后会回调 tpd_local_init 函数,对本地变量环境
等进行初始化,最后调用 tpd_i2c_probe 函数对具体设备进行检测与设置,同时
注册触摸线程。
2. TP 响应操作
TP 响应用户的操作原理其实很简单,就是当用户点击屏幕进行操作的时候,会
产生中断。通过和 BaseBand 连接的中断引脚触发 BaseBand 去 TP 的寄存器去
读点。然后将点进行处理,再通过 tpd_down 和 tpd_up 上报。
在 tpd_i2c_probe 这个入口函数中会通过 touch_event_handler 函数来运行触摸
线程等待队列,同时调用 tpd_irq_registration 这个函数去注册 tp 驱动的中断。
当中断触发的时候就会唤醒等待队列。
中断函数注册后通过 wait_event_interruptible 对等待队列进行唤醒调用 touch 线
程。
touch_event_handler 函数通过 report_data_handle 检查读点,判断按键状态调用
tpd_down 和 tpd_up
3. 报点处理
接收到的数据通过 report_data_handle 发送到 tpd_down 和 tpd_up 函数,tpd_down
函数调用过 input_report_abs 和 input_report_key 来进行处理,然后通过
input_mt_sync 函数来进行同步。Tpd_down 函数中参数 x、y 即为当前在 tp 中
的逻辑设备坐标。在 input_report_abs 这个函数会通过 input_event 函数继续上
报:
在 input_handle_event 函数中调用 input_event,input_event 函数中,首先会判
断当前过来的事件是不是系统所支持的。如果不支持的话 则未进行处理表示丢
弃,如果是系统支持的事件,就会通过一个互斥锁来进行事件处理。防止其它事
件和中断的干扰。通过 input_handle_event 继续对事件处理
在input_handle_event 中 通 过 input_get_disposition 判 断 类 型 支 持 , 再 通 过
input_pass_event 函数将对应的事件放到 eventHub 中进行处理。
将事件放到 eventHub 中,系统会通过 InputReader 和 InputDispatch 去完成事
件的分发。
tpd_up 函数通过 input_report_key 来进行处理,然后通过 input_mt_sync 函数来 进行同步
4. 亮屏息屏
设备通过 i2c 总线调用 tpd_device_driver 驱动执行 suspend 和 resume 函数对 tp
进行休眠与唤醒。一般 suspend 的时候 ic 要进入休眠模式且关闭中断刷新工作队
列等工作。在 resume 的时候要唤醒 ic,使能中断以及其他工作。在 ps 模拟距感
的情况下,检测通话熄屏则不需要经过休眠与唤醒,ic 仍处于工作状态。