当前位置: 首页 > 范文大全 > 公文范文 >

嵌入式Linux中触摸屏驱动的设计与优化

时间:2022-03-23 09:28:40  浏览次数:

摘要:文章介绍了电阻式触摸屏的工作原理,给出了基于input子系统的触摸屏驱动设计的主要步骤,设计了在TQ2440硬件平台上基于input子系统的嵌入式Linux触摸屏驱动程序,并根据实验测试结果中存在的误差做了改进和优化,使驱动程序能处理长按、滑动,并具有较高的精度。

关键词: 触摸屏;input子系统;嵌入式Linux;驱动程序

中图分类号:TP316文献标识码:A

引 言

触摸屏由于其友好的人机交互性、操作简单、输入响应速度快,大大简化了嵌入式系统的输入而被广泛应用于工业控制、仪器仪表、消费类电子产品等领域[1]。常见的触摸屏有电阻式触摸屏、电容式触摸屏、红外触摸屏以及表面声波式触摸屏四种虽然它们的材料不同,但实现原理都基本一致[8]。Linux操作系统由于开发源代码、内核稳定、易于移植、资源丰富、支持多种硬件平台、免费等优点,而被广泛应用嵌入式领域[5]。ARM处理器因其卓越的性能、良好的扩展性、丰富的文档资料以及丰富的嵌入式软件支持受到越来越多的设计者和学习者所喜爱,从而也使得以ARM处理器和Linux操作系统构造嵌入式系统成为嵌入式系统中的一个重要分支[9]。为了让触摸屏在嵌入式Linux系统中有效工作,需要有触摸屏驱动的支持,随着触摸屏在嵌入式Linux系统中的广泛使用,在触摸屏驱动的设计与研究方面做了大量工作,呈现出越来越多的文献。本文简要介绍了触摸屏的工作原理,详细分析了触摸屏驱动程序的实现框架,设计并实现了在S3C2440A上的触摸屏驱动程序,该驱动通过多种优化算法的结合,实现了较为精确的输入控制。

1 电阻式触摸屏的工作原理及S3C2440触摸屏接口

电阻式触摸屏基本上是薄膜加上玻璃的结构,薄膜和玻璃相邻的一面上均涂有ITO(纳米铟锡金属氧化物)涂层,ITO具有很好的导电性和透明性。当触摸操作时,薄膜下层的ITO会接触到玻璃上层的ITO,经由感应器传出相应的电信号,经过转换电路送到处理器,通过运算转化为屏幕上的X、Y值,从而完成点选的动作,并呈现在屏幕上。常见的电阻式触摸屏有四线触摸屏、五线触摸屏、七线触摸屏、八线触摸屏等,其中四线式最为基本,现以它为例简单介绍其工作原理。四线触摸屏包含两个阻性层,其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线。为了在X轴方向进行测量,将左侧总线偏置为0V,右侧总线偏置为VREF。将顶部或底部总线连接到ADC,当顶层和底层相接触时即可作一次测量。为了在Y轴方向进行测量,将顶部总线偏置为VREF,底部总线偏置为0V。将ADC输入端接左侧总线或右侧总线,当顶层与底层相接触时即可对电压进行测量。对于四线触摸屏,最理想的连接方法是将偏置为VREF的总线接ADC的正参考输入端,并将设置为0V的总线接ADC的负参考输入端。

S3C2440的CMOS模数转换器可以接收8个通道的模拟信号的输入,并将其转换为10位的二进制数据。在2.5MHz的A/D转换时钟下,最大的转换速率可以达到500KSPS。

从图2可知,使用触摸屏时,引脚XP、XM、YP、YM被用于和触摸屏直接相连,剩下的AIN[3:0]可用于一般的ADC输入。当不使用触摸屏时,XP、XM、YP、YM也可以用于一般的ADC输入[5]。有两个中断信号:INT_ADC:表示A/D转换器转换已经结束;INT_TC:表示触摸屏被按下。S3C2440触摸屏控制器有ADC普通转换、独立X/Y轴坐标转换、自动X/Y轴坐标转换、中断等待、闲置五种模式。本文在测量X/Y坐标时,让控制器工作在自动X/Y轴坐标转换模式。该模式下将会自动进行X轴和Y轴的转换操作,随后产生相应的中断。

2 Linux触摸屏驱动设计与优化

2.1 Linux触摸屏驱动设计

Linux设备驱动程序是Linux内核和底层硬件之间的桥梁,为上层应用软件屏蔽了底层硬件的细节[8]。在Linux系统中,键盘、触摸屏、按键、鼠标等设备的驱动程序常推荐利用input输入子系统的接口函数来完成。input输入子系统向应用程序和底层驱动分别提供了统一的接口,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动时,驱动的核心工作是向系统报告键盘、触摸屏、按键、鼠标等输入事件,不再关心文件操作接口,因为input子系统已经完成了文件操作接口,这样提高了驱动程序的通用性。通过input子系统,具体的输入设备驱动只需要完成如下工作[6]:

(1)在模块加载函数中,告知input子系统它可以报告的事件,注册输入设备;

(2)在键被按下/松开、触摸屏被触摸/松开/移动、鼠标被移动/单击/松开时,通过input_report _xxx()报告发生的事件及对应的键值/坐标等状态;

(3)在模块卸载函数中注销输入设备。

因此,本文的触摸屏驱动程序设计也是建立在input子系统之上。以下是基于input子系统的触摸屏驱动程序设计的主要步骤:

(1)在模块加载函数中完成的工作

(2)模块卸载函数中完成的工作

在驱动程序被卸载的时候,会调用该函数,在该函数中常常会完成加载函数相反的工作,如释放中断、释放内存、注销输入设备、删除定时器等。

(3)中断服务函数

2.2 Linux触摸屏驱动优化

通过实验在上报X/Y坐标的地方通过printk()将X/Y坐标(电压值)打印出来,发现即使在同一点点击触摸屏,打印出来的电压值变化也比较大,说明我们的驱动程序实现的精度还较低,为此,需要对其进行某些改进和优化。对于电阻式触摸屏,影响坐标值精度的原因主要有触摸屏自身电阻材料的非均匀性、A/D转换器的精度、触摸屏在按下和松开的抖动等。前两个问题属于器件本身的问题,无法消除,对于第三个问题,我们可以通过对驱动程序的改进和优化来减小误差。

① 首先通过设置adc_regs->adcdly=0xffff等待电压稳定之后再发出IRQ_TC中断;

② 在ADC转换结束后进入INT_ADC中断服务函数后通过adcdat0的第15位来判断触摸屏处于松开还是按下状态,如果是松开状态,则丢弃此次X/Y坐标采样值,而如果ADC结束后触摸屏仍然是按下状态才保留X/Y坐标采样值,并上报;

③ 在上一步的基础上,通过多次测量,然后通过中值滤波等到中间的X/Y坐标,然后上报该坐标,测量次数为奇数。

通过这样的处理,得到的X/Y坐标的误差就明显比较小。但该驱动仍然还不支持长按和滑动的处理。为了支持长按和滑动的处理,我们可以在驱动中增加一定时器,在加载函数中通过以下语句:

加一定时器,并在INT_ADC中断服务函数中,通过mod_timer(&ts_timer, jiffies + HZ/100);函数来启动该定时器,即长按和滑动过程中超过10ms,就会执行定时器处理函数ts_timer_function,进入该函数后,如果触摸屏仍然处于按下状态,则再次进入X/Y测量模式,并启动ADC。

3 Linux触摸屏驱动程序测试

为了测试本文设计的触摸屏驱动程序的正确性,我们在TQ2440硬件平台下,使用奇美3.5英寸液晶屏,以内核Linux-2.6.25.8做测试,在驱动程序的上报X/Y坐标的位置均添加pintk()打印语句把X/Y坐标打印出来。首先通过make menuconfig查看内核配置情况,确认内核中没有其它触摸屏驱动程序。如果有则应将其去掉,重新编译内核,并以该内核心重新启动开发板,然后为本驱动写一makefile文件,内容如下:

该驱动程序和makefile文件应处于同一目录下,然后执行make,如果编译成功,则会在该目录下生成一名为s3c2440_ts_drv.ko的内核模块文件,然后便可以通过网络或串口将该文件传至开发板的根文件系统的根目录下,并执行insmod s3c2440_ts_drv.ko。然后通过触摸笔在触摸屏的不同位置点击,就能通过串口打印出一系列X/Y坐标值。通过比较发现,在驱动改进及优化之后能处理长按和滑动,并且具有较高的精度。

4 结 论

本文在TQ2440上设计了基于input子系统的嵌入式Linux触摸屏驱动程序,并以内核linux-2.6.25.8做了实验测试。实验结果表明,该驱动具有处理长按和滑动的功能,并有较高的精度,为实际应用提供了参考价值。

参考文献

[1] 畅卫功,丁忠林. 嵌入式Linux系统中触摸屏驱动的研究[J]. 微计算机信息,2007,23(2):103-105.

[2] 李春萍,李颉思. 嵌入式Linux中对触摸屏驱动的设计[J]. 计算机工程与设计,2007,28(6):1387-1389.

[3] 朱伟胜,郝卫东 .嵌入式ARM下的触摸屏驱动系统设计[J]. 计算机系统应用,2010,19(9):248-251.

[4] 吕俊霞,杨俊成. 基于嵌入式方式Linux触摸屏驱动程序开发[J]. 核电子学与探测技术,2010,30(7):986-989.

[5] 韦东山. 嵌入式Linux应用程序开发完全手册[M]. 北京:人民邮电出版社,2008.

[6] 宋宝华. Linux设备驱动开发详解[M]. 北京:人民邮电出版社,2008.

[7] 印 盼,赵建军,袁宏攀. 基于TQ2440和Linux的触摸屏驱动研究[J]. 微型机与应用,2011,30(2):75-78.

[8] 於琪建,张海峰. Linux输入子系统在触摸屏驱动上的实现[J]. 机电工程,2009,26(3):32-35.

[9] 陈 辰,韩秋实,徐小力. ARM芯片S3C2410触摸屏驱动的研究与开发[J]. 科学技术与工程,2006,6(3):327-330.

推荐访问: 触摸屏 嵌入式 优化 驱动 设计
[嵌入式Linux中触摸屏驱动的设计与优化]相关文章