目录
前言
触摸屏分为电阻屏、电容屏。
电阻屏结构简单,在以前很流行;电容屏支持多点触摸,现在的手机基本都是使用电容屏。
注意:LCD、触摸屏不是一回事,LCD 是输出设备,触摸屏是输入设备;触摸屏是外屏,负责触控输入;LCD是内屏,负责显示输出。制作触摸屏时特意把它的尺寸做得跟 LCD 一模一样,并且把触摸屏覆盖在 LCD 上。
一、电阻屏
1、电阻屏原理
电阻屏就是基于欧姆定律制作的,它有上下两层薄膜,这两层薄膜就是两个电阻,如下图所示:

平时上下两层薄膜无触触,当点击触摸屏时,上下两层薄膜接触:这时就可以测量触点电压。过程如下:
① 测量 X 坐标:
在 xp、xm 两端施加 3.3V 电压,yp 和 ym 不施加电压(yp 就相当于探针),测量 yp 电压值。该电压值就跟 X 坐标成正比关系,假设:
X = 3.3*Vyp/Xmax
② 测量 Y 坐标:
在 yp、ym 两端施加 3.3V 电压,xp 和 xm 不施加电压(xp 就相当于探针),测量 xp 电压值。该电压值就跟 Y 坐标成正比关系,假设:
Y = 3.3*Vxp/Ymax
在实际使用时,电阻屏的 Xmax、Ymax 无从得知,所以使用之前要先较准:依次点击触摸屏的四个角和中心点,推算出 X、Y 坐标的公式:
X = func(Vyp)
Y = func(Vxp)
2、电阻屏数据
Linux 驱动程序中,会上报触点的 X、Y 数据,注意: 这不是 LCD 的坐标值,需要 APP 再次处理才能转换为 LCD 坐标值。
对应的 input_event 结构体中,"type、code、value"如下:

二、电容屏
1、原理
电容屏中有一个控制芯片,它会周期性产生驱动信号,接收电极接收到信号,并可测量电荷大小。当电容屏被按下时,相当于引入了新的电容,从而影响了接收电极接收到的电荷大小。主控芯片根据电荷大小即可计算出触点位置,这类芯片一般是 I2C 接口。 我们只需要编写程序,通过 I2C 读取芯片寄存器即可得到这些数据。
2、电容屏数据
电容屏可以支持多点触摸(Multi touch),驱动程序上报的数据中怎么分辨触点?
这有两种方法:Type A、Type B,这也对应两种类型的触摸屏。其中Type A只能上传触电数据给软件,由软件分析出触电位置,这类触摸屏已经淘汰过时了,所以我们主要讲Type B。
Type B
该类型的触摸屏能分辨是哪一个触点,上报数据时会先上报触点 ID,再上报它的数据。
当有 2 个触点时(type, code, value):

当ID为45的触点移动时:

松开 ID 为 45 的触点时:(这里无需重新设置SLOT,SLOT 就像一个全局变量一样:如果它没变化的话,就无需再次设置)

最后,松开 ID 为 46 的触点:(这列因为更改了触点,所以要申明SLOT为1)

3、实际的实验数据
假设你的开发板上电容屏对应的设备节点是/dev/input/event0,执行以下命令:
bash
hexdump /dev/input/event0
用一个手指点击触摸屏,得到类似如下的数据:

在上面的数据中,为了兼容老程序,它也上报了 ABS_X、ABS_Y 数据,电阻触摸屏就是使用这类型的数据。所以基于电阻屏的程序,也可以用在电容屏上。而两个MAJOR数据则是表示TOUCH面积的一个参数,暂时不需要了解。其他的基本和上面描述的一致。
使用两个手指点击触摸屏时,得到类似如下的数据:

为了兼容老程序,它也上报了 ABS_X、ABS_Y 数据,但是只上报第 1 个触点的数据。其他的也和也之前分析的一致。