触摸屏在现代生活中普遍使用,它通过压力或其他事件判断屏幕被触摸,从而将数据输入、上报给系统处理。触摸屏并不是lcd,而是在lcd上表面有一层adc,它的规格大小跟lcd屏幕大小一样,而且厚度很薄,所以会让我们误以为触摸屏就是lcd本身。

    通过开发板的原理图及数据手册,对触摸屏一章仔细阅读分析,便可以知道怎么使用触摸屏。触摸屏分为4种模式:wKiom1aGSpKDuEYtAAElk7JSBSQ378.png

当然还有一种省电模式。

当要测量xy位置坐标时,原理大概如图:

wKioL1aGSxjRhFkpAABfF0f_qKk008.png

    在Linux中,触摸屏驱动也是依据输入子系统实现的,所以一般步骤为:

1.分配一个input_dev结构体

2.设置能产生哪一类事件以及这类事件中的哪些事件。(按键类(触摸按键事件),相对位移类(x/y绝对位移,绝对位移压力))

3.利用input_register_device注册

4.硬件相关操作

硬件操作的主要操作有:

  1. 设置分频系数和 ADCDLY

  2. 注册INT_TC中断和AD中断

  3. 使能时钟

  4. 测量xy坐标时还需要启动adc


总结:

判断触摸屏被按下还是松开,是根据寄存器ADCDAT0的第15位,这一位如是为1,则是被松开,为0则是被按下

在测量xy坐标时,读取ADCDAT0的低10位,即可得到x的坐标,读取ADCDAT1的低10位,即可得到y坐标

如何处理触摸屏被长按或滑动的情况?启动定时器!

如何上报触摸屏事件:

上报事件

input_report_abs(struct input_dev *dev, unsigned int code, int value);

input_report_key(struct input_dev *dev, unsigned int code, int value);

如:

input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);

input_report_key(s3c_ts_dev, BTN_TOUCH, 0);

input_sync(s3c_ts_dev);

触摸屏的数据如何更精确?

优化措施:

1.设置ADCDLY为最大值, 这使得电压稳定后再发出IRQ_TC中断

2.如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果

3.多次测量求平均值

4.软件过滤

5.启动定时器处理长按/滑动的情况

例子:

wKioL1aGT3ChZhwdAAKGDgcKbtc509.png

几种模式

wKiom1aGT8mzE1n_AACfBexN1FA576.png

上报事件:

            input_report_abs(myts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);

input_report_abs(myts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);

input_report_abs(myts_dev, ABS_PRESSURE, 1);

input_report_key(myts_dev, BTN_TOUCH, 1);

input_sync(myts_dev);