Search code examples
androidandroid-sourceandroid-keypadandroid-kernel

USB keypad - Not getting same scan code in android


I have a USB keypad with 0 to 9,*,#,+,-,CALL,CALLEND keys and I am using it with an Android board.

With the default android Generic.kl file, this keypad provides proper output for each key pressed (checked in a TextBox and this application).

Scan code of these are as below as per application mentioned above,

CALL - META_SHIFT_ON | META_SHIFT_RIGHT_ON - scanCode:48 keyCode:30 KEYCODE_B

ENDCALL - META_SHIFT_ON | META_SHIFT_RIGHT_ON - scanCode:30 keyCode:29 KEYCODE_A

STAR - META_SHIFT_ON | META_SHIFT_RIGHT_ON - scanCode:9 keyCode:15 KEYCODE_8

POUND - META_SHIFT_ON | META_SHIFT_RIGHT_ON - scanCode:4 keyCode:10 KEYCODE_3

I need to remap it, and my custom .kl content is as follows,

key 2 1

key 3 2

key 4 3

key 5 4

key 6 5

key 7 6

key 8 7

key 9 8

key 10 9

key 11 0

key 12 VOLUME_DOWN

key 78 VOLUME_UP

key 30 ENDCALL

key 48 CALL

I have put it in /system/usr/keylayout/

Now with this change, when I am checking the scan code with same test application, I am getting scanCode:54 for the ENDCALL button which was previously 30.

I have following questions from this behavior,

  1. What my understanding is of scan codes is that they are hardware specific and it will provide the same scan code every time whatever the software/host is? I mean scan code for keypad will not change? Which is not happening here.
  2. I have also tried with adding file .kcm in /system/usr/keychars/ but with or without it the behaviour is the same. Do I need to use a .kcm file for it?

Solution

    1. Yes, afaik scan codes are specific to firmware residing in hardware. i.e for keypad/keyboard devices scan code will be provided by hardware and they will be unique to distinguish keys.

    2. In android, if you don't want to alter character map of your device, you don't need character map file(.kcm). Job of character map file is to map keycode to human readable character. If you don't provide .kcm file for your device it will use Generic.kcm file for character mapping.

    You can also refer link 1 & 2 for more information.