기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요
touch cal 값을 얻어와서 강제로 넘겼는데
그런데 이렇게 하니까 정상적인 좌표 값이 넘어 오지 않습니다.
touch cal 값은 aesop에서 touch cal값을 얻는 프로그램에서 가져왔습니다.
/etc/pointercal 파일에서요
그런데 이상하게 좌표가 이상하게 넘어 오는데요.....
touch driver.........
s3c-ts.c
==================================================
probe function
..
#if 1 //android
ts->dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
#endif
ts->dev->evbit[0] = ts->dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
ts->dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
#if defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C6410) || defined(CONFIG_CPU_S3C2416)
input_set_abs_params(ts->dev, ABS_X, 0, 320, 0, 0);
input_set_abs_params(ts->dev, ABS_Y, 0, 480, 0, 0);
#else
input_set_abs_params(ts->dev, ABS_X, 0, 0x3FF, 0, 0);
input_set_abs_params(ts->dev, ABS_Y, 0, 0x3FF, 0, 0);
#endif
input_set_abs_params(ts->dev, ABS_PRESSURE, 0, 1, 0, 0);
..
static void touch_timer_fire(unsigned long data)
{
static int a[7]={2721, -4, -12787880, 2, 3317, -11369752, 65536}; //pointercal의 내용..
int x,y;
............
if (updown) {
if (ts->count) {
#ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG
{
struct timeval tv;
do_gettimeofday(&tv);
printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ldn", (int)tv.tv_usec, ts->xp, ts->yp);
}
#endif
x = ts->xp;
y = ts->yp;
ts->xp = ( a[2] + a[0]*x + a[1]*y) / a[6];
ts->yp = ( a[5] + a[3]*x + a[4]*y ) / a[6];
printk(KERN_INFO " X: %03ld, Y: %03ldn", ts->xp, ts->yp);
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);
}
................
}
.
.
.
if (ts->count) {
//#ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG
#if 1
{
struct timeval tv;
do_gettimeofday(&tv);
printk(KERN_INFO "T: %06d, X: %03ld, Y: %03ldn", (int)tv.tv_usec, ts->xp, ts->yp);
}
#endif
xtemp = ts->xp;
ytemp = ts->yp;
x = ( pointercal[2] + pointercal[0]*xtemp + pointercal[1]*ytemp ) / pointercal[6];
y = ( pointercal[5] + pointercal[3]*xtemp + pointercal[4]*ytemp ) / pointercal[6];
printk("pre: x, y = %d, %dn", x, y);
if( x>320 )
x = 320;
else if(x < 0)
x = 0;
if( y>480 )
y = 480;
else if(y < 0)
y = 0;
if( (x<=320) && (x>=0) )
{
input_report_abs(ts->dev, ABS_X, x);
input_report_abs(ts->dev, ABS_Y, y);
input_report_key(ts->dev, BTN_TOUCH, 1);
input_report_abs(ts->dev, ABS_PRESSURE, 1);
input_sync(ts->dev);
printk("x, y = %d, %dn", x, y);
}
}
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);
}
이렇게 해보셔요. pointercal 값 얻는 방법은 성호님이 하신 방법이 맞습니다.