포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

안녕하세요. touch 관련하여 오늘 처리 완료했습니다.

Q&A에 올리신 분중에 궁금해 하시는 분이 계셔서 관련 처리에 대해서 말씀드리겠습니다. 

먼저 s3c-ts.c는 컴파일 되셨다면 그 상태 그대로 해서 tslib를 가지고 cal을 해야 합니다. 저는 tslib에 대해서 정확하게 몰라서.

다음 사이트에서 받았습니다.

http://www.opentom.org/Tslib CVS 으로 다운 로드 받아서 일단 사용했습니다. 

다른 분들은 어떻게 받았는지 모르겠네요. 글 올리신 분들 보니깐. 터치 관련하여 수정된게 있는듯 한데. 저는 구하질 못해서요..

일단 받은 것을 컴파일 합니다. 

다른 분들은 shared로 컴파일 하셨던데.. 전 그 모드가 싫어서 static으로 컴파일 했습니다. 그게 속 편하거든요..

컴파일 옵션은 
CFLAGS="-march=armv6 -mtune=arm1176jzf-s" CXXFLAGS="-march=armv6 -mtune=arm1176jzf-s" LDFLAGS="--static" ./configure --host=arm-linux --enable-inputapi --enable-static --disable-shared

이렇게 줬습니다. 맞는지 틀린지는 모르겠습니다. 그러면 tests/ts_calibrate 가 생깁니다. 다른거는 필요 없고 이것만 가지고 했습니다.

shared가 아니니깐. 뭐 다른것들 필요도 없고. 용량이 2.4Mb라는게 좀 흠이지만.. 

참 그리고 ts_read_raw.c 부분을 좀 수정해 주세요. 여기 적힌대로 하니깐. 안되더군요. 쩝..
ipaq용으로 나와 있던 부분을 발최해서 만들었는데. 잘되더군요..

--------------
int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr)
{
    int result = 1 ;
    struct input_event ev;
    int ret;
    int total = 0;
    static  int curr_x = 0, curr_y = 0, curr_p = 0;
    static  int got_curr_x = 0, got_curr_y = 0;
    int got_curr_p = 0;
    int next_x, next_y;
    int got_next_x = 0, got_next_y = 0;
    int got_tstamp = 0;
//  int result = ts->list_raw->ops->read(ts->list_raw, samp, nr); <-- 원래 소스 이것 대로 하면 signal 11 발생하면서 죽습니다.
      while( total < nr ) {
        ret = read(ts->fd, &ev, sizeof(struct input_event));
        if(ret < sizeof(struct input_event)) break;

        if( ev.type == EV_ABS)
        {
            switch( ev.code)
            {
                case ABS_X:
                    if (!got_curr_x && !got_curr_y) {
                        got_curr_x = 1;
                        curr_x = ev.value;
                    } else {
                        got_next_x = 1;
                        next_x = ev.value;
                    }
                    break;
                case ABS_Y:
                    if (!got_curr_y) {
                    if (!got_curr_y) {
                        got_curr_y = 1;
                        curr_y = ev.value;
                    } else {
                        got_next_y = 1;
                        next_y = ev.value;
                    }
                    break;
                case ABS_PRESSURE:
                    got_curr_p = 1;
                    curr_p = ev.value;
                    break;
            }

        }
        /* go back if we just got irrelevant events so far */
        if (!got_curr_x && !got_curr_y && !got_curr_p) continue;

        /* time stamp with the first valid event only */
        if (!got_tstamp) {
            got_tstamp = 1;
            samp->tv = ev.time;
        }
      /* We consider having a complete!ts event */
        samp->x = curr_x;
        samp->y = curr_y;
        samp->pressure = curr_p;

        printf("RAW----------------,----------> %d %d %dn",samp->x,samp->y,samp->pressure);

        samp++;
        total++;

        /* get ready for next event */
        if (got_next_x) curr_x = next_x; else got_curr_x = 0;
        if (got_next_y) curr_y = next_y; else got_curr_y = 0;
        got_next_x = got_next_y = got_tstamp = 0;
    }
    return result;  
}       
---------------------------------

위처럼 해주시면 잘 찾습니다.  나머지는 국내에 나와 있는 글을 참조하시면 되구요. 

ts_calibrate를 이용해서 cal 하시고 나면 그 부분을 적용만하시면 됩니다. 

두가지 부분을 손을 봐야 합니다. 

1. touch_timer_fire 함수 #if 1 부분이 이번에 들어간거구요. #else가 기존에 있던 겁니다. 변경해 주시면 됩니다. 내용은 이전에 여기 올라왔던 글에서 찾아서 걍 넣은 겁니다. 
#if 1
            xtemp = ts->xp;     /* 실제 y 축임 */
            ytemp = ts->yp;     /* 실제 x 축임 */



            x = ( pointercal[2] + pointercal[0]*xtemp + pointercal[1]*ytemp ) / pointercal[6];
            y = ( pointercal[5] + pointercal[3]*xtemp + pointercal[4]*ytemp ) / pointercal[6];

#ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG
            printk(KERN_INFO "Cal Value X: %03d, Y: %03dn", x, y );

#endif
            if( x > yres )   /* 480 */
              x = yres;
            else if( x < 0 )
              x = 0;

            if( y > xres )   /* 640 */
              y = xres;
            else if( y < 0 )
              y = 0 ;

            input_report_abs(ts->dev, ABS_X, x );
            input_report_abs(ts->dev, ABS_Y, y );
#else
            input_report_abs(ts->dev, ABS_X, ts->xp);
            input_report_abs(ts->dev, ABS_Y, ts->yp);
#endif

2. s3c_ts_probe 부분 수정해주세요. 저는 아래 처럼 했는데 #if defined(CONFIG_FB_S3C_LTE480WV 이 제가 추가한 부분입니다.
사이즈가 없으면 안드로이드에서 정상적으로 인식이 안되더군요. 
#if defined(CONFIG_FB_S3C_LTE480WV)
        input_set_abs_params(ts->dev, ABS_X, 0, 800, 0, 0);
        input_set_abs_params(ts->dev, ABS_Y, 0, 480, 0, 0);
#else
        input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);
        input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);
#endif

이렇게 수정해 주시고 나면 문제 없이 처리 가능했습니다. 

참고로 원인 해경하기 위해서 tslib를 처리하는게 더 어렵더군요.. cal 하는 부분에 대해서 tslib이용을 뜬 구름 처럼 되어 있어서 
처음에는 큐토피아 있는거 깔아서 켈한 데이터 가지고 오고 생쑈했는데 잘 안되더군요.. 추후에 이 부분에 대해서 어떠한 보안이 
안드로이드 쪽에서 있었으면 하는게 제 생각입니다. 안그러면 필요에 따라서 커널을 컴파일 해야 하는 일이 발생할듯 합니다.

      


고현철

2009.04.16 20:03:11
*.59.122.218

머 용량이야....^^ --> strip 하시면 줄테고요...

tslib설치가 좀 지저분한데....현재 openmoko 거는 더 심한 모양이네요. 코드도 고쳐야 하는 것을 보면
수정하지 않아도 되는 소스를 회사 가면 올려놓도록 하겠습니다.

제가 하던 방식도 약간 정리해서 올리던가 하고요...^^

mouse처럼 세팅해줘야 동작하는 것으로 알고 있었는데, 지금은 그냥 touch모드로 세팅해도 동작을 잘 하나 보네요...

자료 감사합니다.

몇일내로 2.6.28.6으로 패치된 것을 정리해서 올리던가 해야겠네요.
안죽는 버전으로....

요즘 코덱땀시...머리 쥐어싸매고 있어서.....ㅠ.ㅠ

이제현

2009.04.16 21:15:54
*.221.221.197

G1/G2 구글폰은 정전식 터치라 Calibration이 필요없죠.
그래서 안드로이드에는 Calibration Util이 기본적으로 없는것 같습니다.

정경진

2009.04.16 22:50:26
*.20.193.254

감사합니다.
그런데, 제가 받은 커널 소스랑 약간 다른 것 같습니다. touch_timer_fire 함수도 좀 다른거 같구요.
일단 현상을 보면 touch를 전혀 인식하지 못한 것이 아니라, 좌표값이 이상하게 나오는게 문제인 것 같습니다. 소스에서 디버그 정보를 출력해 보니, 첨부와 같이 X, Y 좌표가 엉뚱하게 들어오는 것 같습니다.
실제로, 화면이 나왔다가 일정 시간이 지나면, LCD가 꺼지는데, 다시 touch 패널을 건드리면 화면이 나오더군요.
터치 좌표값만 조정하면 될 듯 합니다.


첨부

정경진

2009.04.17 00:29:55
*.20.192.217

네.. 한철님 방식대로 터치 소스를 수정하니 동작이 되네요.
제 경우는 이전에 maemo를 부팅하고 ts_calibrate해서 받아두었던 pointercal 값이 있어서, 그 값을 터치 소스에 pointercal[7] 배열에 하드코딩해서 위 소스대로 하니 제대로, 터치가 동작합니다.

근데, 여전히 이것저것 동작 안하는게 많네요.. com.android.phone, com.android.mms가 동작 안 한다는 메시지가 나오네요..
아직도 갈 길이 먼...

이규호

2009.04.18 03:21:04
*.94.41.89

위대로 했는데요,
여전히 정확한 touch가 동작을 안 하고 있습니다.

T: 356896, X: 7609, Y: 8771
pre: x, y = 354, 286

와 같이 정확한 x,y를 찍으나, 화면은 위에 title 창에 뭐가 내려오는 그런 반응밖에 없네요.
추가적으로 해야 할 것이 없나요? (참고로 SMDK6410 보드입니다.,)
List of Articles
번호 제목 글쓴이 날짜 조회 수
24 Google Android 커널 버전별 Testing Report [2] 김재훈 2009-05-17 11493
23 Android 동작시 Battery 관련 /sys 파일 에러 & Power off ... [2] 2009-05-09 11009
22 Android 커널 2.6.27~28버젼에서 CONFIG_SUSPEND옵션시 죽는 문... [3] 2009-05-08 10026
21 S3C6410 target으로의 Android porting에 대하여(1) [3] 고현철 2009-04-23 20133
20 Android 초보도 가능한 Touch 잡기. [1] 2009-04-23 12229
19 touch calibrate 방법 file [1] 전병환 2009-04-23 10442
18 Android에서의 Linux Network 환경 설정 방법 [1] 김재훈 2009-04-21 20509
17 PV와 Android [5] 이제현 2009-04-19 18163
16 OpenGL ES와 Android [3] 이제현 2009-04-18 22839
15 Android에서 yaffs2 image 만들때 oobfree 따르도록 수정 file [1] 2009-04-16 11896
» 안드로이드 6410 보드 관련 s3c-ts touch 잡기 [5] 김한철 2009-04-16 13738
13 Android yaffs image 흠..oob가 이상합니다. 2009-04-16 10888
12 File System 관련 문제 및 power off 문제 해결 [3] 김한철 2009-04-14 10202
11 Google Android Kernel-2.6.29 file 관리자 2009-04-14 12085
10 aesop-6410용 android 2.6.24 source file [12] 고현철 2009-04-12 12131
9 android를 6410에 포팅하면서... [7] 전병환 2009-04-10 18227
8 Android Debug Bridge(ADB) 사용 가이드 김재훈 2009-04-09 18864
7 Android Initialization Process 최종환 2009-04-09 24638
6 Android 부팅 및 초기화 절차 김재훈 2009-04-09 16999
5 Android용 root filesystem으로 cramfs 구성 할 때의 주의사항 [7] 김영문 2009-04-09 21375

사용자 로그인