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++;

……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值