您当前的位置:五五电子网电子知识电器控制触摸技术μClinux的触摸屏软硬件设计与关键技术分析 正文
μClinux的触摸屏软硬件设计与关键技术分析

μClinux的触摸屏软硬件设计与关键技术分析

点击数:7274 次   录入时间:03-04 11:41:32   整理:http://www.55dianzi.com   触摸技术

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

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

上一页  [1] [2] 


本文关键字:暂无联系方式触摸技术电器控制 - 触摸技术