一、触摸屏概述
触摸屏作为一种输入设备,是目前最简单、方便、自然的一种人机交互方式。按照触摸屏的工作原理和传输信息的介质,可以将触摸屏分为四种:电阻式、电容感应式、红外线式和表面声波式。每一种触摸屏都有其各自的优缺点,要了解哪种触摸屏适用于哪种场合,关键就在要了解每一类触摸屏的工作原理和特点。本节我们主要介绍的是4线电阻式触摸屏。
1.1 电阻式触摸屏
电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面紧密结合的电阻薄膜屏,这是一种多层的复合薄膜,以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的的透明隔离点把两层导电层隔开绝缘。所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。分压器是通过将两个电阻进行串联来实现的。电阻R1连接正参考电压VREF,电阻R2接地。两个电阻连接点处的电压测量值与R2的阻值成正比。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本原理。实际上就是欧姆定律的巧妙运用!
1.2 电阻式触摸屏信号测量
4线触摸屏包含了两个阻性层,如下图所示:
当没有触摸按下时,X层和Y层是分离的,此时就测不到电压。
X坐标方向值测量:
将XP接到3.3V , XM接0V, YP和YM悬空,我们以按压X坐标的中间位置, X层和Y层便闭合了,此时触摸屏控制器 (ADC)就可测量到YP输出的当前X坐标值1.66V,如下图:
Y坐标方向值测量:
将YP接3.3V , YM接0V, XP和XM悬空,我们以按压X坐标的中间位置, X层和Y层便闭合了,此时触摸屏控制器 (ADC)就可测量到XP输出的当前Y坐标值1.66V,如下图:
二、触摸屏驱动模型
Linux内核中触摸屏驱动实现基于输入子系统架构,具体请移步 Linux - 输入子系统框架详解 ;
对于触摸屏驱动开发者,核心层和事件处理层由Linux内核提供,主要实现xxx_ts.c,
1)分配一个input_dev结构体
2)设置input_dev的成员
3)注册input_dev 驱动设备到内核中
4)设置触摸屏相关的硬件
触摸屏使用过程简单处理简述如下(流程):
按下,产生中断;
在中断服务程序里,启动ADC,转换X,Y坐标;
ADC结束,产生ADC中断;
在ADC中断处理函数里上报(input_event),启动定时器;
定时器时间到,执行2再次启动ADC,转换X,Y坐标;(处理长按、滑动)
松开
二、触摸屏驱动相关的重要数据结构和函数
在输入子系统架构中,会将设备抽象出一个input_dev结构体;它是驱动的主体。每个struct input_dev代表一个输入设备。
2.1 struct input_dev结构体
struct input_dev {
void *private;
const char *name; //设备名字
const char *phys; //文件路径,比如 input/buttons
const char *uniq;
struct input_id id;
unsigned long evbit[NBITS(EV_MAX)]; //表示支持哪类事件,常用有以下几种事件(可以多选)
//EV_SYN 同步事件,当使用input_event()函数后,就要使用这个上报个同步事件
//EV_KEY 键盘事件
//EV_REL (relative)相对坐标事件,比如鼠标
//EV_ABS (absolute)绝对坐标事件,比如摇杆、触摸屏感应
//EV_MSC 其他事件