首页 > 其他 > 详细

自己写的触摸屏驱动

时间:2016-01-01 23:08:27      阅读:354      评论:0      收藏:0      [点我收藏+]

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

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

当然还有一种省电模式。

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

技术分享

    在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.启动定时器处理长按/滑动的情况

例子:

技术分享

几种模式

技术分享

上报事件:

            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);


本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1730688

自己写的触摸屏驱动

原文:http://10274409.blog.51cto.com/10264409/1730688

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!