S3c6410 linux內核移植(5)---改進觸摸屏驅動

由於我們使用的電阻式觸摸屏,控制器根據檢測到的電阻變化來計算接觸點的座標當觸摸力度較小時會出現抖動情況,通過多次取點求平均值發現效果並不好,我們在取值時應該去掉無效的點,網上查了一下說可以通過計算觸摸壓力的方法不過比較麻煩。 我採用的方法是去除抖動較大的不穩定點、即取四個點,分別比較這四個點的x軸和y軸的大小,取出最大值Xmax、Ymax和最小值XminYmin,然後計算a =(Xmax-Xmin) + (Ymax-Ymin)的大小, 當a大於一定的值是去掉。

修改內核drivers/input/touchscreen目錄下的文件s3c-ts.c

1、 添加全局變量

int max_data0 = 0;

int min_data0 = 0;

int max_data1 = 0;

int min_data1 = 0;

2、 修改函數static void touch_timer_fire(unsigned long data)

static void touch_timer_fire(unsigned long data)

   {

unsigned long data0;

unsigned long data1;

int updown;

unsigned long deviation;

data0 = readl(ts_base+S3C_ADCDAT0);

data1 = readl(ts_base+S3C_ADCDAT1);

updown = (!(data0 & S3C_ADCDAT0_UPDOWN)) && (!(data1 & S3C_ADCDAT1_UPDOWN));

if (updown) {

if (ts->count) {

#ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG

{

struct timeval tv;

do_gettimeofday(&tv);

printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts->xp, ts->yp);

}

#endif

deviation = (max_data0 - min_data0) + (max_data1 - min_data1) 

if (deviation < 72)

{

input_report_abs(ts->dev, ABS_X, ts->xp);

input_report_abs(ts->dev, ABS_Y, ts->yp);

input_report_key(ts->dev, BTN_TOUCH, 1);

input_report_abs(ts->dev, ABS_PRESSURE, 1);

input_sync(ts->dev);

}

}

max_data0 = 0;

min_data0 = 0;

max_data1 = 0;

min_data1 = 0;

ts->xp = 0;

ts->yp = 0;

ts->count = 0;

writel(S3C_ADCTSC_PULL_UP_DISABLE | AUTOPST, ts_base+S3C_ADCTSC);

writel(readl(ts_base+S3C_ADCCON) | S3C_ADCCON_ENABLE_START, ts_base+S3C_ADCCON);

} else {

ts->count = 0;

input_report_key(ts->dev, BTN_TOUCH, 0);

input_report_abs(ts->dev, ABS_PRESSURE, 0);

input_sync(ts->dev);

writel(WAIT4INT(0), ts_base+S3C_ADCTSC);

}

3、 修改函數static irqreturn_t stylus_action(int irqno, void *param)

static irqreturn_t stylus_action(int irqno, void *param)

{

unsigned long data0;

unsigned long data1;

int maskdata0;

int maskdata1;

data0 = readl(ts_base+S3C_ADCDAT0);

data1 = readl(ts_base+S3C_ADCDAT1);

if(ts->resol_bit==12) {

maskdata0 = data0 & S3C_ADCDAT0_XPDATA_MASK_12BIT;

maskdata1 = data1 & S3C_ADCDAT1_YPDATA_MASK_12BIT;

#if defined(CONFIG_TOUCHSCREEN_NEW)

ts->yp += S3C_ADCDAT0_XPDATA_MASK_12BIT - maskdata0;

ts->xp += S3C_ADCDAT1_YPDATA_MASK_12BIT - maskdata1;

#else 

ts->xp += maskdata0;

ts->yp += maskdata1;

#endif

}

else {

maskdata0 = data0 & S3C_ADCDAT0_XPDATA_MASK;

maskdata1 = data1 & S3C_ADCDAT1_YPDATA_MASK;

#if defined(CONFIG_TOUCHSCREEN_NEW)

ts->yp += S3C_ADCDAT0_XPDATA_MASK - maskdata0;

ts->xp += S3C_ADCDAT1_YPDATA_MASK - maskdata1;

#else

ts->xp += maskdata0;

ts->yp += maskdata1; 

#endif 

}

if (x_max == 0)

{

max_data0 = maskdata0;

min_data0 = maskdata0;

max_data1 = maskdata1;

min_data1 = maskdata1;

}

else

{

if (maskdata0 > max_data0)

{

max_data0 = maskdata0;

}

else if (maskdata0 < min_data0)

{

min_data0 = maskdata0;

}

if (maskdata1 > max_data1)

{

max_data1 = maskdata1;

}

else if (maskdata1 < min_data1)

{

min_data1 = maskdata1;

} 

}

ts->count++;

……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章