기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요

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);
                }

................
}



profile

김재훈

2009.04.06 20:30:57
*.162.60.144

static int pointercal[7]={0, -2925, 33340088, -3266, 11, 42416000, 65536};  // Pointercal 전역 선언
.
.
.
.
   if (updown) {
        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 값 얻는 방법은 성호님이 하신 방법이 맞습니다.

이성호

2009.04.06 20:49:43
*.33.161.7

cal 값이 안 맞은 것같군요.. 왜그렇지 ??
고맙습니다....

고현철

2009.04.07 02:08:41
*.202.142.49

cal 값은 ts library의 ts_calibrate를 이용해서 저장된 /etc/pointercal 값을 이용했습니다.

안되면, x값 3개, y값 3개를 바꿔보세요....^^
저도 바꾸고 했는지 그냥 했는지 가물하네요....
List of Articles
번호 제목 글쓴이 날짜sort 조회 수

SDL cpp file 컴파일 관련 [2]

풀 스크린 개념 ... 런쳐 에 관해서.. [2]

[re] [긴급]I2C Interface

제품 양산시 커널을 어떻게 줄이나요??<====[완료] [3]

u-boot UImage 질문입니다. [완료] [1]

간단한 리눅스 환경변수 변경문제 물어볼께요.. [2]

부팅 문제 질문 드립니다. [완료] [8]

MMSP2 보드에 USB HOST 포팅 질문입니다. <== [완료] [4]

커널의 make menuconfig에서...

질문드립니다.. RAM안의 내용이 이상해 졌습니다. [완료] [5]

[완료]터치 관련 질문입니다. [3]

[re] 커널의 make menuconfig에서... [2]

LED 제어 관련해서 질문드려요~ [완료] [1]

kernel 부팅중에 멈춤 현상 때문에 질문 드립니다. [완료] [2]

[완료]터치 관련 질문2 [1]

[완료]또 터치 관련 질문 드립니다. 죄송~ [5]

USB host (OHCI) probe 함수가 불려지지 않는 이유를 찾고 있습... [2]

RAM 내용을 NAND에 COPY할때 특정 부분에서만 에러가 나에요 ... [4]

이솝보드에서 ram K4S561632B 2개를 따로 구입할 수 있을까요? [1]

이솝보드에서 자바 개발 가능한지요? [3]

사용자 로그인