Android 기술 Q&A 
Q&A 게시판에 질문을 남기신 글에 대한 답변/덧글/쪽글에 대한 Push 메일 서비스를 받고자 하시는 분들은
☞ Push 메일 서비스 공지를 필독하시기 바랍니다.
Android Input device porting (keyboard,touch)
작성자
작성일 2008-11-27 (목) 09:58
ㆍ추천: 0  ㆍ조회: 11691      
IP: 203.xxx.3
첨부#1 android_touch.avi (1,410KB) (Down:1107)
 
안녕하세요.. 반갑습니다.
매번 질문만 하다가 이렇게 조금이나마 정리한 자료를 올리게 되어 기쁘네요..
 
Android 1.0을 porting하면서 Input장치들에 대해 작업한 내용을 간략하게 정리하고 합니다.
혹시 아직 작업하시는분들에게 조금이나마 도움이 되었으면 좋겠습니다..
 
 
1. keyboard
 
    쿼티키보드가 있으면 좋겟지만..저는 없기에... 일단 pushkey로 간단히 driver를 만들었어요.. (GPIO)
    만약 pushkey로 구현을 하시는 분들은 아래와 같은 keycode로  input_system report하시면 됩니다.
 
      Emulator     key value(linux driver)
      --------------------------------------
      "KEY-RIGHT"  KEY_RIGHT    
      "KEY-LEFT"    KEY_LEFT    
      "KEY-UP"        KEY_UP     
      "KEY-DOWN"   KEY_DOWN    
      "KEY-REPLY"  KEY_REPLY   
      "KEY-VOLDN"  KEY_VOLUMEDOWN 
      "KEY-RETURN" KEY_BACK    
      "KEY-VOLUP"   KEY_VOLUMEUP  
      "KEY-MENU"    0xE5       
      "KEY-HOME"    KEY_HOME    
      "KEY-POWER"   KEY_POWER    
 
       만약 USB keyboard를 쓰신다면 init수행하시기전 usbkbd module을 적재하신후
       /system/usr/keylayout/qwerty.kl의 내용중 자신이 mapping하고 싶은 usb keyboard로 값을 바꾸시면 됩니다.
       default값은 쿼티키보드의 값인것 같던데 제가 가진 usbkeyboard와는 값이 조금 다르더군요..
 
     Original qwerty                 value to chage(usb keyboard)
     ------------------------------------------------------
     key 116   POWER              ->  key 88  (F12)   
     key 115   VOLUME_UP       ->  key 78  (NUM +)
     key 114   VOLUME_DOWN  ->  key 74  (NUM -)
     key 229   MENU                ->  key 102 (HOME)
     key 158   BACK                 ->  key 104 (PAGEUP)
     key 158   HOME                ->  key 110 (INSERT)
     key 231   CALL                 ->  key 107 (END)
     key 107   ENDCALL           ->  key 109 (PAGEDOWN)
  
  
        다른 key로 mapping하시고 싶으시면  아래 추가로 다른 key에 대한 code가 있으니 참고하세요.
        usbkbd driver단의 usb_kbd_irq()에서 report되는 key값을 catch하셔서 확인하셔도 되겠습니다.
       ---------------------------------------------
        key  1    ESC         key 110   INSERT   
        key 59    F1            key 102   HOME     
        key 60    F2            key 104   PAGE-UP  
        key 61    F3            key 111   DELETE   
        key 62    F4            key 107   END      
        key 63    F5            key 109   PAGE-DOWN
        key 64    F6                               
        key 65    F7            key 74    NUM -    
        key 66    F8            key 78    MUM +    
        key 67    F9            key 14    BACKSPACE
        key 68    F10
        key 87    F11
        key 88    F12
     
     android init를 수행하기전에 자신의 proc file system에 정상적으로 올라갔는지 확인해보시기 바랍니다.
     # cat /proc/bus/input/devices  (아래것은 일단 pushkey것입니다.)

          [@/]$ cat /proc/bus/input/devices
         I: Bus=ffff Vendor=ffff Product=ffff Version=0001
         N: Name="pushkey"
         P: Phys=
         S: Sysfs=/class/input/input0
         U: Uniq=
         H: Handlers=event0
         B: EV=3
         B: KEY=120 0 0 40000000 1c16c0 0 0 0
 

 
2. touch screen.
 
   저 같은 경우 이미 kernel에 ads7846의 touch driver가 올라가 있는 상태입니다. tslib를 이용하여 다른 application에서
   (like Qt) Touch를 돌리곤 했었습니다.  아시다시피 Android는 ABS touch값만 input system에서 받아갑니다.
   따라서 tslib가 중간에서 touch raw data를 filtering한 내용을 touch driver에 심어주면 되겠습니다.
   저같은경우는 linear mode로 tslib를 사용하였으므로 ts_calibrate에서 나온 pointercal 화일의 내용을 참고하여
   아래와 같이 작업하였습니다. (480x272 tocuhLCD)
 
   pointercal 의 내용 :  -8225 150 32086264 -11 -5069 18605140 65536
 
   ads7846,c 
   -----------
    input_report_abs(input_dev, ABS_X, x);   input_report_abs(input_dev, ABS_Y, y);
 
    기존 위의 x,y 값을 inputsystem에 report하는 code대신 아래와 같이 구성하였습니다.
     ==>
    static void ads7846_rx(void *ads)
    {  .............
      static int a[7]={-8225, 150, 32086264, -11, -5069, 18605140, 65536};  //pointercal의 내용..
      int prev_X,prev_Y;  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>480 || x < 0 ) x=prev_X;    if (y>272 || y < 0 ) y=prev_Y;
      prev_X = x;    prev_Y = y;
    
       if (x<480 && x >=0)
      {
         input_report_abs(input_dev, ABS_X, x);     //480x272범위 안의 ABS 좌표값이 전달됨.
         input_report_abs(input_dev, ABS_Y, y);
         sync = 1;
        //printk("Android Touch ABS : %d, %dn", x,y);   
      }
      .................
    }
 
 
    static int __devinit ads7846_probe(struct spi_device *spi)
    {
     ................
     //아래 2줄이 중요합니다 androids source의  frameworks/base/services/java/com/android/server/
     //KeyInputQueue.java의 newInputDevice()과  frameworks/base/libs/ui/EventHub.cpp의 open_device()
     //을 따라가보시면 아래의 조건에 따라 정상등록이 된다는것을 파악하실수 있습니다.
 
       input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y);                              
       input_dev->keybit[LONG(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 
       input_set_abs_params(input_dev, ABS_X,0,480,0,0);
       input_set_abs_params(input_dev, ABS_Y,0,272,0,0);
     .....
      }
 
   마찬가지로 proc filesystem을 참고하여 정상적으로 최종 input system이 등록되었는지 확인합니다.
 
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="ADS784x Touchscreen"
    P: Phys=spi0.0/input0
    S: Sysfs=/class/input/input1
    U: Uniq=
    H: Handlers=event1
    B: EV=b
    B: KEY=0
    B: ABS=1000003
 
 
   이제 android init를 수행시킬 준비가되었네요.. Android 시작후 logcat으로 dump를 보시면 아래의 내용이
   dump가 되면 정상적으로 input system은 동작됩니다..
--------------------------------------
.........
I/EventHub(  652): New device: path=/dev/input/event1 name=ADS784x Touchscreen id=0x10000 (of 0x1) index=1 fd=40 classes=0x2
I/EventHub(  652): New device: path=/dev/input/event0 name=SEM SAMSUNG MM USB keyboard id=0x10001 (of 0x2) index=2 fd=45 classes=0x1
I/EventHub(  652): New keyboard: publicID=65537 device->id=65537 devname='SEM SAMSUNG MM USB keyboard propName='hw.keyboards.65537.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/KeyInputQueue(  652): Device added: id=0x0, name=SEM SAMSUNG MM USB keyboard, classes=1
I/KeyInputQueue(  652): Device added: id=0x10000, name=null, classes=2
I/KeyInputQueue(  652):   X: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue(  652):   Y: min=0 max=272 flat=0 fuzz=0
I/KeyInputQueue(  652):   Pressure: min=0 max=7200 flat=0 fuzz=0
I/KeyInputQueue(  652):   Size: unknown values
.........
 
 
Android source하고 kernel&driver를 왔다갔다하면서 logcat을 따라가면서 작업하니까 비교적 쉽게 porting가능했었던
같습니다. logcat이 없었으면 못했을것 같네요..ㅋㅋ
 
카메라로 찍으면서 간단히 touch를 돌려봤어요..손이부족해서 keyboard는 못치고... ^^... 첨부에 동영상 올렸습니다..
 
 
 
 
 
 
이름아이콘 인베인
2008-11-27 16:20
알찬 정보를 올려주셔서 감사합니다. 본 커뮤니티에 접속하시는 많은 분들에게 도움과 귀감이 될것입니다.
   
이름아이콘 재호아빠
2008-11-29 12:08
멀 귀감까지...T.T... 인베인님 감사합니다.. 매번 귀찮게만 하고..^^
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.
    N     분류     제목    글쓴이 작성일 조회
4753 안드로이드 풀빌드 준비 과정 중 질문입니다. 2008-11-24 9712
4752 개발자 등록 2008-11-24 8242
4751 Wifi Setting..... 2008-11-24 10340
4750 현재 화면 을 캡쳐 할수 있는 길이 있을까요? 2008-11-24 10918
4749 make sdk 2008-11-25 8318
4748 수동으로 빌드할때 오류~ 질문있습니다. 2008-11-25 10604
4747 Camera app 추가 방법 질문입니다. 2008-11-25 9333
4746 screen을 flip 하는 방법 (rotation) 문의 2008-11-25 10968
4745 Re..[오웬] Camera app 추가 방법 질문입니다. 2008-11-25 12375
4744 텍스트파일 읽기에 대해 질문드려요~ 2008-11-26 9669
4743 안드로이드 마켓 질문 2008-11-26 8134
4742 make sdk error2 2008-11-26 8414
4741 binder driver 관련 2008-11-26 12449
4740 touch 잡기...어떤과정을 거쳐야 하나요?? 2008-11-26 8956
4739 초보질문입니다... (gui선택버튼 관련) 2008-11-27 8175
4738 ListView의 아이템이 클릭이 안되요. 2008-11-27 8469
4737 Android Input device porting (keyboard,touch) 2008-11-27 11691
4736 퀄컴소스에 Dalvik porting 해보신 분 계신가요? 2008-11-27 9152
4735 다시 한번 질문을 드리겠습니다... 2008-11-27 10477
4734 에뮬에서 웹브라우저를 통해 어플리케이션 설치하기.. 2008-11-27 11298
4733 Android porting 관련 질문 2008-11-27 10976
4732 APIDemo uninstall하고 새로 install하려는데 안되요.... 2008-11-28 10636
4731 [Tips]에뮬 홈화면을 원하는 자기사진으로 꾸미기.. 2008-11-28 8467
4730 Full build시 특정 app을 제외시키는 script 같은 것이 있나요.. 2008-11-28 8981
4729 Smack 관련 질문드려요~ 2008-11-28 11059
4728 ApiDemo에서 MediaPlayer 질문입니다. 2008-11-28 40145
4727 타이머에 대해 질문있어요~ 2008-11-28 8474
4726 안드로이드 포팅 하드웨어 스펙 2008-11-28 8984
4725 G1을 어떻게 구할수 있을까요? 2008-11-28 7995
4724 소스를 debug모드로 빌드 시 에러나는 문제 2008-11-28 8274
4723 슬라이드를 열었을때 View가 변하지 않게하는 방법 아시나요?.. 2008-11-29 8505
4722 웹서버와 연동 질문입니다 2008-11-29 9441
4721 intent 질문입니다. ㅠ_ㅠ 2008-11-29 8478
4720 R 관련 질문하나 드려도 될까요? 2008-11-29 8434
4719 로컬 비디오 플레이 실행 질문~ 2008-12-01 8456
4718 double buffering 관련 질문. 2008-12-01 9186
4717 안드로이드 어플 + trace32 2008-12-01 8545
4716 apache xml-rpc 관련.. 2008-12-01 8252
4715 안드로이드 포팅 보드 구입 관련 질문 드려요 2008-12-01 8421
4714 에뮬테이터에 시간이 흐르지 않습니다. 왜그럴까요?.. 2008-12-02 8147
4713 android application 실행 문제 2008-12-02 12018
4712 NFS로 포팅관련 질문드립니다 2008-12-02 9557
4711 Full source에서 IM만 따로 build하려면 어떻게 하나요.??.. 2008-12-02 9247
4710 Re..NFS로 포팅관련 질문드립니다 2008-12-02 9348
4709 Android file system에 대한 질문입니다. 2008-12-03 9082
4708 MediaPlayer 관해서....ㅠㅠ 2008-12-03 10492
4707 HAL Library Porting 관련 질문! 2008-12-03 8926
4706 다시 질문 입니다....ㅜㅜ 2008-12-03 8484
4705 SDK 1.0과 full source code의 관계.?? 2008-12-04 9326
4704 좀 갈켜주세요..ㅠㅠ 2008-12-04 8081
12345678910,,,101