S3C2410觸控式螢幕驅動程式碼分析1

ht_toto發表於2008-08-03

/*<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

* s<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3c2410-ts.c

*

* touchScreen driver for SAMSUNG S3C2410

*

* Author: Janghoon Lyu <nandy@mizi.com>

* Date : $Date: 2002/06/04 07:11:00 $

*

* $Revision: 1.1.2.6 $

*

* Based on pt036001b-ts.c

*

* This file is subject to the terms and conditions of the GNU General Public

* License. See the file COPYING in the main directory of this archive

* for more details.

*

* History:

*

* 2002-05-27: Janghoon Lyu <nandy@mizi.com>

* - Add HOOK_FOR_DRAG

* - PM 鍐呴潧鍟?鐢哥虎鍟?涔愬彉 紿嶇槫鐖?鎶涜兌椋?鐧葷槫 鑷肩柦婢?

*

*/

#include <linux/config.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/miscdevice.h>

#include <linux/sched.h>

#include <linux/delay.h>

#include <linux/poll.h>

#include <linux/spinlock.h>

#include <linux/irq.h>

#include <linux/delay.h>

#include <asm/hardware.h>

#ifdef CONFIG_PM

#include <linux/pm.h>

#endif

/* debug macros */

#undef DEBUG

#ifdef DEBUG

#define DPRINTK( x... ) printk("s3c2410-ts: " ##x)

#else

#define DPRINTK( x... )

#endif

//定義觸控式螢幕筆的狀態,其中PEN_UP 為筆抬起狀態

// PEN_DOWN

為筆按下狀態

//

PEN_FLEETING 為筆滑動狀態

#define PEN_UP 0

#define PEN_DOWN 1

#define PEN_FLEETING 2

/*定義環形緩衝區的大小,環形緩衝區主要用來儲存

應用程式來不及處理的觸控式螢幕動作*/

#define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1

#define DEVICE_NAME "s3c2410-ts"

#define TSRAW_MINOR 1

typedef struct {

//定義筆的狀態

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

TS_RET buf[MAX_TS_BUF]; /* protect against overrun */

/*定義可以儲存16 個事件的環形緩衝區,其每個元素型別為:

typedef struct {

//壓力,這裡被定義為觸控筆動作,即

//上面定義的PEN_UP/PEN_DOWN/PEN_FLEETING 三種

unsigned short pressure;

//橫座標的取樣值

unsigned short x;

//縱座標的取樣值

unsigned short y;

//pad是填充位,這個成員是為了保證整個結構體的大小

//4 位元組整數倍而使用的

unsigned short pad;

} TS_RET;

*/

unsigned int head, tail; /* head and tail for queued events */

/*

headtail 用於指向環形緩衝區的頭和尾

*/

wait_queue_head_t wq;

/*Linux 核心的等待佇列是以雙迴圈連結串列為基礎資料結構,與程式排程機制緊密結合,能夠用於

實現核心的非同步事件通知機制。在Linux2.4.21中,等待佇列在原始碼樹include/linux/wait.h 中,

這是一個通過list_head 連線的典型雙迴圈連結串列,如下圖所示。

*/

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

spinlock_t lock;

/*

定義一把自旋鎖。在linux 核心中,鎖有兩種型別,一個是自旋鎖,另外是讀寫鎖自旋

鎖最多隻能被一個可執行執行緒持有。

自旋鎖不會引起呼叫者睡眠,如果一個執行執行緒試圖獲得一個已經被持有的自旋鎖,那

麼執行緒就會一直進行忙迴圈,一直等待下去,在那裡看是否該自旋鎖的保持者已經釋放了鎖,

"自旋"一詞就是因此而得名。 由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋而

不是睡眠是非常必要的,自旋鎖的效率遠高於互斥鎖

*/

#ifdef USE_ASYNC

struct fasync_struct *aq;

#endif

#ifdef CONFIG_PM

struct pm_dev *pm_dev;

#endif

} TS_DEV;

static TS_DEV tsdev;

/* 定義觸控式螢幕裝置變數tsdev,該全域性變數用於處理一觸控式螢幕相關事務*/

#define BUF_HEAD (tsdev.buf[tsdev.head])

#define BUF_TAIL (tsdev.buf[tsdev.tail])

#define INCBUF(x,mod) ((++(x)) & ((mod) - 1))

static int tsMajor = 0;

static void (*tsEvent)(void);

#define HOOK_FOR_DRAG

#ifdef HOOK_FOR_DRAG

#define TS_TIMER_DELAY (HZ/100) /* 10 ms */

static struct timer_list ts_timer;

#endif

#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | /

XP_AIN | XM_HIZ | YP_AIN | YM_GND | /

XP_PST(WAIT_INT_MODE); }

/*設定觸控式螢幕處於等待中斷模式,筆處於抬起狀態,等待筆按下

*/

#define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | /

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE); }

/*設定觸控式螢幕處於等待中斷模式,筆處於按下狀態,等待筆抬起

*/

#define mode_x_axis() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | /

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); }

/*X座標進行測量*/

相關文章