自己写的触摸屏驱动
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);
通过开发板的原理图及数据手册,对触摸屏一章仔细阅读分析,便可以知道怎么使用触摸屏。触摸屏分为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);
相关文章推荐
- [arm 驱动]Linux输入子系统分析
- [arm 驱动]input 子系统架构总结
- ARM11 s3c6410系列教程之五:LCD操作
- Android HID触摸屏驱动怎么开发
- tiny2451 一线屏改四线屏 4000
- ADC采样Q15归一化处理
- Qt4.7.2的移植
- android GestureDetector类及其用法
- 触摸屏是一个符合人体工程学的解决方案吗
- 市人民法院触摸屏开庭信息系统软件
- QT4.5.2移植MC100环境搭建步骤
- [译]消除iphone中onClick事件延时
- 触摸屏驱动笔记
- View的事件分发机制(1)
- ADC和DAC的DNL和INL
- Android手势识别(单击 双击 抬起 短按 长按 滚动 滑动)
- Android Touch事件分发过程
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- tslib移植
- Cocos2dx - 创建半透明层并屏蔽向下触摸