Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
[문의] 터치 관련하여 질문 드립니다.
작성자
작성일 2009-01-16 (금) 21:41
ㆍ추천: 9  ㆍ조회: 11894      
IP: 210.xxx.4
터치 가 잘 되지 않아서 혹여 고수님이 보시고 조언점 얻고자 합니다.
먼저 재호 아빠님께서 일러주신데로 작업 한 결과 부터 말씀 드리자면 아래와 같습니다.

# cat devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="ADS784x Touchscreen"
P: Phys=pxa2xx-spi.1/input0
S: Sysfs=/class/input/input0
U: Uniq=
H: Handlers=mouse0 event0 evbug
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

# cat handlers
N: Number=0 Name=kbd
N: Number=1 Name=mousedev Minor=32
N: Number=2 Name=evdev Minor=64
N: Number=3 Name=evbug


그리고 질문에 대한 답변으로 EventHub.cpp 값에서
....
int EventHub::open_device(const char *deviceName)
{
.............
 
if (test_bit(BTN_TOUCH, key_bitmask)) {
   uint8_t abs_bitmask[(ABS_MAX+1)/8];
   memset(abs_bitmask, 0, sizeof(abs_bitmask));
   LOGV("Getting absolute controllers...");
   if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) >= 0)
   {
       if (test_bit(ABS_X, abs_bitmask) && test_bit(ABS_Y, abs_bitmask)) {
               device->classes |= CLASS_TOUCHSCREEN;   //*** 이부분이 수행되어야함.
              LOGI( " device-> classes : 0x%x" , device->classes ) ;
      }
    }
 ……………..
}

한 후 .. target  Board에서 logcat 하면
 I/EventHub( 1471):  device->classes : 0x2
I/EventHub( 1471): New device: path=/dev/input/event0 name=ADS784x Touchscreen id=0x10000 (of 0x1) index=1 fd=48 classes=0x2
I/SystemServer( 1471): Starting Bluetooth Service.
E/EventHub( 1471): could not get driver version for /dev/input/mouse0, Not a typewriter
I/SystemServer( 1471): Starting Status Bar Service.
E/EventHub( 1471): could not get driver version for /dev/input/mice, Not a typewriter
I/KeyInputQueue( 1471): Device added: id=0x10000, name=null, classes=2
I/KeyInputQueue( 1471):   X: min=0 max=800 flat=0 fuzz=0
I/KeyInputQueue( 1471):   Y: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue( 1471):   Pressure: min=0 max=3000 flat=0 fuzz=0
I/KeyInputQueue( 1471):   Size: unknown values
하고 결과 물은 나옵니다.

그리고 getevent  하면
# getevent
 add device 1: /dev/input/event0
  name:     "ADS784x Touchscreen"
could not get driver version for /dev/input/mouse0, Not a typewriter
could not get driver version for /dev/input/mice, Not a typewriter

 /dev/input/event0: 0003 0018 00000001
/dev/input/event0: 0003 0000 00000267
/dev/input/event0: 0003 0001 00000091
/dev/input/event0: 0003 0018 00000593
/dev/input/event0: 0003 0000 00000265

..
이렇게 터치 값도 나옵니다.. 그런데...
화면에는 변화가 없네요... 무슨 이유인지 알수 가 없어 이렇게 문의를 드립니다.
고수님들의 많은 조언 부탁드립니다. 감사합니다....꾸벅 (__)
이름아이콘 재호아빠
2009-01-20 08:06
kernel의 input report시 800x480범위내의 absolutely값을 보내주는게 맞으시다면 touch 동작에는 문제없을것 같은데.. 이상하군요..(ts_calibration값을 적용하셨는지요?)  

H: Handlers=mouse0 event0 evbug  
<<== 이부분에서 mouse0가 먼저 handling되는지 확인해보시기 바랍니다.

B: KEY=400 0 0 0 0 0 0 0 0 0 0
<<== 저는 KEY값이 0 입니다.



   
이름아이콘 white_duck
2009-01-20 10:08
역시 재호 아빠님이 답변을 해주셧네요... 감사합니다. ..꾸벅 (__)
ts_calibration값은 적용 하였습니다.
key 값은 어떤값인지 정확히 잘 모르겠습니다.
설명점 부탁 드려도 될런지요....
에뮬레이터에서는 key 값이 fffff .... 이렇게 나오던데요...

현재 상태는 터치 클릭하면 화면의 맨 위쪽만 움직이는 상태입니다.
getevent로 했을때 좌표값은 제대로 나오는 상태입니다. 단지 화면에서 어딜 찍어 봐도 맨위쪽만
반응만 한다는겁니다..  
죄송하지만 조금만 더 저에게 지식을 나누어 주세요 ..  부탁드립니다.
   
이름아이콘 재호아빠
2009-01-20 11:41
ads7846 driver의 ABS_X,ABS_Y값을 다시한번 printk로 report해보시기 바랍니다.
달리 드릴 말이  없네요. 천천히 debug해보시길..저도 며칠 걸린 기억이....T.T
도움이 되시길 바랍니다.

#ifdef ANDROID_TOUCH
{
  int xtemp,ytemp;
  xtemp = x; ytemp = y;
  x = ( a[2] + a[0]*xtemp + a[1]*ytemp ) / a[6];
  y =   ( a[5] + a[3]*xtemp + a[4]*ytemp ) / a[6];

  if (x>MAX_TOUCH_X || x < 0 ) x=prev_X;
  if (y>MAX_TOUCH_Y || y < 0 ) y=prev_Y;

  prev_X = x;
  prev_Y = y;
}

if (x<MAX_TOUCH_X && x >=0)
{
  input_report_abs(input_dev, ABS_X, x);
  input_report_abs(input_dev, ABS_Y, y);
  sync = 1;
  printk("Android Touch ABS : %d, %d
", x,y);        
}
#endif


#ifdef ANDROID_TOUCH
 input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
 input_dev->keybit[LONG(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
#endif
   
이름아이콘 HiJune
2009-01-20 12:11
커널의 touch driver에서 input_report_abs로 x,y 좌표를 넘긴 후에 pressure도 전달 되도록 되어있나요?

X,Y 좌표는 들어오는데, pressure 값이 application에 전달되지 않는것 같은데.. 혹시 모르니 한번 확인해보세요, 아래와 같은 형태의 호출이.. touch event handler함수에서 있어야 할겁니다.

>>> input_report_abs(input_dev, ABS_PRESSURE, pressure);
   
이름아이콘 white_duck
2009-01-20 12:15
재호 아빠님 답변 감사드립니다.
처음 답변의 재호 아빠님 말씀대로 일단 mouse0 에서 handling이 일어 나는지 먼저 알아 보려고
# cat /dev/mouse0
 터치를 움직이니 값이 출력 되더군요.
이해하기 조금 어렵지만 마우스에서 handing이 일어 난다는게 어떤 경우에 이렇게 가는지 모르겟습니다.  터치 디바이스 장치도 잡혀 있는데 왜 이러는지 알수 가 없네요..
그리고 두번째 답변에서 리포트 값은 제대로 나옵니다.
커널에 대해 좀더 분석 한 연휴 답을 찾으면 개인적으로 재호 아빠님께 결과 보고 드릴수 있도록 하겟습니다.

p.s 재호 아빠님의 답변이 가장 큰 도움이 되었습니다.  정말 정말 감사합니다. 꾸벅 (__)
   
이름아이콘 white_duck
2009-01-20 12:21
HiJune 님 답변 감사합니다.
HiJune 님 말씀대로 적용은 했습니다.  그런데 상태는 위에서 말씀 드린거와 같습니다. ^^;
   
이름아이콘 HiJune
2009-01-20 14:14
>> "단지 화면에서 어딜 찍어 봐도 맨위쪽만 반응만 한다는겁니다."

화면 위쪽만이라도 반응한다는건 결국 드라이버문제는 아니란 예기고,
Calibration이 사용하시는 환경에 맞는지 확인할 필요가 있겠네요.

몇개의 touch를 포팅해본 경험에 의하면 화면 좌측최상단을 (0,0) 으로 잡고,
x-res, y-res에 맞게 네 귀퉁이를 찍어 계산해서 넘기면 잘 동작했었답니다. :)

그럼 행운을 빕니다.
   
이름아이콘 white_duck
2009-01-21 10:34
HiJune 님 답변감사합니다.
말씀하신대로 값을 넘겼는데도 마찬가지 입니다.
현재 상태는 press값과 x,y값이 제데로 찍여 나오는데 응용 프로그램으로 전달 되는 과정에서
값이 전달이 안되는것 같습니다.
아직까지 그 이유는 파악하지 못한상태 이구요.. 좀더 분석 해 봐야 할듯 합니다...
들풀 정확한 이유를 알게되시면,
안드로이드 정복에 한걸음 크게 다가서겠군요..
미리 축하드릴께여..~ 화이팅.
1/21 10:48
white_duck 더욱 열심히 하도록 하겠습니다. 감사합니다...^^;;
1/21 15:11
   
이름아이콘 jwstyle
2009-01-21 20:06
저도 white_duck님과 비슷한 현상을 겪고 있습니다.

java framework 쪽에서 이벤트와 좌표가 제대로 들어오는지 보려면 어디에서 확인해야하나요?
white_duck 저는 action 값은 제데로 전달이 되는데 x,y 값이 전달이 안되는겁니다.
터치하면 맨 위쪽에서 이벤트가 발새하여 막대 바가 보여지는 현상만 자꾸 일어납니다.
1/22 10:04
jwstyle 안녕하세요. 막대바는 위에있는 시계 아래 생기는것을 말씀하시나요? 저도 터치를 누르면 시계나오는데가 January 01, 1970 이런게 나왔다 들어갔다는 합니다. 디버깅 해봐야 겠네요. 1/22 11:28
white_duck jwstyle님 저와 같은 현상이 맞는듯 하네요.
밑 답글에 제가 말씀드린 파일들 디버깅 해보세요...특히 아래에서 제가 말씀 드린 부분 유심히 보시면 답을 찾을수 있을듯 합니다.
저는 거의 다 풀어 가는중 입니다....
답 찾으면 아마도 허무할듯.....^^;;
1/22 11:56
   
이름아이콘 white_duck
2009-01-22 09:50
mydroid/frameworks/base/services/java/com/android/server 라는 디렉토리 에 자바 관련 소스가 있습니다. 이곳에서 windowmanagerserver.java 와 keyinputQueue.java 파일과 InputDevice.java 파일을 보세요. 특히 keyInputQueue.java 파일에서 293번째 줄에 보면
x,y 좌표값을 전달 하는 부분이 있을겁니다.
그부분이 전달이 잘 되지 않아 문제가 발생한거라 생각이 되구요.. 정확 하지 않지만 현재
분석 결과로는 그렇습니다.
jwstyle님도 보시다 의심가는 부분이 있으면 알려주세요 ... 감사합니다 꾸벅 (__)
들풀 white_duck 님 디깅해 나가시는 모습이 멋지네요. 화이팅 하세요. 1/22 10:19
white_duck 좀더 좋은 정보를 보여드리지 못해 죄송할따름이니다...
아무튼 들풀님의 응원 감사합니다 ...^^
1/22 11:27
   
이름아이콘 HiJune
2009-01-22 11:20
음...  Android frameworks 의 소스코드를 직접 수정하거나 하시진 않으시겠죠?

제 경험상, android framework를 보는것 보단, driver를 차근차근 디버깅 해보시는걸 추천해드리고 싶습니다.  일전에 "gana쪼꼬렛" 님이 올리신 test 소스를 이용해서 touch driver를 디버깅 하시는쪽이 좀더 시간을 벌어줄 것 같습니다.

그럼 계속 건투를 빕니다.

http://www.kandroid.org/board/board.php?board=sourcecode&command=body&no=14
jwstyle 답변 감사합니다. 알려주신 방법으로 다시한번 디버깅 해봐야겠네요.
좋은 하루되세요.
1/22 11:38
   
이름아이콘 white_duck
2009-01-22 11:48
HiJune 님 답글 감사합니다.
소스를 직저적으로 수정하진 않지만 필요하다면 약간씩 수정하여 값의 변화만 보는 상태입니다.
HiJune님 말씀대로 gana쪼꼬렛님이 주신 테스트 프로그램으로 디버깅은 해보았습니다..
지금도 역시 테스트 중이구요...
위에서 소스 수정한건 값의 경로 전달을 알고자 몇가지 수정한것 뿐입니다. ^^
HiJune 아, 네네 ^^
댓글 말구요. 좀전에 제가 "Re..[문의]..." 로 답글을 달았는데
그부분도 참고해보셔요.
1/22 11:54
   
이름아이콘 jwstyle
2009-01-29 10:17
파워문제였네요.
screenIsOn() 함수의 반환값을 true로 해서 해결됐습니다.
들풀 아래의 문제였다는 말씀이신지요?
~mydroid/frameworks/base/services/java/com/android/server/PowerManagerService.java
---------------------------------------------
boolean screenIsOn() {
synchronized (mLocks) {
return (mPowerState & SCREEN_ON_BIT) != 0;
}
}
1/29 10:45
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
4553 안드로이드 포팅 질문입니다. 2009-01-13 8165
4552 안드로이드 초보자인데..가계부프로젝트하나 만들고 있거든요... 2009-01-13 9202
4551 폴더에서 이미지파일을 불러오고 싶습니다. 2009-01-13 10720
4550 camera 영상 위에 텍스트 또는 이미지의 overlay 2009-01-13 12499
4549 emulator android browser에서 다운로드 관련 문제 2009-01-13 7924
4548 ScrollView 가로(horizontal) 스크롤바 동작하나요? 2009-01-13 13208
4547 웹상에 있는 image를 나타내고 싶은데요 2009-01-13 8224
4546 binder patch를 어떻게 하는지요? 2009-01-13 7983
4545 Re..웹상에 있는 image를 나타내고 싶은데요 2009-01-13 9428
4544 사로자바님예제소스 제컴터에서 실행이안되요.. 2009-01-14 9195
4543 G1 phone settings > About phone 메뉴 확인부탁 2009-01-14 7715
4542 tty; Job control 2009-01-14 8468
4541 XML 이용한 Layout관하여 질문드립니다. 2009-01-14 9185
4540 Default buffer size used in BufferedInputStream constructor. 2009-01-14 11179
4539 framework에서 다른 activity 띄우는 방법 문의 2009-01-15 8157
4538 이이콘으로 GIF파일 지원안되나요? 2009-01-15 8577
4537 database 접근법에 대해서 여쭤볼게 있습니다. 2009-01-15 8647
4536 G1 구글 액티베이션 가능한 분 없으신가요? 2009-01-15 8251
4535 NetComponents를 이용해 FTP 구현시 서버의 특정 파일에 대한 .. 2009-01-15 9919
4534 [Q] SD 부팅관련 2009-01-15 8189
4533 G1 사용하기 위해서라면...? 2009-01-16 7388
4532 하나의 Activity에 2개 이상의 media player를 넣는게 가능할.. 2009-01-16 9122
4531 안드로이드 기본 app 수정 후 빌드 시 android.jar에 없는 클.. 2009-01-16 11650
4530 Android Marget 질문 2009-01-16 7569
4529 안드로이드 App은 안드로이드 마켓에 올리거나 배포할때 dex .. 2009-01-16 8640
4528 안드로이드 포팅에 대해 질문.. 2009-01-16 8169
4527 안드로이드 해상도 조절 질문있습니다. 2009-01-16 10320
4526 [문의] 터치 관련하여 질문 드립니다. 2009-01-16 11894
4525 커널 컴파일에 관한 질문입니다. 2009-01-16 8808
4524 안드로이드 포팅하시는 분들은... 2009-01-16 7999
4523 XML UI 2009-01-17 7959
4522 안드로이드 S/W 테스트 2009-01-17 8171
4521 안드로이드 Application 인스톨방법 문의 2009-01-18 9303
4520 manifest관련 질문 입니다. 2009-01-19 8041
4519 background로 보내진 activity 불러오기? 2009-01-19 12878
4518 커널 컴파일 질문. 2009-01-19 9684
4517 r.java 파일이 자동으로 수정이 안되요- 2009-01-19 8628
4516 DB의 한글 데이터 출력중에 한글이 깨집니다!! 2009-01-19 8240
4515 Re..DB의 한글 데이터 출력중에 한글이 깨집니다.. 2009-01-20 13024
4514 arm cortex core CPU에도 안드로이드를 포팅 할수있나요?.. 2009-01-20 8581
4513 2.6.21 커널 위에서 안드로이드 실행 시키기? 2009-01-20 8147
4512 resource 수정후 컴파일 에러 2009-01-20 11667
4511 preload app관련 질문입니다. 2009-01-20 11362
4510 커널 컴파일 질문[리눅스 어렵워요 ㅇ.ㅇ; ] 2009-01-20 8678
4509 text or image 이동 2009-01-20 10671
4508 상용화된 App의 업데이트는 어떻게 이루어지나요?.. 2009-01-20 8247
4507 안드로이드에서 Flash Lite포팅관련 질문(공유메모리, JNI).. 2009-01-21 10650
4506 부트로더 라이센스 질문. 2009-01-21 7902
4505 sqlite expert를 사용해서 DB를 만들었는데 이걸 안드로이드 .. 2009-01-21 11675
4504 G1 unlock 문제 ㅠ ㅠ 2009-01-21 8322
12345678910,,,101