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

안녕하세요

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

S3C6410 IROM booting [6]

오드로이드 SDCARD의 Root FS를 안보이게 하는 방법은... [2]

[질문] 이솝보드에 삼성의 DNW(USB/Sireal 다운로더)사용하려면..? [6]

삼성 2440 I/O Speed [1]

가속도 센서 관련하여 문의글 올립니다. [2]

[완료] 터치 증상이 이상합니다. [6]

[완료]dm9000a [10]

프로젝트 계획 조언부탁드립니다. [5]

Opencore 와 Openmax 그리고 mfc 와의 관계. [11]

[완료]SDL 기본 화면 뛰우기 [3]

[완료] LX800 PDS에 있는 WINCE BSP는 무엇인지요. [6]

안드로이더 에 touch cal 값을 어떻게 얻었나요? [3]

yaffs2 포팅(lost+found증상) file

ubuntu 10.04 오드로이드 타겟 adb 연결 문제 [1]

  • rapel
  • 2010-06-11
  • 조회 수 2711

[완료]pci slot확장시 bios수정필요한지? [2]

aesop lx800 구입문의 [1]

[re] [질문] 동영상 재생 & LCD 잔상 [5]

안드로이드-S 구글맵관련 앱 설치가 안됩니다. [3]

만든 앱이 수퍼 유저 권한 획득하려면 에 대한 질문입니다. [7]

LX800 주변기기 추천 부탁드립니다.[완료] [7]

사용자 로그인