基于μClinux的触摸屏设计与关键技术分析

发布者:古宝奇缘最新更新时间:2008-08-22 来源: 计算机工程与设计关键字:Clinux  触摸屏控制器  中断处理程序  驱动程序  ioctl  设备号  控制函数  控制字  函数指针 手机看文章 扫描二维码
随时随地手机看文章

  摘要:本文介绍了当前比较流行的开放源代码的嵌入式操作系统μClinux下驱动程序的一般结构,以及触摸屏控制器和Motorola DragonBallMCVZ328 CPU的连接。在此基础上,详细讲述了触摸屏驱动程序设计的一些关键技术,如阻塞型I/O操作、任务队列以及系统定时器的应用等,解决了采样数量控制问题,具有较好的移植性。

  关键词:嵌入式操作系统;μClinux;触摸屏;驱动程序

  1引言

  1.1背景介绍

  随着信息技术的发展,嵌入式系统越来越广泛地应用到航空航天、通讯设备、工业控制等领域。由于尺寸的限制,触摸屏代替键盘和鼠标成为嵌入式系统首选的输入工具。同时嵌入式系统也逐渐摒弃了传统的循环控制模式,而是引入操作系统完成进程间切换和任务调度。μClinux就是一种优秀的开放源代码的嵌入式操作系统。它经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux,虽然它的体积很小,μClinux仍然保留了Linux的大多数优点:稳定良好的移植性、优秀的网络功能、完备的对各种文件系统的支持以及标准丰富的API。比较起其它几种应用较多的嵌入式操作系统,像vxworks、winCE等,它较为低廉的价格以及方便的用户程序开发,无疑是其巨大的优势。用户可以方便地从互联网上找到最新内核版本、编译器以及其它必需的软件环境,这也促使众多爱好者加盟。

  1.2研究现状

  由于触摸屏使用得越来越广泛,所以相应的研究与工程实践比较多。在现有的工作中,已有很多工程师对触摸屏控制器ADS7846与StrongARM平台的硬件连接以及在WinCE操作系统中软件驱动程序开发进行了研究,并对改进触摸屏控制器硬件精度上做了一定探索。而本文的主要贡献在于详细描述了在μClinux这一嵌入式操作系统中触摸屏驱动程序硬件及软件设计。实践证明,这一设计具有比较高的精度、稳定性和开放性,而且跨平台性也较好,因此必将给嵌入式设备提供更多选择。

  2硬件设计

  本设计中硬件平台微处理器选用Motorola公司的MC68VZ328,它是一款M68k体系的32位低功耗微处理器,采用SoC技术设计,具有典型的嵌入式微处理器的特征;触摸屏选用TI(原为Burr-Brown公司的产品,由于该公司已被TI公司收购,所以下文均用TI公司)公司的ADS7843。在本设计中,CPU与触摸屏以主从方式工作,触摸屏工作于从设备(slave)状态。本设计中硬件电路不同于传统设计,而是充分利用了ADS7843中的BUSY信号线,如图1所示。

  

  ADS7843是一款四线电阻式触摸屏控制芯片,它主要完成两件事情:其一,是完成电极电压的切换;其二,是采集接触点处的电压值。它由两层透明的阻性导体层组成,在导体层中间充满了用粘性绝缘液体材料做成的隔离层和由导电性能极好的材料构成的电极。

  触摸屏工作时,上下导体层相当于电阻网络,如图2所示。当某一层电极加上电压时,会在该网络上形成电压梯度。若有外力使得上下两层在某一点接触,则在电极未加电压的另一层可以测得接触点处的电压,从而知道接触点处的坐标。比如,若在顶层的电极(X+、X-)上加上电压,则在顶层导体层上形成电压梯度;当有外力使得上下两层在某一点接触,在底层就可以测得接触点处的电压,再根据该电压与电极(X+)之间的距离关系,知道该处的X坐标。然后,将电压切换到底层电极(Y+、Y-)上,并在顶层测量接触点处的电压,从而知道Y坐标。对电压在横向和纵向导体层之间的切换以及A/D转换,需要先通过串行外设接口(SPI)往ADS7843发送控制字,转换完成后再通过SPI读出电压转换值。

  

  3软件设计

  3.1μClinux下驱动程序的特点

  μClinux继承了Linux的设备管理方法,将所有的设备看做具体的文件,通过文件系统层对设备进行访问。所以在Clinux的框架结构中,和设备相关的处理可以分为两个层次——文件系统层和设备驱动层。设备驱动层屏蔽具体设备的细节,文件系统层则向用户提供一组统一的规范的用户接口。这种设备管理方法可以很好地做到“与设备无关性”,使Clinux可以根据硬件外设的发展进行方便的扩展,比如要实现一个设备驱动程序,只要根据具体的硬件特性向文件系统提供一组访问接口即可。

  μClinux中的设备可以分为3类:字符设备、块设备和网络设备。其中字符设备没有缓冲区,数据的处理是以字节为单位按顺序进行的,它不支持随机读写,触摸屏即属于字符设备的一种。

  驱动程序在内核中装载的方式有两种:一种是直接编译进内核,在系统初始化的时候就对设备进行注册;一种是模块化加载的方法,将驱动程序编译成目标文件(*.o),需要添加设备时,使用insmod命令向系统注册,停止使用时,用rmmod命令卸载。对于触摸屏这种基本的输入工具,建议采取直接编译进内核的方式,这样系统一启动就可以使用了。

  向内核注册一个字符设备的函数为:externintregister_chrdev(unsignedintmajor,constchar*name, structfile_operations*fops);内核用主设备号和次设备号惟一地标识一个设备。参数major对应所请求的主设备号,name对应设备的名字,fops是一个指向file_operations结构的指针,它是Clinux下编写驱动程序用到的一个关键的数据结构,它提供了应用空间与驱动程序的调用接口。这个数据结构的每一项都指向驱动程序完成的一个功能。

  在2.4版本内核中对该结构采取标记结构初始化语法(TaggedStructureInitializationSyntax),与2.0内核比较,这种语法可移植性更好,程序的可读性和代码的紧凑性都比较好。以触摸屏为例:

  static struct file_operations ts_fops={

  owner:THIS_MODULE,

  read:ts_read, //读数据操作

  poll:ts_poll, //非阻塞操作

  ioctl:ts_ioctl, //I/O控制操作

  open:ts_open, //打开设备

  release:ts_release, //释放设备

  fasync:ts_fasync, //异步触发}

  完整的结构还包括llseek、readdir等函数指针,只是由于在本程序中没有用到,所以省略不写,内核把它们默认为空(NULL)。

  3.2触摸屏驱动程序的流程及关键函数

  在本设计中,我们使用μClinux2.4内核。驱动程序主要设计思想是:驱动程序在初始化结束后,进入空闲状态,等待中断的到来。一旦笔中断(pen_irq)发生,则进入中断处理程序,进行数据采样、转换和传输,同时,程序对各种不同的情况进行鉴别和异常处理。

  触摸屏软件流程如图3所示。在驱动程序中设定了触摸屏所处的7个不同状态,分别用从-1到5的数字表征,这7个状态构成了一个触摸屏状态机,系统根据当前状态做出下一步的处理,如表1所示。整个软件设计根据功能可以划分为5个部分,分别是初始化、设备打开、读操作、中断处理以及I/O控制,下面具体介绍每一部分。

  

  

  3.2.1驱动程序初始化

  在mc68328digi_init()中向内核注册设备驱动函数:err=misc_register(&mc68328_digi),在init_ts_settings()中设定触摸屏的当前参数:内核版本号、笔移动判别阈值、采样时间、消除抖动开关、消除抖动时间等参数,这些均由用户根据自己的液晶屏以及精度要求来定制,也可以在应用程序中用I/O控制函数ioctl()来设定,本文将在参数分析中具体分析这些参数的意义。

  3.2.2打开设备

  在ts_open()函数中,驱动程序向内核注册中断。中断也可以在系统初始化的时候向内核注册,但是一般不建议这样做,因为在加载的设备比较多时,这样做有可能造成中断的冲突。打开一个设备,才让该设备占用中断,是一个较好的策略。向内核注册中断处理程序主要实现两个功能,一是注册中断号,二是注册中断处理函数。

  本程序中,向内核注册了两个中断处理程序,分别是:

  request_irq(PEN_IRQ_NUM, handle_pen_irq,IRQ_FLG_STD,

  “touch_screen”,NULL)和request_ irq(SPI_IRQ_NUM,handle_spi_irq, IRQ_FLG_STD,“spi_irq”,NULL);

  在前者中,PEN_IRQ_NUM是中断号,可以指定,也可以动态分配。在该驱动程序中,指定笔中断分配中断号为19;handle_pen_irq是中断处理函数,IRQ_FLG_STD是申请时的选项,它决定中断处理程序的一些特性,这里表示由系统内部占用;touch_ screen是设备名。在后者中,程序向内核注册SPI中断,用来在CPU和外设间传递数据,分配的中断号是0,handle_spi_irq是SPI中断处理函数。

  此外,在触摸屏驱动初始化子函数init_ts_drv()中,进行了如下工作:

  (1)触摸屏状态的初始化;

  (2)笔信息(pen_values)的初始化;

  (3)初始化定时器并设置超时函数handle_timeout();

  (4)初始化寄存器。初始化等待队列,等待队列是由等待触摸事件发生的进程组成的一个队列,它包括头尾指针和一个正在睡眠进程的链表;

  (5)设置触摸屏状态为空闲。

  由于这里的初始化会占用一部分系统资源,所以把它们放在了打开设备时处理,而不是最初的设备初始化部分,这样也是出于节省资源的考虑。

  3.2.3读函数ts_read()

  一旦用户程序调用read()对触摸屏进行读操作,则驱动程序调用入口点函数ts_read()进行处理。如果此时没有数据到来,且驱动程序选择阻塞型操作,则调用interruptible_sleep_on(&queue->proc_list)将进程阻塞,并进入等待队列,同时设置触摸屏状态为等待;如果选择了非阻塞型操作,则程序在没有数据到达的时候立即返回,然后用异步触发fasync()来通知数据的到来。

  在等待数据到来的过程中,如果有触摸动作(笔中断pen_irq)发生,则进入中断处理程序。在中断处理程序中对数据进行采样和转化,把当前坐标信息放入队列中。在进程被唤醒后(使用wake_up_interruptible(&queue->proc_list)来唤醒进程),程序把位置坐标信息、事件序列信息等从队列中取出,放入用户空间(put_user),从而可以被用户程序使用,避免了用户直接和硬件打交道。

  3.2.4驱动程序的中断处理函数

  当笔中断发生,程序进入中断处理函数。在中断处理函数中,将完成对两个中断进行处理,分别是外部的触摸中断(笔中断)和SPI数据转换中断。与这两个中断对应的中断处理函数,是触摸屏软件设计的关键所在。

  驱动程序在中断处理函数中使用定时器处理时间相关操作。定义函数set_timer_irq(),如下:

  staticvoidset_timer_irq(structtimer_list*timer,intdelay){

  del_timer(timer);

  timer->expires=jiffies+delay;

  add_timer(timer);

  }

  jiffies是一个表征系统自从启动以来到当前为止所运行时钟数的变量,delay是设定的延长时间(用时钟数作为计数单位)。一旦时钟数超过设定值,则触发超时函数,在本程序中是handle_timeout( )。引入定时器的目的有两个:一是可以较为精确地控制系统由于消除电平升降造成信号抖动所需要时间,二是能够有效控制采样坐标的数量,而不必引入占用大量系统资源的简单延时函数。使用SPI中断而产生大量坐标数据这一问题在文献中没有很好的解决办法,只是简单地降低SPI时钟频率以取较少的数据量。本设计中引入定时器,可以很好地解决上述问题。

  在handle_timeout()函数中,程序利用条件选择语句,对触摸屏状态值(ts_drv_state)进行判断,如果是非Error状态,则使能SPI,进入handle_spi_irq(),与ADS7843进行数据通讯。在handle_spi_irq()中,程序利用条件选择语句,根据触摸屏状态值(ts_drv_state)来进行数据转换操作,通过向触摸屏控制芯片发送前文中提到的控制字,来得到X和Y方向的坐标。具体逻辑可参见程序流程图。一旦一次转换完成,程序将根据点击状态信息(state_counter)来鉴别点击的性质,在cause_event()函数中,分别对点击和移动做出了判断。判定方法较为简单,只需将前后两次采样坐标之差与移动阈值比较即可得出结论。此外,还区分了信号误差和由于笔移动造成的坐标改变,判别阈值可以由用户自己设定。

  3.2.5I/O控制

  对于硬件各个参数,包括采样时间、消除抖动开关、消除抖动时间,都可以通过I/O控制函数ioctl()在用户程序里进行设定,避免每次都直接改变驱动程序,并重新编译内核所带来的时间开销。本程序中对I/O控制函数的定义是:staticintts_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg);其中,参数cmd有两个值,分别为:TS_PARAMS_GET和TS_PARAMS_SET,它们用来指出是获取参数还是设定参数。用户在调用这个函数的时候,只需要对这个参数按照事先约定的格式赋值,就可以方便地获取或者改变触摸屏当前参数,arg是指向所传递参数的指针。

  4结论

  在获得触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,以方便图形界面的后续开发。考虑到相邻两次的移动阈值,按照如下公式对触摸屏坐标进行计算:

  

  其中XV为触摸点X坐标显示值,XW为触摸点X坐标测量值(原始坐标值),(1)、(2)、(3)式在触摸屏初始化时得到,方法是任取触摸屏X方向左侧和右侧各一点,以X△V=X△W=1,Xoffrer=0为初始值进行测量得到新的3个参数:X△V、X△W和Xoffrer(在实际使用中此项工作属于校准零点偏移),然后这3个参数就不再变动,对于每次测量到的任意触摸点原始坐标XW,直接代入(4)式求出触摸点的像素显示坐标XV。 其中,XV1为触摸屏左侧点坐标显示值;XV2为触摸屏右侧点坐标显示值;XW1为触摸屏左侧点坐标测量值;XW2为触摸屏右侧点坐标测量值。

  本设计使用MicroWindows作为用户界面,定制出每个桌面图标的坐标区域,结合触摸屏的采样坐标,判断是否在图标区域坐标内,然后做出相应的事件处理。对于本设计中使用的开发平台,液晶屏是320240点阵的,物理尺寸为: 80mm60mm,ADS7843选择12位转换精度,触摸屏理论分辨率为80/212=0.020mm,但是由于电平干扰和触摸动作发生时的物理干扰,实际的精度无法达到这个值。经过测试,在我们平台上对同一点的点击精度可以达到1.0mm。本驱动程序可以有效地区分点击和移动信号,如果配合手写识别软件,能够作为手写板的底层驱动使用,实现手写输入。

 

关键字:Clinux  触摸屏控制器  中断处理程序  驱动程序  ioctl  设备号  控制函数  控制字  函数指针 引用地址:基于μClinux的触摸屏设计与关键技术分析

上一篇:Modbus协议下单片机与eView触摸屏的通信
下一篇:电容式触摸传感器的应用设计技巧与分析

推荐阅读最新更新时间:2024-03-30 21:26

STM32F103标准库开发---SPI实验---底层驱动程序
一、SPI 实验----I/O端口配置 在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。 具体引脚配置如下: 具体引脚初始化程序如下: /* SPI引脚初始化配置 **PA4------CS **PA5------SCLK **PA6------MISO **PA7------MOSI */ void SPI1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );/
[单片机]
STM32F103标准库开发---SPI实验---底层<font color='red'>驱动程序</font>
基于STM32单片机流水灯控制中的GPIO_Init()函数解析
学习STM32时,首先要熟悉流水灯例程,在这里就来分析流水灯中的GPIO_Init()函数 例如:流水灯例程中使用的端口是macLED1_GPIO_PORT=GPIOB, 控制的引脚是GPIO_Pin_0, 引脚的模式是GPIO_Mode_Out_PP(通用推挽输出), 引脚的速率是GPIO_Speed_50MHz, 用到的寄存器是CRL 将上述的引脚、模式、速率换算成32位的16进制,分别是: 1)控制的引脚是GPIO_Pin_0 换算成32位的16进制是:0x0000 0001 2)引脚的模式是GPIO_Mode_Out_PP(通用推挽输出) 换算成32位的16进制是:0x0000 0010 3)引脚的速率是GPIO_Sp
[单片机]
基于STM32单片机流水灯<font color='red'>控制</font>中的GPIO_Init()<font color='red'>函数</font>解析
老查的ARM学习笔记:chapter-3(串口驱动程序分析 )
tty子系统架构概念简述 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。 1 串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是/dev/ttySAC0; /dev/ttySAC1…… 2 控制台终端(/dev/console) 在Linux系统中,计算机的输出设备通常被称为控制台终端(Console),这里特指printk信息输出到的设备。/dev/console是一个虚拟的设备,它需要映射到真正的tty上,比如通过内核启动参数” console=ttySAC0”就把co
[单片机]
老查的ARM学习笔记:chapter-3(串口<font color='red'>驱动程序</font>分析 )
CAN总线在嵌入式Linux下驱动程序的实现
1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统 32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN
[单片机]
CAN总线在嵌入式Linux下<font color='red'>驱动程序</font>的实现
基于ARM处理器的TSC2046触摸屏控制器的应用
摘要:触摸屏技术经过十几年的发展已经成为一种方便、经济的人机界面输入手段。 TSC2046 是四线电阻式触摸屏控制器,其核心是一个具有采样和保持功能的12位逐次逼近式A/D转换器。以飞利浦公司的ARM芯片为基础,通过TSC2046触摸屏控制器和四线电阻式触摸屏构成硬件基础,在此基础上,开发了触摸屏面板控制程序。该触摸屏已应用于实际项目中,触摸效果良好。 关键词:TSC2046;触模屏;LPC2132芯片;控制器 0 引言 随着信息技术的不断发展,嵌入式系统正在越来越广泛地应用到消费类电子、通信设备等便携式电子类产品中。触摸屏由于其轻便、占用空间少、灵活等优点,已经逐渐取代键盘,成为嵌入式系统中最简单、方便、自然的一种人机交互
[工业控制]
基于ARM处理器的TSC2046<font color='red'>触摸屏控制</font>器的应用
首款单层多点触摸电容式触摸屏控制器【IDT】
    IDT® 公司(Integrated Device Technology)推出业界首款触摸屏控制器 IC,为 IDT  专有的单层多点触摸投射电容式触摸屏技术而优化。这一新的触摸屏技术和控制器解决方案提供了真正的单层解决方案,而无需其他解决方案要求的交叉隔离点,却保持了全面的多点触摸功能,这是市场的一次革命。其结果是实现了更低成本的整体解决方案,而不影响产品的功能和性能。典型应用包括移动手机、个人导航设备,以及5 英寸屏幕尺寸的手持游戏平台。         IDT LDS7000 和 LDS7001 是高性能、多点触摸、全分辨率的触摸屏控制 IC,分别有多达 30 到 35 个传感器通道。这两款控制器都以 8m
[电源管理]
首款单层多点触摸电容式<font color='red'>触摸屏控制</font>器【IDT】
周立功手把手教你学嵌入式编程:函数指针指针函数的应用
周立功教授数年之心血之作《》以及 《》 。书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对 《程序设计与数据结构》一书 内容进行连载,愿共勉之。 第二章为程序设计技术,本文为2.1.1 函数指针和2.1.2指针函数。 2.1 函数指针与指针函数 2.1.1 函数指针 变量的指针指向的是一块数据,指针指向不同的变量,则取到的是不同的数据。而经过编译后的函数都是一段代码,系统随即为相应的代码分配一段存储空间,而存储这段代码的起始地址(又称为
[机器人]
嵌入式软PLC虚拟机在电气测试中应用
  在一些电子部件产品测试时,早先很多生产厂家都使用继电接触控制系统。该系统由分立元件组成,由于线路简单,元件控制精度不高,加上抗干扰能力级差,所以运行不够稳定,误动作频繁,使产品的测试和分析不准确。   随着现代工艺的高精度要求,为了适应市场需求,采用可编程控制器对原继电电气控制系统进行改造,但由于各PLC厂家硬件模块和软件结构绝大多数都是专用的、互不兼容的,系统各模块间的交互方式、通信机制也各不相同,这使得控制系统相对独立、彼此封闭。随着技术的进步和市场竞争的加剧,这种专用体系结构的控制系统越来越暴露了其固有的缺陷。由于基于PC平台的软件PLC无需专门的编程器,可充分利用PC机的软硬件资源,直接采用梯形图或语言编程,具有良好
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新工业控制文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved