tag 标签: 电阻式触摸屏

相关博文
  • 热度 22
    2013-9-25 20:47
    1301 次阅读|
    0 个评论
    摘要: 本文介绍了基于三星S3C2410X微处理器,采用SPI接口与ADS7843触摸屏控制器芯片完成触摸屏模块的设计。具体包括在嵌入式Linux操作系统中的软件驱动开发,采用内核定时器的下半部机制进行了触摸屏硬件中断程序设计,采用16个时钟周期的坐标转换时序,实现触摸点数据采集的方法,给出了坐标采集的流程。设计完成的触摸屏驱动程序在博创公司教学实验设备UP-NETARM2410-S平台上运行效果良好。 引言 随着信息家电和通讯设备的普及,作为与用户交互的终端媒介,触摸屏在生活中得到广泛的应用。如何在系统中集成触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题。本文主要介绍在三星S3C2410X微处理器的硬件平台上进行基于嵌入式Linux的触摸屏驱动程序设计。 硬件实现方案 SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X是三星推出的自带触摸屏接口的ARM920T内核芯片,ADS7843为Burr-Brown生产的一款性能优异的触摸屏控制器。本文采用SPI接口的触摸屏控制器ADS7843外接四线电阻式触摸屏,这种方式最显著的特点是响应速度更快、灵敏度更高,微处理器与触摸屏控制器间的通讯时间大大减少,提高了微处理器的效率。ADS7843与S3C2410的硬件连接如图1所示,鉴于ADS7843差分工作模式的优点,在硬件电路中将其配置为差分模式。 图1 触摸屏输入系统示意图 嵌入式Linux系统下的驱动程序 设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序。 设备驱动在加载时首先需要调用入口函数init_module(),该函数完成设备驱动的初始化工作。其中最重要的工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建立起与文件系统的关联。字符设备驱动程序向Linux内核注册登记时,在字符设备向量表chrdevs中增加一个device_struct数据结构条目,这个设备的主设备标识符用作这个向量表的索引。向量表中的每一个条目,即一个device_struct数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一个都处理特定的文件操作,比如打开、读写和关闭。所谓登记,就是将由模块提供的file_operations结构指针填入device_struct数据结构数组的某个表项。登记以后,位于上层的模块(内核)可以“看见”这个模块了。但是,应用程序却还不能“看见”它,因而还不能通过系统调用它。要使应用程序能“看见”这个模块或者它所驱动的设备,就要在文件系统中为其创建一个代表它的节点。通过系统调用mknod()创建代表此项设备的文件节点——设备入口点,就可使一项设备在系统中可见,成为应用程序可以访问的设备。另外,设备驱动在卸载时需要回收相应的资源,令设备的相应寄存器值复位并从系统中注销该设备。 Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。设备驱动模块的功能就是扩展内核的功能,主要完成两部分任务:一个是系统调用,另一个是处理中断。图2是一个设备驱动模块动态挂接、卸载和系统调用的全过程。系统调用部分则是对设备的操作过程,比如open,read,write,ioctl等操作,设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file 数据结构。内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数,结构中的每一个成员都对应着一个系统调用。在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、open、ioctl及release就可以完成应用系统需要的功能。写驱动程序的任务之一就是完成file_operations中的函数指针。 触摸屏驱动程序设计 触摸屏驱动程序中重要数据结构 typedef struct { unsigned short pressure; unsigned short x; unsigned short y; unsigned short pad; } TS_RET; typedef struct { unsigned int PenStatus; TS_RET buf ; unsigned int head, tail; wait_queue_head_t wq; spinlock_t lock; } TS_DEV; static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read, release: s3c2410_ts_release, poll: s3c2410_ts_poll, }; 在程序中有三个重要的数据结构:用于表示笔触点数据信息的结构TS_RET,表示ADS7843中有关触摸屏控制器信息的结构TS_DEV,以及驱动程序与应用程序的接口file_operations结构的s3c2410_fops。 TS_RET结构体中的信息就是驱动程序提供给上层应用程序使用的信息,用来存储触摸屏的返回值。上层应用程序通过读接口,从底层驱动中读取信息,并根据得到的值进行其他方面的操作。 TS_DEV结构用于记录触摸屏运行的各种状态,PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf 是用来存放数据信息的事件队列,head、tail分别指向事件队列的头和尾。程序中的笔事件队列是一个环形结构,当有事件加入时,队列头加一,当有事件被取走时,队列尾加一,当头尾位置指针一致时读取笔事件的信息,进程会被安排进入睡眠。wq等待队列,包含一个锁变量和一个正在睡眠进程链表。当有好几个进程都在等待某件事时,Linux会把这些进程记录到这个等待队列。它的作用是当没有笔触事件发生时,阻塞上层的读操作,直到有笔触事件发生。lock使用自旋锁,自旋锁是基于共享变量来工作的,函数可以通过给某个变量设置一个特殊值来获得锁。而其他需要锁的函数则会循环查询锁是否可用。MAX_TS_BUF的值为16,即在没有被读取之前,系统缓冲区中最多可以存放16个笔触数据信息。 s3c2410_fops就是内核对驱动的调用接口,完成了将驱动函数映射为标准接口。上面的这种特殊表示方法不是标准C的语法,而是GNU编译器的一种特殊扩展,它使用名字进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。 init_module函数 这是模块的入口函数。在函数内部通过s3c2410_ts_init( )实现模块的初始化工作。在本设计中设备与系统之间以中断方式进行数据交换。整个触摸屏的驱动程序处理比较复杂,而且耗时较长,因而触摸屏驱动程序不可能在中断服务程序中完成。在Linux操作系统中一般把中断处理切为两个部分或两半。中断处理程序是上半部——接收到一个中断,它就立即开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件。这些工作都是在所有中断被禁止的情况下完成的,能够被允许稍后完成的工作会推迟到下半部去。在Linux中下半部的实现有多种机制。按触摸屏时,从ADS7843输出的数值有一个抖动过程,即从ADS7846输出的数值有一个不稳定时期,这个过程大约为10ms。所以中断处理程序的下半部处理函数采用内核定时器机制,使下半部在中断发生50ms后再作处理。这样有效地避开了ADS7843输出值的不稳定时期,使中断服务程序和中断处理任务串行化,达到了处理时间较长的触摸屏事件的目的。驱动程序通过request_irq函数注册并激活一个中断处理程序,以便处理中断。 图2 设备驱动在内核中的挂接、卸载和系统调用过程 int reguest_irq(unsigned int irq, void(*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char *dev_name, void *dev_id) 参数irq表示所要申请的中断号;handler为向系统登记的中断处理子程序,中断产生时由系统来调用;dev_name为设备名;dev_id为申请时告诉系统的设备标识符;irq_flags是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序还是慢速处理程序。 本设计中触摸屏控制器ADS7843的中断输出通过外部中断5接在中断控制器上,当触摸屏上有触摸事件发生时,会引发中断号为IRQ_EINT5的中断服务程序s3c2410_isr_tc()。图3所示为该中断处理程序的流程图。 图3 触摸屏硬件中断处理程序流程图 在s3c2410_isr_tc()中设定了定时器的定时时间为50ms,并立即激活。因此有触摸屏硬件中断的情况下50ms后就会引发定时中断,中断服务程序为ts_timer_handler(),这个程序实现了触摸屏中断的下半部,即在过了抖动时间之后如果触摸屏确实有有效事件发生则采集触摸屏坐标,并将定时器的时间重新设为100ms并重新激活,这样做的目的是如果触摸笔是拖动的情况,以后每100ms采集一次坐标值,并存入缓冲区,如果不是拖动在采集一次坐标值之后,在第二次进入ts_timer_handler()时,查询管脚的状态值,则变为高电平,就将触摸屏状态tsdev.PenStatus设为PEN_UP,并释放定时器,为下次触摸屏事件做好准备,定时中断服务程序流程图如图4所示。 图4 定时中断服务程序流程图 在s3c2410_ts_init()中的另一个重要任务是执行接口函数s3c2410_ts_open(),在这个函数中初始化缓冲区的头尾指针、触摸屏状态变量及触摸屏事件等待队列。 module_exit() 该函数调用s3c2410_ts_exit(),主要任务是撤销驱动程序向内核的登记以及释放申请的中断资源。 接口函数s3c2410_ts_read( ) 这个函数实现的任务是将事件队列从设备缓存中读到用户空间的数据缓存中。实现的过程主要是通过一个循环,只有在事件队列的头、尾指针不重合时,才能成功的从tsdev.tail指向的队列尾部读取到一组触摸信息数据,并退出循环。否则调用读取函数的进程就要进入睡眠。 坐标读取函数s3c2410_get_XY() 在定时器中断处理程序中,当查询到与相连的EINT5/GPF5为低电平时,即表示有有效事件,应该调用s3c2410_get_XY()函数采集笔触信息。 ADS7843有多种转换时序,时序规定了芯片与设备及CPU间是如何配合工作的。设计中采用16个时钟周期启动一次转换的坐标转换方式。ADS7843的操作时序如图5所示。坐标的读取是通过多次采集取平均值的方法,以X坐标的读取为例,其读取过程如图6所示。循环过程中的每一步都在8个时钟周期内完成,数据的处理严格按照时序进行,Y坐标的采集与X坐标类似。 图5 ADS7843操作时序 图6 X坐标采集流程 结语 在触摸屏的设计中,抗干扰设计是难点和重点,直接关系到触摸屏的工作性能。实验发现坐标采集时,丢弃第一次采集值读取的坐标转换值效果较好。本文所介绍的驱动程序已经在博创公司的教学实验设备UP-NETARM2410-S平台上经过实际验证,从数据稳定性和系统负载的角度看,效果良好。同时通过修改程序内部的定时器时钟频率可以改变笔在屏上移动所产生的数据量。 参考文献: 1. 毛德操,胡希明著.Linux内核源代码情景分析.杭州:浙江大学出版社,2001 2. 孙天泽,袁文菊,张海峰等.嵌入式设计及Linux驱动开发指南.北京:电子工业出版社,2005 3. R Love. Linux内核设计与实现. 陈莉君,康华,张波等译.北京:机械工业出版社,2006 4. 殷惠莉,刘少君,黄道平.基于uClinux触摸屏的设计.电子工程师.2004(2)
  • 热度 22
    2012-6-15 09:27
    988 次阅读|
    1 个评论
            如今,在各种手持消费电子设备、医疗应用设备、自动售货机/售票机/ ATM机、销售终端(POS),工业和过程控制设备中都可以看到触摸显示屏。触摸屏显示器正逐渐进入办公自动化,汽车和船舶仪表,家电和游戏机应用领域。 影响选择触摸屏技术的各种因素 可以用各种方式实现触摸屏。除了成本之外,技术方面的选择取决于以下几个因素: 性能: 性能包括诸如速度、灵敏度、精确度、分辨率、拖动、Z轴、双/多触摸方式,视差角度和校准的稳定性。 输入灵活性: 输入灵活性参数影响着人机交互的方式,诸如手套、手套材料、指甲、触笔,手写识别和获取签名。 环境: 环境因素为温度、湿度、耐化学性、耐划伤、防飞溅/液滴、高度、车内安装、冲击、振动,断裂性和防打破的安全性。 电气和机械性能: 电气和机械性能需要涵盖功率、浮动接地、静电放电(ESD)、电磁干扰(EMI),尺寸大小,曲率等 光学: 影响技术选择的光学特性包括透光率、清晰度,色彩纯度和反射 触摸屏技术的类型 根据上面所述的各种因素,主要触摸屏技术可分为以下几种类型: 电阻式: 从目前的推广应用来看,电阻式触摸屏是占主导地位的触摸技术。它由玻璃面板,铱锡氧化物(ITO)电阻涂层组成,并带有导电涂层的护板,沿着边缘有银色的总线条。两个层之间用绝缘小点隔开。触摸屏幕时,护板弯曲与玻璃上的涂膜相接触(图1)。     图1:电阻式触摸技术。         该控制器可选择驱动玻璃层和+5 V的护板,并读取源于护板和玻璃层产生的电压,根据被测量层中的压降来确定X和Y坐标。该技术需要四线 – 前面提到的总线条,这被称为4线电阻式触摸屏技术。         由于护板的不断弯曲,造成ITO涂膜中有微小的裂缝。会使4线电阻式触摸屏技术的线性度和精确度变差,环境变化也会造成精度的漂移。 已经用不断改进的5,6,7和8线电阻式触摸屏来消除这些影响。 声学脉冲识别(APR)式: APR由一个玻璃显示器涂层或其他坚硬的基板组成,背面安装了4个压电传感器。该传感器安装在可见区域的两个对角上,通过一根弯曲的电缆连接到控制卡。用户触摸屏幕时,手指或者触笔和玻璃之间的拖动发生了碰撞或摩擦,于是就产生了声波。波辐射离开接触点传向传感器,按声波的比例产生电信号。在控制卡中放大这些信号,然后转换为数字数据流。比较数据与事先存储的声音列表来确定触摸的位置。APR设计成能够消除环境的影响和外部的声音,因为这些因素与存储的声音列表不匹配。 表面声波(SAW)式: SAW触摸屏是由一个针对X和Y轴的有发送和接收的压电传感器的玻璃涂层。该控制器发送电信号至发射传感器,并在玻璃的表面内将信号转换成超声波。通过反射器阵列,这些波覆盖整个触摸屏。对面的反射器收集和控制这些波至接收传感器,将他们转换成电信号。对每个轴重复这个过程。用户触摸时吸收了传播的波的一部分。 接收到的对应X和Y坐标的信号与存储的数字分布图相比较,从而识别变化并计算出坐标。 电容式: 电容式触摸屏技术可以进一步细分为表面电容式和投射电容式。表面电容式技术是在玻璃面板上涂有相同的导体。围绕面板边缘的电极在整个导电层平均分配低电压,建立一个相同的电场。触摸时就会从各个角上得到电流。该控制器测量从各个角上获得的电流比,从而计算出触摸的位置。         投射电容式触摸屏由两个玻璃保护层之间的传感器网格微细线组成。部件可以放置于用户安装的材料后面,包括防暴的厚达18毫米的玻璃。触摸时,手指和传感器之间构成了电容。从改变的传感器栅格的电气特性就可计算出触摸位置。 红外/光学式: 高分辨率红外(IR)技术使用一个围绕显示器的小框,上面有表面安装的LED,对边有光感受器,红外透明边框隐藏在后面。该控制器连续发送LED,以此来构建一个红外光扫描网格。触摸时就会阻挡每个轴上的一束或多束红外光,这样就可确定相应的X,Y坐标。 上述主要的触摸屏技术的突出优点和典型应用总结在表1之中。 表1:不同触摸技术的优点和应用。 液晶触摸屏控制中的可编程逻辑         对于触摸技术的类型、显示器的类型和显示器制造商,液晶显示器的接口往往是不同的。对设备的设计人员而言,常常难以在其产品线上选择一个显示控制器芯片以适应所有不同的显示器。越来越多从事设计配有触摸屏液晶面板的人机界面(HMI)系统集成的设计人员转向使用可编程逻辑器件,以实现他们所需的灵活性。现场可编程门阵列(FPGA)技术使得系统架构师一次就能够确定人机界面控制器的架构,同时能够扩展到整个产品系列,可采用不同的微控制器、CPU,液晶面板以满足各种应用。 FPGA技术还可以很容易实现高性能的矢量图形,以及用单芯片与现实世界接口。        莱迪思的LCD - Pro是专门为基于FPGA的高级触摸屏视频图形控制器而设计的,为系统设计者提供单个人机界面结构,加速产品的上市,并大大节省了开发成本。与现有的IP配合在一起,LCD – Pro简化了设计,设计人员能够更快的推出新产品,从而适应新兴市场的要求,而不需要重新设计平台。 (本文转自电子工程世界:http://www.eeworld.com.cn/dygl/2012/0506/article_12020.html)