由於我們使用的電阻式觸摸屏,控制器根據檢測到的電阻變化來計算接觸點的座標,當觸摸力度較小時會出現抖動情況,通過多次取點求平均值發現效果並不好,我們在取值時應該去掉無效的點,網上查了一下說可以通過計算觸摸壓力的方法不過比較麻煩。 我採用的方法是去除抖動較大的不穩定點、即取四個點,分別比較這四個點的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++;
……