由于我们使用的电阻式触摸屏,控制器根据检测到的电阻变化来计算接触点的坐标,当触摸力度较小时会出现抖动情况,通过多次取点求平均值发现效果并不好,我们在取值时应该去掉无效的点,网上查了一下说可以通过计算触摸压力的方法不过比较麻烦。 我采用的方法是去除抖动较大的不稳定点、即取四个点,分别比较这四个点的x轴和y轴的大小,取出最大值Xmax、Ymax和最小值Xmin、Ymin,然后计算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++;
……