电容屏驱动技术

目录

一  电容屏介绍

二  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 信息的去向

时间: 2024-10-29 19:07:29

电容屏驱动技术的相关文章

【驱动】TP电容屏驱动—3.TP报点协议A/B

USB多点触控上报协议详解USB HID-compliant mouse报点协议解析 本篇文章主要是对usb 多点触控给Windows上报点位时上报的数据解析.至于usb怎样枚举出一个多点触控在这不做解释,网上有很多教程.1.当你的usb hid设备枚举正常后,你可以使用bus hound看到你的usb 设备里有一个新增的HID-compliant mouse接口.可以通过usbTreeView查看对应的端点,我这里的该接口对应的是端点1.所以上报触摸点时,通过端点1上报就好. 2.window

SBC-7109S-455电容屏驱动添加。

参考:http://www.cnblogs.com/helloworldtoyou/p/5530422.html 上面可以下载驱动. 解压后驱动有如下目录: 我们要选择的是: eGTouchARMhf/eGTouchARMhfnonX    里面的两个文件. 把eGTouchL.ini  cp 到./etc 目录下. 吧eGTouchD  cp  到/opt 下. 我们还得把上面的setup 在板子里面运行. 还得运行 eGTouchD ./setup.sh ./eGTouchD 这样,我们的d

android 电容屏(二):驱动调试之基本概念篇

关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) 参考网站:http://edsionte.com/techblog/archives/1582这部分参考别人的多一点 android 电容屏(一):电容屏基本原理篇 android 电容屏(二):驱动调试之基本概念篇

android 电容屏(三):驱动调试之驱动程序分析篇

平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客:http://weibo.com/cpjphone   以goodix的gt8105为例 一.总体架构 硬件部分:先看一个总体的图吧,其实触摸屏原理也比较简单,触摸屏和主控芯片间的联系,如下主要有三部分: 1.IIC部分,初始化gt8105的数据和传回主控制的坐标位置信息就是通过IIC这条线传输

基于GPL329xx linux平台电容屏gsl1680的驱动调试分析

因客户有用到了gsl1680 7寸电容屏,所以拿了一块过来,便在329xx的平台上面开始调试了. 大概浏览了一下所提供的资料,只有介绍模组的资料跟一份中文版的datasheet,datasheet只是说了个大概,没有提到读取触摸坐标的寄存器.不过还好有给一份在其他处理器平台的驱动,所以读取坐标的部分代码移植过来就可以了. gsl1680接口跟其他的电容屏一样,也是i2c接口的,貌似市面上的电容屏都是i2c接口,电容屏自带了微控制器MCU,用与处理采样,坐标转换等,还有一些抖动算法处理,完后将坐标

android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech

本人用的触摸屏IC是FocalTech公司的ft5306,是一款i2c的电容屏多点触控芯片.对于它的整体驱动官方已经给了,我们就触摸屏和按键部分的代码做相关说明.说明其中应该注意的地方. 对于所有的input设备,报告input事件时候都分这么几部分,首先在probe文件中设置设备发送的事件类型.按键类型.设置设备一些属性信息.然后在发送事件时候要根据probe的设置来发送事件,否则就会被判为无效忽略掉. 一.触摸屏部分 1.设备配置 对于触摸屏,必须支持的事件类型有以下这么三个: __set_

android 电容屏(一):电容屏基本原理篇

关键词:android  电容屏 tp  ITO 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) android 电容屏(一):电容屏基本原理篇 android 电容屏(二):驱动调试之基本概念篇 android 电容屏(三):驱动调试之驱动程序分析篇 一.电容屏工作原理 触摸屏的工作原理概括来说就是上报坐标值,X轴.Y轴的值.前面

字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke

http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke 标签: delphiintegerfunctionobjectsoapclass 2012-02-17 11:46 1139人阅读 评论(0) 收藏 举报  分类: Delphi(24)  首先看一段Delphi帮助中的介绍(After Delphi 6 ): Returns the a

Arduino 数码管LED屏驱动

今天測试数码管LED屏驱动,用某产品的一个共阴极的LED屏,依据电路图做数码管LED屏的检測. 代码写得有些冗长.有好几种驱动的方法,这里仅仅是当中一种最直接的方案.抽出时间要做个更有效率的调用和驱动的方案. //设置阴极接口 int d1 = 1; int d2 = 2; int d3 = 3; int d4 = 4; int d5 = 5; int d6 = 6; int d7 = 7; //设置阳极接口 int a = 8; int b = 9; int c = 10; int d = 1