- UID
- 872238
|
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()中,进行了如下工作: |
|