您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

基于μClinux的触摸屏软硬件计划与关键技能阐发

发布日期:2011-04-20

 
       择要:
本文先容了当前比较盛行的开放源代码的嵌入式操纵体系μClinux下驱动步伐的一样平常布局,以及触摸屏控制器和Motorola DragonBallMCVZ328 CPU的连接。在此底子上,细致报告了触摸屏驱动步伐计划的一些关键技能,如壅闭型I/O操纵、任务行列步队以及体系定时器的应用等,办理了采样数量控制题目,具有较好的移植性。
      
关键词:嵌入式操纵体系;μClinux;触摸屏;驱动步伐 

     
 小序 
     
背景先容 
  
  随着信息技能的生长,嵌入式体系越来越遍及地应用到航空航天、通讯配置、产业控制等范畴。由于尺寸的限定,触摸屏代替键盘和鼠标成为嵌入式体系首选的输入东西。同时嵌入式体系也渐渐放弃了传统的循环控制模式,而是引入操纵体系完成进程间切换和任务调理。μClinux便是一种良好的开放源代码的嵌入式操纵体系。它颠末各方面的小型化改革,形成了一个高度优化的、代码紧凑的嵌入式Linux,固然它的体积很小,μClinux仍旧保存了Linux的大多数好处:稳固精良的移植性、良好的网络成果、完备的对种种文件体系的支持以及标准丰富的API。比较起别的几种应用较多的嵌入式操纵体系,像vxworks、winCE等,它较为低廉的代价以及方便的用户步伐开辟,无疑是其巨大的上风。用户可以方便地从互联网上找到最新内核版本、编译器以及别的必须的软件环境,这也促使浩繁喜好者加盟。
     
研究近况
    
 由于触摸屏利用得越来越遍及,以是相应的研究与工程实践比较多。在现有的事变中,已有很多工程师对触摸屏控制器ADS7846与StrongARM平台的硬件连接以及在WinCE操纵体系中软件驱动步伐开辟举行了研究,并对改造触摸屏控制器硬件精度上做了肯定探索。而本文的重要孝敬在于细致形貌了在μClinux这一嵌入式操纵体系中触摸屏驱动步伐硬件及软件计划。实践证明,这一计划具有比较高的精度、稳固性和开放性,并且跨平台性也较好,因此必将给嵌入式配置提供更多选择。 
    
 硬件计划
    
本计划中硬件平台微处理惩罚器选用Motorola公司的MC68VZ328,它是一款M68k体系的32位低功耗微处理惩罚器,采取SoC技能计划,具有典范的嵌入衰落处理惩罚器的特性;触摸屏选用TI(原为Burr-Brown公司的产品,由于该公司已被TI公司收购,以是下文均用TI公司)公司的ADS7843。在本计划中,CPU与触摸屏以主从方法事变,触摸屏事变于从配置(slave)状态。本计划中硬件电路差别于传统计划,而是充分利用了ADS7843中的BUSY信号线,如图1所示。

ic72消息中间

      ADS7843是一款四线电阻式触摸屏控制芯片,它重要完成两件事变:其一,是完成电极电压的切换;其二,是征求打仗点处的电压值。它由两层透明的阻性导体层构成,在导体层中间弥漫了用粘性绝缘液体质料做成的断绝层和由导电性能极好的质料构成的电极。

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

ic72消息中间

      软件计划

      μ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)。

      触摸屏驱动步伐的流程及关键函数

      在本计划中,我们利用μClinux2.4内核。驱动步伐重要计划头脑是:驱动步伐在初始化结束后,进入空闲状态,等待停止的到来。一旦笔停止(pen_irq)产生,则进入停止处理惩罚步伐,举行数据采样、转换和传输,同时,步伐对种种差别的环境举行辨别和非常处理惩罚。

      触摸屏软件流程如图3所示。在驱动步伐中设置了触摸屏所处的7个差别状态,分别用从-1到5的数字表征,这7个状态构成了一个触摸屏状态机,体系根据当前状态做出下一步的处理惩罚,如表1所示。整个软件计划根据成果可以分别为5个部分,分别是初始化、配置打开、读操纵、停止处理惩罚以及I/O控制,下面详细先容每一部分。

ic72消息中间

ic72消息中间

      驱动步伐初始化

      在mc68328digi_init()中向内核注册配置驱动函数:err=misc_register(&mc68328_digi),在init_ts_settings()中设置触摸屏确当前参数:内核版本号、笔移动鉴别阈值、采样时间、消除抖动开关、消除抖动时间等参数,这些均由用户根据本身的液晶屏以及精度请求来定制,也可以在应用步伐中用I/O控制函数ioctl()来设置,本文将在参数阐发中详细阐发这些参数的意义。

      打开配置

      在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)设置触摸屏状态为空闲。

      由于这里的初始化会占用一部分体系资源,以是把它们放在了打开配置时处理惩罚,而不是最初的配置初始化部分,如许也是出于节流资源的思量。

      读函数ts_read()

      一旦用户步伐调用read()对触摸屏举行读操纵,则驱动步伐调用入口点函数ts_read()举行处理惩罚。要是此时没有数据到来,且驱动步伐选择壅闭型操纵,则调用interruptible_sleep_on(&queue->proc_list)将进程壅闭,并进入等待行列步队,同时设置触摸屏状态为等待;要是选择了非壅闭型操纵,则步伐在没有数据到达的时间立即返回,然后用异步触发fasync()来关照数据的到来。

      在等待数据到来的进程中,要是有触摸举措(笔停止pen_irq)产生,则进入停止处理惩罚步伐。在停止处理惩罚步伐中对数据举行采样和转化,把当前坐标信息放入行列步队中。在进程被唤醒后(利用wake_up_interruptible(&queue->proc_list)来唤醒进程),步伐把位置坐标信息、变乱序列信息等从行列步队中取出,放入用户空间(put_user),从而可以被用户步伐利用,克制了用户直接和硬件打交道。

      驱动步伐的停止处理惩罚函数

      当笔停止产生,步伐进入停止处理惩罚函数。在停止处理惩罚函数中,将完成对两此停止举行处理惩罚,分别是外部的触摸停止(笔停止)和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()函数中,分别对点击和移动做出了果断。鉴定要领较为大略,只需将前后两次采样坐标之差与移动阈值比较即可得出结论。别的,还区分了信号偏差和由于笔移动导致的坐标变化,鉴别阈值可以由用户本身设置。

      I/O控制

      对付硬件各个参数,包括采样时间、消除抖动开关、消除抖动时间,都可以通过I/O控制函数ioctl()在用户步伐里举行设置,克制每次都直接变化驱动步伐,并重新编译内核所带来的时间开销。本步伐中对I/O控制函数的定义是:staticintts_ioct(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg);此中,参数cmd有两个值,分别为:TS_PARAMS_GET和TS_PARAMS_SET,它们用来指出是获取参数还是设置参数。用户在调用这个函数的时间,只必要对这个参数根据事先约定的格局赋值,就可以方便地获取大概变化触摸屏当前参数,arg是指向所转达参数的指针。

      结论

      在得到触摸点的原始坐标(数值范畴由所选用的A/D转换器位数决定)后,还要根据详细利用的液晶屏实际像素举行转换,以方便图形界面的后续开辟。思量到相邻两次的移动阈值,根据如下公式对触摸屏坐标举行谋略:

ic72消息中间

      此中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作为用户界面,定制出每个桌面图标的坐标地区,连合触摸屏的采样坐标,果断是否在图标地区坐标内,然后做出相应的变乱处理惩罚。对付本计划中利用的开辟平台,液晶屏是320×240点阵的,物理尺寸为: 80mm×60mm,ADS7843选择12位转换精度,触摸屏理论辨别率为80/212=0.020mm,但是由于电平滋扰和触摸举措产生时的物理滋扰,实际的精度无法到达这个值。颠末测试,在我们平台上对同一点的点击精度可以到达1.0mm。本驱动步伐可以有效地区分点击和移动信号,要是共同手写辨认软件,可以或许作为手写板的底层驱动利用,实现手写输入。