天天看點

linux 觸摸屏測試源碼_Linux下的觸摸屏驅動

下面是這個子產品加載函數中調用的一個配置端口函數

static inline void s3c2410_ts_connect(void)

{

//将觸摸屏用到的四個端口配置成觸摸屏模式

s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON);

s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON);

}

我們來分析兩種情況,第一種情況,如果沒有按下觸摸屏

驅動中定義了一個定時器

static struct timer_list touch_timer =

TIMER_INITIALIZER(touch_timer_fire, 0, 0);

因為這個定時器的期限時間設定為0,這表示當驅動加載後就會執行一次定時函數touch_timer_fire

static void touch_timer_fire(unsigned long data)

{

unsigned long data0;

unsigned long data1;

int updown;

data0 = ioread32(base_addr+S3C2410_ADCDAT0);  //讀取X坐标

data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //讀取Y坐标

updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //觸摸屏是否被按下,如果按下updowm=1

if (updown) {

if (count != 0) {

long tmp;

tmp = xp;

xp = yp;

yp = tmp;

xp >>= 2;

yp >>= 2;

input_report_abs(dev, ABS_X, xp);

input_report_abs(dev, ABS_Y, yp);

input_report_key(dev, BTN_TOUCH, 1);

input_report_abs(dev, ABS_PRESSURE, 1);

input_sync(dev);

}

xp = 0;

yp = 0;

count = 0;

iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

} else { //沒有被按下

count = 0;        //初始化count為0,表示目前AD轉換沒發生

input_report_key(dev, BTN_TOUCH, 0);  //向input子系統報告未按下

input_report_abs(dev, ABS_PRESSURE, 0);

input_sync(dev);

iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC); //等待按鍵中斷

if (OwnADC) { //OwnADC是擷取一把鎖标示,在此為0

OwnADC = 0;

up(&ADC_LOCK);

}

}

}