armlinux学习笔记--触摸屏驱动程序分析

  • 格式:wps
  • 大小:103.00 KB
  • 文档页数:19

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

armlinux学习笔记--触摸屏驱动程序分析

//*******************************************************

//* 2007.6.26

//*******************************************************

Linux 下的触摸屏驱动程序主要都在/kernel/drivers/char/s3c2410-ts.c 文件中。触摸屏的file_operations 结构定义如下:

static struct file_operations s3c2410_fops = {

owner: THIS_MODULE,

open: s3c2410_ts_open,

read: s3c2410_ts_read,

release: s3c2410_ts_release,

#ifdef USE_ASYNC

fasync: s3c2410_ts_fasync,

#endif

poll: s3c2410_ts_poll,

};

在触摸屏设备驱动程序中,全局变量struct TS_DEV tsdev 是很重要的,用来保存触摸屏的相关参数、等待处理的消息队列、当前采样数据、上一次采样数据等信息,数据结构struct TS_DEV 的定义如下:

typedef struct {

unsigned int penStatus; /* PEN_UP, PEN_DOWN, PEN_SAMPLE */

TS_RET buf[MAX_TS_BUF]; /* protect against overrun(环形缓冲区)*/

unsigned int head, tail;/* head and tail for queued events (环形缓冲区的头尾)*/

wait_queue_head_t wq; //* 等待队列数据结构

spinlock_t lock; //* 自旋锁

#ifdef USE_ASYNC

struct fasync_struct *aq;

#endif

#ifdef CONFIG_PM

struct pm_dev *pm_dev;

#endif

} TS_DEV;

static TS_DEV tsdev;

在/kernel/include/asm-arm/linuette_ioctl.h 文件中:

typedef struct {

unsigned short pressure; //* 压力,这里可定义为笔按下,笔抬起,笔拖曳

unsigned short x; //* 横坐标的采样值

unsigned short y; //* 纵坐标的采样值

unsigned short pad; //* 填充位

} TS_RET;

在/kernel/include/linux/wait.h 文件中:

struct __wait_queue_head {

wq_lock_t lock;

struct list_head task_list;

#if WAITQUEUE_DEBUG

long __magic;

long __creator;

#endif

};

typedef struct __wait_queue_head wait_queue_head_t;

TS_RET结构体中的信息就是驱动程序提供给上层应用程序使用的信息,用来存储触摸屏的返回值。上层应用程序通过读接口,从底层驱动中读取信息,并根据得到的值进行其他方面的操作。

TS_DEV结构用于记录触摸屏运行的各种状态,PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf [MAX_TS_BUF]是用来存放数据信息的事件队列,head、tail分别指向事件队列的头和尾。程序中的笔事件队列是一个环形结构,当有事件加入时,队列头加一,当有事件被取走时,队列尾加一,当头尾位置指针一致时读取笔事件的信息,进程会被安排进入睡眠。wq等待队列,包含一个锁变量和一个正在睡眠进程链表。当有好几个进程都在等待某件事时,Linux会把这些进程记录到这个等待队列。它的作用是当没有笔触事件发生时,阻塞上层的读操作,直到有笔触事件发生。lock使用自旋锁,自旋锁是基于共享变量来工作的,函数可以通过给某个变量设置一个特殊值来获得锁。而其他需要锁的函数则会循环查询锁是否可用。MAX_TS_BUF的值为16,即在没有被读取之前,系统缓冲区中最多可以存放16个笔触数据信息。(关于自旋锁的作用和概念可以参考一篇《Linux内核的同步机制》文章的相关章节。)

------------------------------------------------------------------------

模块初始化函数是调用s3c2410_ts_init 函数来实现的,主要完成触摸屏设备的内核模块加载、初始化系统I/O、中断注册、设备注册,为设备文件系统创建入口等标准的字符设备初始化工作。

static int __init s3c2410_ts_init(void)

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);

tsMajor = ret;

这里首先对字符设备进行注册,将触摸屏的file_operations 结构中的函数接口传入内核,注册成功后获得系统自动分配的主设备号。

set_gpio_ctrl(GPIO_YPON);

set_gpio_ctrl(GPIO_YMON);

set_gpio_ctrl(GPIO_XPON);

set_gpio_ctrl(GPIO_XMON);

在/kernel/include/asm-arm/arch-s3c2410/smdk.h 文件中:

#define GPIO_YPON (GPIO_MODE_nYPON | GPIO_PULLUP_DIS | GPIO_G15)

#define GPIO_YMON (GPIO_MODE_YMON | GPIO_PULLUP_EN | GPIO_G14)

#define GPIO_XPON (GPIO_MODE_nXPON | GPIO_PULLUP_DIS | GPIO_G13)

#define GPIO_XMON (GPIO_MODE_XMON | GPIO_PULLUP_EN | GPIO_G12)

GPIO 口的Port G 端口有4个管脚对应触摸屏的控制接口,分别是:

GPG15 --- nYPON Y+ 控制信号