产品推荐:水表|流量计|压力变送器|热电偶|液位计|冷热冲击试验箱|水质分析|光谱仪|试验机|试验箱


仪表网>技术中心>使用指南>正文

欢迎联系我

有什么可以帮您? 在线咨询

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

   2012年05月22日 16:48  
  引言
  
  随着计算机相关技术的发展,嵌入式系统的应用越来越广泛,与人们生活紧密结合。触摸屏设备因其友善的人机交互性,操作方便灵活,输入速度快,被广泛的应用于嵌入式领域中。嵌入式Linux系统具有开发源代码、内核稳定、可裁减性等特点,吸引着众多商业公司和自由软件的目光,成为嵌入式系统领域*的操作系统之一。触摸屏是一种输入设备,操作简单易学,不占额外的空间,可靠性高,是zui常用的便携式系统的输入设备。特别是电阻式触摸屏结构简单,成本低,透光效果好,工作环境和外界*隔离,不怕灰尘和水气,同时具有高解析度,高速传输反应,一次校正,稳定性高,不漂移等特点,因而广泛用于工业控制领域及在室内使用。
  
  1、硬件平台
  
  S3C2410是Samsung公司基于ARM920T核心的一款MCU,集成了众多的外围设备,其中包括4线电阻式触摸屏控制器、8路模拟输入通道。在8路A/D转换通道中,A[5]和A[7]作为触摸屏的X、Y坐标的采集通道。S3C2410与4线电阻式触摸屏连接的电路原理图见图1。
  
  在采样过程中,只需要通过读写一系列的特殊寄存器,S3C2410的触摸屏控制器就会自动控制触摸屏接口打开或关闭各MOS管,按顺序完成触摸屏X、Y坐标数据的采集。
  
  图1S3C2410连接4线电阻式触摸屏电路原理图
  
  2、Linux设备驱动程序简介
  
  设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,主要完成以下功能:对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应用程序数据传送给设备文件和回送应用程序请求的数据;检测和处理硬件设备出现的错误。
  
  Linux操作系统的设备有字符设备、块设备和网络设备等。字符设备是以单个字节为单位进行顺序读写操作,通常不使用缓存技术,例如鼠标、键盘等。块设备的读写都使用缓存技术来支持,并且必须能够进行随机存取,主要是针对磁盘等慢速设备设计的。网络设备主要基于BSD的Socket机制,为发送数据和接收数据提供缓存技术,提供对多协议的支持,例如以太网卡等。
  
  3、Linux触摸屏驱动程序实现
  
  在Linux系统中,设备驱动程序是一组相关函数的集合。它包括设备服务子程序和中断处理程序。设备服务子程序包含了所有与设备相关的代码,每个设备服务子程序只处理一种设备或者紧密相关的设备,从设备无关的软件中接受抽象的命令并执行。当执行一条请求时,具体操作是根据控制器对驱动程序提供的接口,并利用中断机制去调用中断服务子程序配合设备完成这个请求。设备驱动程序利用结构file_operations与文件系统起来,设备的各种操作的入口函数放在结构file_operations中,其中包括open()、release()、read()和write()等接口,简化了驱动程序的编写工作。这样,应用程序根本不必考虑操作的是设备还是普通文件,可一律看作文件处理,具有非常清晰统一的I/O接口。触摸屏的file_operations结构定义如下:
  
  staticstructfile_operationss3c2410_ts_fops={
  
  owner:THIS_MODULE,
  
  read:s3c2410_ts_read,
  
  poll:s3c2410_ts_poll,
  
  ioctl:s3c2410_ts_ioctl,
  
  open:s3c2410_ts_open,
  
  release:s3c2410_ts_release,
  
  fasync:s3c2410_ts_fasync,};
  
  在触摸屏设备驱动程序的开发中,全局变量structs3c2410_ts_deviceglobal_ts是很重要的,用来保存触摸屏的相关参数、等待处理的消息队列、当前采样数据、上一次采样数据等信息,数据结构structs3c2410_ts_device的定义如下:
  
  structs3c2410_ts_device{//管理触摸屏类
  
  structs3c2410_ts_generald;//触摸屏设置参数
  
  structs3c2410_ts_calibrationcal;//校正触摸屏参数
  
  structs3c2410_ts_eventbuf[MOUSEBUF_SIZE];//等待处理缓冲队列
  
  structs3c2410_ts_eventcur_data,samples[3],last_data;};
  
  //当前采样数据,采样原始数据,上次采样数据
  
  在了解上面概念之后,编写触摸屏驱动的实际工作并不复杂,需要做如下工作:
  
  3.1模块初始化函数
  
  是调用s3c2410_touchscreen_moudle_init()来实现的,主要完成触摸屏设备的内核模块加载、初始化、中断注册、设备注册等工作,主要涉及到的过程如下:
  
  ADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
  
  //触摸屏ADCTSC的设置
  
  ADCDLY=ADC_DELAY_TIME;//触摸屏开始和间隔延时
  
  ADCCON=(1<<14)|(PreScale_n<<6)|(7<<3)|(0<<2)|(0<<1)|(0);
  
  //触摸屏控制器设置
  
  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(intirq,void*dev_id,structpt_regs*regs)
  
  //根据状态调用触摸中断,控制数据采样
  
  初始化模块利用内核提供的request_irq函数,将触摸笔的按下与弹起的中断号进行登记,从而将中断号与中断服务函数起来;利用devfs_register_chrdev函数,向系统注册一个字符型设备;zui后注册定时器中断,用来控制触摸屏的数据采样。
  
  3.2设置触摸笔的状态及对应的处理
  
  触摸屏的中断服务函数ts_down_interrupt和ts_up_interrupt是根据ADCDAT1和ADCDAT0的设置来选择触摸笔的状态,之后调用触摸屏坐标的数据采样处理函数s3c2410_ts_handler()进行处理。部分代码如下:
  
  staticvoidts_down_interrupt(intirq,void*dev_id,structpt_regs*regs)
  
  {
  
  if((ADCDAT1&0x8000)||(ADCDAT0&0x8000)){
  
  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()函数来实现的。根据采用下面介绍的中值滤波法来对采样数据进行处理。针对坐标点采样过程中产生的噪声,一般是采用平均法来去除噪声,但是这种方法对于采样数较少,并且个别噪声采样点比较大的时候,取平均值会使zui后的结果误差较大,达不到数据处理的要求。故本文采用中值滤波法滤除干扰噪声,进一步地提高采样精度。
  
  中值滤波法的原理如下:首先取奇数个触摸采样数据;之后根据采样数据的大小按照从小到大的顺序进行排列;zui后取中间位置的值。此种方法一般在采样点不多,个别采样数据误差又较大的情况下,可以有效地减少误差。具体的过程见图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+CyD=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操作系统下触摸屏驱动程序的开发过程,改进了处理采样数据的方法,zui后改进了常用的校准方法。使该触摸屏驱动更能满足实际的要求,该触摸屏驱动程序已用于实际的嵌入式产品中,运行稳定可靠,具有很好的发展前景和社会经济效益。

免责声明

  • 凡本网注明“来源:仪表网”的所有作品,均为浙江兴旺宝明通网络有限公司-仪表网合法拥有版权或有权使用的作品,未经本网授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:仪表网”。违反上述声明者,本网将追究其相关法律责任。
  • 本网转载并注明自其它来源(非仪表网)的作品,目的在于传递更多信息,并不代表本网赞同其观点或和对其真实性负责,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品第一来源,并自负版权等法律责任。
  • 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
联系我们

客服热线: 15267989561

加盟热线: 15267989561

媒体合作: 0571-87759945

投诉热线: 0571-87759942

关注我们
  • 下载仪表站APP

  • Ybzhan手机版

  • Ybzhan公众号

  • Ybzhan小程序

企业未开通此功能
详询客服 : 0571-87759942