基于μClinux的触摸屏软硬件关键技术分析

时间:2008-11-26来源:网络

  

  

  驱动程序初始化

  在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),从而可以被用户程序使用,避免了用户直接和硬件打交道。

1 2 3 4 5 6

关键词: Clinux 触摸屏控制器 中断处理程序 驱动程序 ioctl 设备号 控制函数 状态值 控制字 init

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版