2007 2013 Kandroid
www.kandroid.org »
kandroid s/w fundamentals 교육 »
안드로이드 Prototype 
Android Input device porting (keyboard,touch)
작성자 재호아빠
작성일 2008-11-27 (목) 09:58
ㆍ추천: 0  ㆍ조회: 8948      
IP: 203.xxx.3
첨부#1 android_touch.avi (1,410KB) (Down:509)
 
안녕하세요.. 반갑습니다.
매번 질문만 하다가 이렇게 조금이나마 정리한 자료를 올리게 되어 기쁘네요..
 
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     분류     제목    글쓴이 작성일 조회
Rooting Nexus One [11]+27 이광우 2010-07-30 6630
62 (안드로이드 유틸)안드로이드 미러링 프로그램을 소개해 드립.. VMS솔루션 2012-03-07 1668
61 [Super-Minimal] Android TINY Build for Gingerbread [1]+1 들풀 2011-07-01 2655
60 iPhone에 안드로이드 포팅 방법(iDroid) [2]+3 인베인 2010-04-23 11305
59 HX4700용 안드로이드 커널, 정확한 좌표입력 가능한 버젼 배포.. [2] 좋은이 2009-09-08 4077
58 HX4700 용 안드로이드 커널을 배포합니다. [2] 좋은이 2009-09-05 4471
57 live-android : A LiveCD for Android [3] bcbae 2009-07-16 2324
56 android-1.5 pm workaround [3]+7 이광우 2009-04-28 2865
55 2.6.29기반 Android Kernel Update [7]+2 인베인 2009-04-10 5380
54 안드로이드 스마트폰 [14]+3 주현 2009-03-27 7012
53 안드로이드의 SREC(음성인식시스템) 메뉴얼 [3]+3 인베인 2009-03-25 5066
52 [소식] AESOP-6410 안드로이드 포팅 [4]+5 엠브리오 2009-03-16 5759
51 Android Input device porting (keyboard,touch) [2] 재호아빠 2008-11-27 8948
50 aESOP S3C6410 공제(공동제작) 진행 및 참여 안내관리자.. [5]+2 인베인 2009-02-26 3965
49 Android Porting Guide to Beagle보드(cortex-a8) [3] 인베인 2009-02-26 4832
48    Re..Acting as NAT through Ethernet over USB on beagleboard 인베인 2009-09-23 4111
1234