微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux系统中触摸屏驱动的研究

嵌入式Linux系统中触摸屏驱动的研究

时间:05-21 来源:互联网 点击:

器设置

request_irq(IRQ_ADC_DONE,ts_down_interrupt,SA_INTERRUPT,g_ts_id,ts_down_interrupt); //申请IRQ_ADC_DONE中断

request_irq(IRQ_TC,ts_up_interrupt,SA_INTERRUPT,g_ts_id,ts_up_interrupt);

//申请IRQ_TC中断

devfs_register_chrdev(0,S3C2410_TS_MODULE_NAME,s3c2410_ts_fops);

//注册file_operations结构

request_irq(IRQ_TIMER1,touch_timer_irq,SA_INTERRUPT,g_ts_timer_id,NULL); //申请IRQ_TIMER1中断

touch_timer_irq(int irq, void *dev_id, struct pt_regs *regs)

//根据状态调用触摸中断,控制数据采样

初始化模块利用内核提供的request_irq函数,将触摸笔的按下与弹起的中断号进行登记,从而将中断号与中断服务函数联系起来;利用devfs_register_chrdev函数,向系统注册一个字符型设备;最后注册定时器中断,用来控制触摸屏的数据采样。

3.2 设置触摸笔的状态及对应的处理

触摸屏的中断服务函数ts_down_interrupt和ts_up_interrupt是根据ADCDAT1和ADCDAT0的设置来选择触摸笔的状态,之后调用触摸屏坐标的数据采样处理函数s3c2410_ts_handler()进行处理。部分代码如下:

static void ts_down_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

if ( (ADCDAT10x8000)|| (ADCDAT00x8000) ) {

pen_data.state = PEN_UP;

}

else {

pen_data.state = PEN_DOWN;

}

s3c2410_ts_handler();}

3.3 获得采样值

触摸笔具有三种工作状态:PEN_UP,PEN_DOWN,PEN_SAMPLE。在采样处理函数中,依据触摸笔的状态,调用 ts_timer_operation()来启动或停止采样定时器,然后调用s3c2410_ts_handler()根据不同的状态进行不同的设置和处理,之后得到不同的采样值。

3.4 对得到的触摸屏的数据进行处理

是调用data_processing()函数来实现的。根据采用下面介绍的中值滤波法来对采样数据进行处理。针对坐标点采样过程中产生的噪声,一般是采用平均法来去除噪声,但是这种方法对于采样数较少,并且个别噪声采样点比较大的时候,取平均值会使最后的结果误差较大,达不到数据处理的要求。故本文采用中值滤波法滤除干扰噪声,进一步地提高采样精度。

中值滤波法的原理如下:首先取奇数个触摸采样数据;之后根据采样数据的大小按照从小到大的顺序进行排列;最后取中间位置的值。此种方法一般在采样点不多,个别采样数据误差又较大的情况下,可以有效地减少误差。具体的过程见图2。

3.5触摸屏的校准

在实际的应用中,通常触摸屏是作为与显示屏配合使用的输入设备,需要从触摸屏采样得到的坐标与屏幕的显示坐标做一个映射。触摸屏和显示屏都是标准的矩形,见3所示。触摸屏的X方向坐标只与显示屏的X方向有关,Y方向只与显示屏的Y方向相关。

假设显示屏的分辨率是W×H,显示区域的左上角对应的触摸屏采样坐标是(x1,y1),右下角对应的坐标是(x2,y2),那么触摸屏上的任意一点采用坐标(x,y)与显示屏坐标(xd,yd)的对应关系可按照如下公式计算:

根据上述的公式计算出实际触摸屏对应的显示坐标,之后就是一个触摸屏的校准过程,本文采用三点校准的方法,与两点校准相比,三点校准的模型考虑到变相和旋转,更接近实际情况。首先选取3个相距较远的3个作为校准输入的采样点,它们相应的触摸屏采样坐标是P0(x0,y0)、P1(x1,y1)、P2(x2,y2),显示坐标是PD0(xD0,yD0)、PD1(xD1,yD1)、PD2(xD2,yD2)。直角坐标平面的两个点P和PD,定义P为触摸屏空间的坐标点, PD为显示屏空间的坐标点,P可以经过旋转、比例和平移得到PD坐标。化简得:

通过上式可以说明PD和P点之间存在一次线性关系满足:xD=Ax+By+C yD=Dx+Ey+F

对于同一个设备,其中的A、B、C、D、E、F为常数,称为校准常数,故只需在触摸屏校准时,解出这6个常数,就可以实现触摸屏空间到显示空间的转换。

3.6 中断的释放和注册模块的卸载

是调用s3c2410_ts_cleanup_module()来实现的,分别释放在初始化过程中,申请的IRQ_TIMER1、IRQ_ADC_DONE、IRQ_TC的中断和字符设备的接口函数devfs_register_chrdev(),具体如下:

free_irq(IRQ_TIMER1,g_ts_id);

free_irq(IRQ_ADC_DONE,g_ts_id);

free_irq(IRQ_TC,g_ts_timer_id);

devfs_unregister_chrdev(gMajor, H3600_TS_MODULE_NAME); //卸载字符设备

4结束语

本文作者创新点: 结合实际的硬件平台,详细地介绍基于嵌入式Linux操作系统下触摸屏驱动程序的开发过程,改进了处理采样数据的方法,最后改进了常用的校准方法。使该触摸屏驱动更能满足实际的要求,该触摸屏驱动程序已用于实际的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top