目录
一 电容屏介绍
二 input输入子系统
三 mtk ctp 软件控制流程
四 mtk平台调试ctp需要修改的地方
一、电容屏介绍介绍
1、电容式触摸屏的类型主要有两种: (1)表面电容式: 表面电容式利用位于四个角落的传感器以及均匀分布整个表面的薄膜,有一个普通的ITO层和一个金属边框,当一根手 指触摸屏幕时,从板面上放出电荷,感应在触屏的四角完成,不需要复杂的ITO图案; (2)投射式电容: 采用一个或多个精心设计,被蚀烛的ITO,这些 ITO层通过蛀蚀形成多个水平和垂直电极,采用成行/列交错同时带有传感功能的独立芯片。现在平板电脑、手机、车载等多用投射式电容,所以我们后面分析表面投射式电容的构成。 投射电容的轴坐标式感应单元矩阵 :轴坐标式感应单元分离的行和列,以两个交叉的滑条实现 X轴滑条 Y轴滑条 检测每一 格感应单元的电容变化。(示意图中电容,实际为透明的)
投射式电容:
上图所示,X,Y轴的透明电极电容屏的精度、分辨率与X、Y轴的通道数有关,通道越多,分辨率越高。
通道与ITO连接情况:
二、input输入子系统
上图是input输入子系统框架,输入子系统由输入子系统核心层( Input Core ),驱动层和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,触模屏按下,joystick的移动等等通过 input driver -> Input core -> Event handler -> userspace 到达用户空间传给应用程序。
各层的功能简述: 驱动层负责和具体的硬件设备交互,得到硬件采集到的数据(IIC总线); input core则是起到一个中间层的作用,将数据上报; 而事件驱动层则将上报的数据通过文件节点提供给上层使用。
input 设备层编写要点:
1.分配 input设备 struct input_dev *input_allocate_device(void)
linux多点触控协议定义了一系列ABS_MT事件,这些事件被分为几大类,允许只应用其中的一部份,多点触摸最小的事件集中应包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此来实现多点触摸。如果设备支持ABS_MT_WIDTH_MAJOR这个事件,那么此事件可以提供手指触摸接触面积大小。触摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供触摸设备的类别,如手或是笔或是其它。最后有些设备可能会支持ABS_MT_TRACKING_ID,用来支持硬件跟踪多点信息,即该点属于哪一条线等。
下面是MTK代码平台电容TP填充的input_dev结构体部分
1 tpd->dev->name = TPD_DEVICE;
2 set_bit(EV_ABS, tpd->dev->evbit);
3 set_bit(EV_KEY, tpd->dev->evbit);
4 set_bit(ABS_X, tpd->dev->absbit);
5 set_bit(ABS_Y, tpd->dev->absbit);
6 set_bit(ABS_PRESSURE, tpd->dev->absbit);
7 set_bit(BTN_TOUCH, tpd->dev->keybit);
8 set_bit(ABS_MT_POSITION_X, tpd->dev->absbit);
9 set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit);
10 set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit);
11 set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit);
12 tpd->dev->absmax[ABS_MT_POSITION_X] = TPD_RES_X;
13 tpd->dev->absmin[ABS_MT_POSITION_X] = 0;
14 tpd->dev->absmax[ABS_MT_POSITION_Y] = TPD_RES_Y;
15 tpd->dev->absmin[ABS_MT_POSITION_Y] = 0;
注册 input设备 int input_register_device(struct input_dev *dev)
三、mtk平台 ctp 软件控制流程
code 分析:
mediatek\custom\common\kernel\mtk_tpd.c
mediatek\custom\common\kernel\touchpanel\ft5206_driver.c
mediatek\custom\common\kernel\touchpanel\ft5206_driver.c
mediatek\custom\common\kernel\touchpanel\ft5206_driver.c
tpd_probe(struct i2c_client *client, const struct i2c_device_id *id) 主要完成触控设备上电过程,配置中断及中断处理函数,开启线程监听输入事件(触模事件)
注册的TP中断处理函数:
监听线程注册的处理函数:
虚拟按键上报流程:
1.在normal mode下,tp button也是和其它触摸事件一样,以坐标形式的input_event进行上报。在初始化时会通过tpd_button_setting()函数根据定义在tpd_custom_XXX.h,文件中的配置信息将虚拟按键的坐标信息写在/sys/board_properties/virtualkeys.mtk-tpd 中。 工作时,tp driver将按下的点的坐标进行上报,Android上层会读取sys中的按键配置信息,再判断上报的坐标是否属于某个按键的坐标范围,以此将坐标信息转化为具体的按键键值。
2.在factory mode和recovery mode下,由于Android还未启动, 所以按键事件不能采取1中的上报机制,而是利用tpd_button()函数来对按键进行直接上报处理。
四、mtk平台调试ctp需要修改的地方
硬件部分:先看一个总体的图
电容屏上电/唤醒时序图
首先在项目的projectconfig.mk配置触模屏相关型号:
CTP模块相关 dws配置. 根据硬件原理图,检查一下复位信号,中断号,及相应Pin 脚 IO口配置是否正确.
CTP供电部分配置: /mediatek/custom/{project}/kernel/tpd_custom_ft5206.h
iic 配置 和注册
mediatek/custom/common/kernel/touchpanel/ft5206_driver.c
注:别挂错i2c。默认代码有可能挂在别外一组iic
一般电容屏预留固件调试接口实现校准功能这步可以直接注释掉TPD_HAVE_CALIBRTION,去掉平台这边效准功能.
mediatek\custom\common\kernel\src\tpd_calibrate.c
CTP 固件升级接口:
目前电容屏厂商都会预留固件接口,可以通过修改固件进配置触控芯片相应寄存器,调节:触屏灵敏度、抗干扰、输出坐标与物理坐标的匹配等。
因此驱动工程师完成触屏驱动功能调试后,还需要配合TP供应商完成TP固件程序调试以及升级.
TouchPanel没有响应定位:
一、使用此设备读取 TouchPanel上报的事件: adb shell get event /dev/input/event3 ,若手触模屏,没有相关信息出来,则问题出在驱动配置、硬件电路、CTP模组相方面。
二、若TP有丢数据给上层,但上层没有相应的动作,则需找出TP丢的数据跑到什么地方去了,主要涉及到的文件:inputreader.cpp和inputDispatcher.cpp 分析数据流向: 在inputreader.cpp中把 #define DEBUG_XXX 0全部修改为 #define DEBUG_XXX 1 在InputDispatcher.cpp中把 #define DEBUG_XXX 0全部修改为 #define DEBUG_XXX 1 获取相关log,并搜索key words为“InputDispatcher: Focus entered window:”和“InputDispatcher: Focus left window:”就可定位 input 信息的去向