1.电容式触摸板的工作原理
电容屏要实现多点触控,靠的就是增加互电容的电极,简单地说,就是将屏幕分块,在每一个区域里设置一组互电容模块都是独立工作,所以电容屏就可以独立检测到各区域的触控情况,进电容技术触摸面板CTP(Capacity Touch Panel)是利用人体的电流感应进行工作的。电容屏是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂一层ITO(纳米铟锡金属氧化物),最外层是只有0.0015mm厚的矽土玻璃保护层,夹层ITO涂层作工作面,四个角引出四个电极,内层ITO为屏层以保证工作环境。当用户触摸电容屏时,由于人体电场,用户手指和工作面形成一个耦合电容,因为工作面上接有高频信号,于是手指吸收走一个很小的电流,这个电流分别从屏的四个角上的电极中流出,且理论上流经四个电极的电流与手指头到四角的距离成比例,控制器通过对四个电流比例的精密计算,得出位置。可以达到99%的精确度,具备小于3ms的响应速度。
2.电容屏模组的组成
触摸屏:也就是我们手触摸操作的透明部分;
触摸IC:当电容屏触摸到时,要解析到触点的位置坐标,就是通过这颗芯片去计算处理的。
1、电容式触摸屏的类型主要有两种:
(1)、表面电容式: 表面电容式利用位于四个角落的传感器以及均匀分布整个表面的薄膜,有一个普通的ITO层和一个金属边框,当一根手 指触摸屏幕时,从板面上放出电荷,感应在触 屏 的四角完成,不需要复杂的ITO图案;
(2)、投射式电容: 采用一个或多个精心设计,被蚀烛的ITO,这些 ITO层通过蛀蚀形成多个水平和垂直电极,采用成行/列交错同时带有传感功能的独立芯片。现在平板电脑、手机、车载等多用投射式电容,所以我们后面分析表明投射式电容的构成。
投射电容的轴坐标式感应单元矩阵 :轴坐标式感应单元分立的行和列,以两个交叉的滑条实现 X轴滑条 Y轴滑条 检测每一 格感应单元的电容变化。(示意图中电容,实际为透明的)
2、电容触摸屏分辨率,通道数;
上图所示,X,Y轴的透明电极电容屏的精度、分辨率与X、Y轴的通道数有关,通道越多,分辨率越高。
4.内核中触摸屏的驱动
以下记录在调试过程遇到的与驱动有关的几个问题,本次分析以FT5436当前版本驱动为示例:
(1)中断速率过高,具体表现为与固件中设置的报点速率不相符;
经过分析发现是驱动中做了如下设置:
Focaltech_core.c:
err = request_threaded_irq(client->irq, NULL, fts_ts_interrupt,
pdata->irq_gpio_flags | IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
client->dev.driver->name, data);
pdata->irq_gpio = of_get_named_gpio_flags(np, “focaltech,irq-gpio”, 0, &pdata->irq_gpio_flags);

msm8917-pmi8937-qrd-sku5.dtsi:
focaltech,irq-gpio = <&tlmm 65 0x2008>;/active low level-sensitive/
按照上述代码的设置在low && falling均触发内核中断,所以中断触发次数成倍增长;
(2)内核CTP两种报点协议 A&B
<1>A & B协议简单介绍
如果从设备获取的当前数据与上一个数据相同,我们有必要再上报当前的数据吗?如果我们不管两次数据是否一致都上报,那就是A协议;如果我们不选择上报,那么既然需要比较,总需要把上次数据存起来,slot(位置,槽;两层含义:位置,容器)就是做的这个事情
,显然这个就是Slot(B)协议。
A协议:
不会使用SLOT,多指处理中,它的报点序列如下,没一个序列都以input_report_***函数实现:
通过getevent获取的一个点的上报event:
BTN_TOUCH DOWN
ABS_MT_TRACKING_ID 00000000 //这个ID是无效的;
ABS_MT_PRESSURE 0000003f
ABS_MT_TOUCH_MAJOR 00000006
ABS_MT_POSITION_X 00000147
ABS_MT_POSITION_Y 000001e7
SYN_MT_REPORT 00000000//系统以SYN_MT_REPORT为一个点的信息的结尾
SYN_REPORT 00000000 //以SYN_REPORT为一次事件的结尾;
在多指触摸的时候,android的中间件部分每收到一次SYN_MT_REPORT的形成一个点信息,收到一个点后并不会立即处理,而是一个时间完成之后才处理,SYN_REPORT就是这个事件结束的标志

B协议:
没有SYN_MT_REPORT,利用ABS_MT_TRACKING_ID来跟踪当前点属于那一条线。当前序列中某点的ID值,如果与前一次序列中某点的ID值相等,那么他们拘束于同一条线,应用层就不用再去计算这个点是哪条线上了;如果按下并一直按同一个点,那么input子系统就会做个处理来屏蔽你上下两次相同点,减少IO负担。协议B明显优越于协议A,但是协议B需要硬件支持,ID值并不是随便赋值的,而是硬件上跟踪了点的轨迹,比如按下一个点硬件就会跟踪这个点的ID,只要不抬起上报的点都会和这个ID相关。
通过getevent获取的一个点的上报event:
EV_ABS ABS_MT_TRACKING_ID 0000000a
EV_ABS ABS_MT_TOUCH_MAJOR 00000006
EV_ABS ABS_MT_PRESSURE 0000007f
EV_ABS ABS_MT_POSITION_X 000001e4
EV_ABS ABS_MT_POSITION_Y 00000327
EV_KEY BTN_TOUCH DOWN
EV_SYN SYN_REPORT 00000000 rate 0
EV_ABS ABS_MT_TRACKING_ID ffffffff
EV_KEY BTN_TOUCH UP
EV_SYN SYN_REPORT 00000000 rate 2
5.分析注册和上报数据的流程
注册 :
__set_bit(EV_KEY, input_dev->evbit);
__set_bit(EV_ABS, input_dev->evbit);
__set_bit(BTN_TOUCH, input_dev->keybit);
__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);

if FTS_MT_PROTOCOL_B_EN /和A相比多注册slot/

input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT);

else

input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0);

endif

input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0,
0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0);
input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0);

if FTS_REPORT_PRESSURE_EN

input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0);

endif

如果注册了ABS_MT_PRESSURE,上报时就要上报ABS_MT_PRESSURE。
上报:
Protocol A:
for (i = 0; i < event->touch_point; i++)
{
if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT)
{
input_report_abs(data->input_dev,ABS_MT_TRACKING_ID,event->au8_finger_id[i]);

if FTS_REPORT_PRESSURE_EN

        input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]);

endif

        input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]);input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);input_mt_sync(data->input_dev);

}
input_sync(data->input_dev);
Protocol B:
for (i = 0; i < event->touch_point; i++)
{
if (event->au8_finger_id[i] >= data->pdata->max_touch_number)
{
}
break;
input_mt_slot(data->input_dev, event->au8_finger_id[i]);//根据id注册一个slot

    if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT){input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true);//分配ABS_MT_TRACKING_IDinput_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]);input_report_abs(data->input_dev,ABS_MT_TOUCH_MAJOR, event->area[i]);input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);touchs |= BIT(event->au8_finger_id[i]);data->touchs |= BIT(event->au8_finger_id[i]);input_sync(data->input_dev);

}
6.过调试程中遇到的问题总结
(1)硬测标准(机台测试)不达标
具体表现如:准确度、正斜向线性度、反斜向线性度、唤醒延迟、两指识别距离等,此类问题基本都需要FAE配合更改;
(2)主观测试之边缘划线不直,线不贴边等,此问题也需要FAE进行更改。
(3)在调试过程偶遇TP卡住,失效,经分析有以下几种情况:
<1>报点速率过高,经分析代码中引入了两种触发中断的方式,falling & low同时产生了作用,导致中断触发次数过高,由于TP中断触发方式为FALLING,固只保留falling触发即可;
<2>在芯片内即TP 控制器的固件做报点率限制,也可限制上报速率;
<3>插入USB充电时,TP容易失效 ,充电时对TP的数据有干扰,造成数据不稳定,需要在固件中对TP做屏蔽干扰;

触摸屏硬件以及驱动简介相关推荐

  1. 设备驱动简介 -- ldd3读书笔记

    1. 概述 读<Linux Device Drivers 3>(影印版)(简称 ldd3)已经到第九章了,感觉前面的也忘的差不多了.所以准备把以前读过的内容做一下笔记,并且主要侧重代码的注 ...

  2. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

    作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...

  3. 触摸屏(裸机/驱动)编程思想—JZ2440

    触摸屏(裸机/驱动)编程 触摸屏的种类 电阻式触摸屏 电容式触摸屏 触摸屏裸机程序 触摸屏驱动程序 参考资料: 1.[韦东山]嵌入式Linux应用开发完全手册(旧内核未包含新协议和新API接口--本文 ...

  4. Linux-USB Gadget : Part 6: dummy hcd 驱动简介

    Linux-USB Gadget : Part 6: dummy hcd 驱动简介 作者: zjujoe 转载请注明出处 Email:zjujoe@yahoo.com BLOG:http://blog ...

  5. linux系统网络驱动简介

    网络设备驱动简介 网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制. 网络设备与其他两种设备的区别: 网络接口不存在于linux的文件系统中,及/dev ...

  6. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

  7. MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

    和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度.编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家. AD7745硬件IIC驱动完整版下 ...

  8. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  9. 为什么旧硬件的驱动越来越难找了?

    据我们所知,至少有一家主要负责提供硬件级BIOS驱动程序的提供商正在积极删除不再支持的旧驱动,而另一方面人们用来下载旧驱动程序的FTP站点也将变得越来越罕见. 作者 | Ernie Smith 译者 ...

最新文章

  1. 第十六届智能车竞赛比赛进行中 - 参赛队员提出的问题
  2. 【OF框架】使用OF.WinService项目,添加定时服务,进行创建启动停止删除服务操作...
  3. NYOJ 485 A*B Problem
  4. 基础知识—条件判断语句-if条件类型的语句
  5. mysql error 1130 hy000:Host ‘localhost‘ is not allowed to connect to this mysql server 解决方案
  6. php web长时间不操作退出,Ecshop管理员登陆后台后短时间不操作自动退出的解决方法...
  7. sigar监控API的测试用例
  8. 【系统分析师之路】第五章 复盘软件工程(开发模型开发方法)
  9. python免费教程发布页
  10. 高速公路上边有没有人脸识别摄像头_人脸识别特征介绍以及难题概括
  11. STM32入门系列-STM32外设地址映射
  12. java security md5_java自带的加密--java.security.MessageDigest(md5加密)
  13. SSR服务端渲染(nuxt重构项目)
  14. 今日锋评:愚人节的秘密
  15. ISP(图像信号处理)之——坏点校正
  16. 《Maven官方文档》Maven 开发
  17. C#实现调用打印机(打印字符串、打印绘图、打印图片),还差打印水晶报表
  18. hyperledger fabric 实战开发——水产品溯源交易平台(二)
  19. 初探USB3.0极简方案FT601Q芯片方案
  20. 【RDMA】RoCEv2 帧结构|RoCE和RRoCE|Soft-RoCE

热门文章

  1. 认识图,用矩阵表示图
  2. 无领导小组讨论案例及其分析1
  3. HtmlSpanner
  4. java解决udp可靠性,由于UDP协议提供的是不可靠的服务,因此,可以被淘汰掉。...
  5. Compose 学习笔记(一)—— Compose 初探
  6. [好久没有看到这么真切的文章了]在怀疑的时代依然需要信仰
  7. 海思IPC平台快速拔插SD卡会出现SD卡不识别解决方法
  8. Python--量化分析师的Python日记【第7天:Q Quant 之初出江湖】
  9. 电影怎么转成gif动画?一分钟教你在线转gif动图
  10. vue学习之mintui picker选择器实现省市二级联动