您的位置:首页 > 其它

自己写的触摸屏驱动

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

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


当然还有一种省电模式。
当要测量xy位置坐标时,原理大概如图:



在Linux中,触摸屏驱动也是依据输入子系统实现的,所以一般步骤为:
1.分配一个input_dev结构体
2.设置能产生哪一类事件以及这类事件中的哪些事件。(按键类(触摸按键事件),相对位移类(x/y绝对位移,绝对位移压力))
3.利用input_register_device注册
4.硬件相关操作
硬件操作的主要操作有:
设置分频系数和 ADCDLY

注册INT_TC中断和AD中断

使能时钟

测量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.启动定时器处理长按/滑动的情况
例子:



几种模式



上报事件:
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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息