关 闭

新闻中心

EEPW首页>工控自动化>设计应用> 基于TQ2440和Linux的触摸屏的驱动研究

基于TQ2440和Linux的触摸屏的驱动研究

作者: 时间:2012-03-16 来源:网络 收藏

结构中s3c2410_ts_open函数为file_operations中函数指针open所指向的函数,即打开设备时 open操作即为调用s3c2410_ts_open函数,完成初始状态参数的设置、消息队列初始化等。read所指向s3c2410_ts_

read函数主要是向消息队列提供坐标采集数据,以供应用程序调用。s3c2410_ts_poll为查询设备的可读写状态,s3c2410_ts_release则在释放设备时调用。

在触摸屏程序中定义了一组宏,用于控制触摸屏和ADC进入不同的工作模式,如等待中断、X/Y位置转换等。定义了触摸屏结构体TS_DEV包含一个缓冲区、自旋锁、等待队列和fasync_struct指针,结构为:
typedef struct
{
unsigned int penStatus;
TS_RET buf[MAX_TS_BUF]; /*缓冲区*/
unsigned int head,tail; /*缓冲区头和尾*/
wait_queue_head_t wq; /*等待队列*/
spinlock_t lock;
#ifdef USE_ASYNC
struct fasync_struct *aq;
#endif
struct cdev cdev;
}TS_DEV;

触摸屏结构体中的TS_RET包含屏幕的X、Y坐标和触摸状态信息(PEN_DOWN、PEN_UP),这个信息会在用户读取触摸屏信息时复制到用户空间,结构为:
typedef struct
{
unsigned short pressure;
unsigned short x;//X坐标
unsigned shorty;//Y坐标
unsigned short pad;
}TS_RET;

触摸屏工作时会产生两类中断:一类是触点中断(INT_TC),一类是X/Y位置转换中断(INT_ADC)。使用函数s3c2410_isr_tc用来处理触摸屏的触点/抬起中断,在触点中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换;当处于PEN_DOWN状态时,则调用函数tsEvent完成缓冲区的填充、等待队列的唤醒和异步通知信号的释放。使用函数s3c2410_isr_adc来处理X/Y位置转换中断,当X/Y位置转换中断发生后,读取X、Y的坐标值,填入缓冲区。在函数s3c2410_isr_adc中通过调用函数s3c2410_get_XY来获取X、Y坐标的。最后由函数s3c2410_ts_poll实现轮询接口,将等待队列添加到结构体poll_table中,当缓冲区有数据时,返回资源可读取标志,否则返回0。函数s3c2410_ts_fasync完成触摸屏对应用程序的异步通知。在程序的最后,由函数__init s3c2410_ts_init和__exit s3c2410_ts_exit完成从内核中加载和卸载触摸屏程序,加载函数__init s3c2410_ts_init还需要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚等多项工作,卸载函数_exit s3c2410_ts_exit完成释放设备号、删除cdev、释放中断等工作[3]。

2.4 实验操作过程

将编写好的触摸屏ts.c文件拷贝到内核源码目录“drivers/input/touchsreen/”下,并修改同目录下的“Kconfig”和“Makefile”文件。在内核配置单中添加触摸屏编译配置选项,修改Kconfig文件的第468行,添加如下内容:

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭