触摸屏分为电阻屏、
电容屏。电阻屏结构简单,
在以前很流行;电容屏支持 多点触摸,现在的手机基本都是使用电容屏。 注意:LCD、触摸屏不是一回事,LCD 是输出设备,触摸屏是输入设备。制作触摸 屏时特意把它的尺寸做得跟 LCD 一模一样,并且把触摸屏覆盖在 LCD 上。 7.4.1 电阻屏 复习一下欧姆定律 图 7.17 欧姆定律 图 7.17 中的电阻假设是均匀的,就是长度和阻值成正比关系。电阻长度为 L,阻值为 R,在两端施加 3.3V 电压。在某点测
电阻为 V,
求上图中长度 X。 根据欧姆定律:3.3/R = V/Rx, 因为长度和阻值成正比关系,上述公式转换为:3.3∕L = V/X,所以X=LV/3.3。 231 / 577 电阻屏原理 电阻屏就是基于欧姆定律制作的,它有上下两层薄膜,这两层薄膜就是两个 电阻,如下图所示: 图 7.18 电阻屏原理 平时上下两层薄膜无触触,当点击触摸屏时,上下两层薄膜接触:这时就可 以测量触点电压。过程如下: 测量 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) 电阻屏数据 Linux 驱动程序中,会上报触点的 X、Y 数据,注意:这不是 LCD 的坐标值, 需要 APP 再次处理才能转换为 LCD 坐标值。 对应的 input_event 结构体中,“type、code、value”如下: 按下时: EV_KEY BTN_TOUCH 1 /* 按下 *
电容屏
中有一个控制芯片,它会周期性产生驱动信号,接收电极接收到信号, 并可测量电荷大小。当电容屏被按下时,相当于引入了新的电容,从而影响了接 收电极接收到的电荷大小。主控芯片根据电荷大小即可计算出触点位置。 怎么通过电荷计算出触点位置?这由控制芯片实现,这类芯片一般是 I2C 接 口。 我们只需要编写程序,通过 I2C 读取芯片寄存器即可得到这些数据。 电容屏数据 参 考 文 档 : Linux 内 核 Documentation\input\multi-touchprotocol.rst。 电容屏可以支持多点触摸(Multi touch),驱动程序上报的数据中怎么分辨 触点? 这有两种方法:Type A、Type B,这也对应两种类型的触摸屏: Type A 该类型的触摸屏不能分辨是哪一个触点,它只是把所有触点的坐标一股脑地 上报,由软件来分辨这些数据分别属于哪一个触点。 Type A 已经过时,Linux 内核中都没有 Type A 的源码了。 Type B 该类型的触摸屏能分辨是哪一个触点,上报数据时会先上报触点 ID,再上报 它的数据。 具体例子如下,这是最简单的示例,使用场景分析来看看它上报的数据。 当有 2 个触点时(type, code, value): EV_ABS ABS_MT_SLOT 0 // 这表示“我要上报一个触点信息了”,用来分隔触点信息 EV_ABS ABS_MT_TRACKING_ID 45 // 这个触点的 ID 是 45 EV_ABS ABS_MT_POSITION_X x[0] // 触点 X 坐标 EV_ABS ABS_MT_POSITION_Y y[0] // 触点 Y 坐标 EV_ABS ABS_MT_SLOT 1 // 这表示“我要上报一个触点信息了”,用来分隔触点信息 EV_ABS ABS_MT_TRACKING_ID 46 // 这个触点的 ID 是 46 233 / 577 EV_ABS ABS_MT_POSITION_X x[1] // 触点 X 坐标 EV_ABS ABS_MT_POSITION_Y y[1] // 触点 Y 坐标 EV_SYNC SYN_REPORT 0 // 全部数据上报完毕 当 ID 为 45 的触点正在移动时: EV_ABS ABS_MT_SLOT 0 // 这表示“我要上报一个触点信息了”,之前上报过 ID,就不用再上报 ID 了 EV_ABS ABS_MT_POSITION_X x[0] // 触点 X 坐标 EV_SYNC SYN_REPORT 0 // 全部数据上报完毕 松开 ID 为 45 的触点时(在前面 slot 已经被设置为 0,这里这需要再重新设置 slot,slot 就像一个全局变量一样:
如果它
在上面的数据中,为了兼容老程序,它也上报了 ABS_X、ABS_Y 数据,电阻 触摸屏就是使用这类型的数据。所以基于电阻屏的程序,也可以用在电容屏上。 使用两个手指点击触摸屏时,得到类似如下的数据: 图 7.21 双指触摸时打印信息 234 / 577 为了兼容老程序,它也上报了 ABS_X、ABS_Y 数据,但是只上报第 1 个触点 的数据。 7.5 tslib tslib 是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入 设 备 添 加 各 种 “ filter ” ( 过 滤 器 , 就 是 各 种 处 理 ) , 地 址 是 : http://www.tslib.org/。 编译 tslib 后,可以得到 libts 库,还可以得到各种工具:较准工具、测 试工具。 使用 GIT 下载所有源码后,本节源码位于如下目录: