Rockie's Android Porting Guide(3)——Add correct keymap to your system
Rockie Cheng
We already have a keyboard dirver in Linux kernel.
Next, let us notice Android that we have a keyboard.
/* gpio buttons from linux*/
static struct gpio_keys_button gpio_buttons[] = {
{
.gpio = S3C64XX_GPN(0),
.code = 116,
.desc = "ENDCALL",
.active_low = 1,
.wakeup = 0,
},
{
.gpio = S3C64XX_GPN(1),
.code = 139,
.desc = "MENU",
.active_low = 1,
.wakeup = 0,
},
{
.gpio = S3C64XX_GPN(2),
.code = 99,
.desc = "ROTATE",
.active_low = 1,
.wakeup = 0,
},
{
.gpio = S3C64XX_GPN(3),
.code = 102,
.desc = "HOME",
.active_low = 1,
.wakeup = 0,
},
{
.gpio = S3C64XX_GPN(4),
.code = 42,
.desc = "BACK",
.active_low = 1,
.wakeup = 0,
},
{
.gpio = S3C64XX_GPN(5),
.code = 158,
.desc = "BACK",
.active_low = 1,
.wakeup = 0,
}
};
(1)Let me see logcat information.
I/EventHub( 58): New device: path=/dev/input/event1 name=S3C TouchScreen id=0x10000 (of 0x1) index=1 fd=45 classes=0x4
E/EventHub( 58): could not get driver version for /dev/input/mice, Not a typewriter
I/EventHub( 58): New keyboard: publicID=65537 device->id=0x10001 devname='gpio-keys' propName='hw.keyboards.65537.devname' keylayout='/system/usr/keylayout/qwerty.kl' <<<<<<<<Obviously this is not wht we want
I/EventHub( 58): New device: path=/dev/input/event0 name=gpio-keys id=0x10001 (of 0x2) index=2 fd=47 classes=0x1
E/EventHub( 58): could not get driver version for /dev/input/mouse0, Not a typewriter
I/KeyInputQueue( 58): Device added: id=0x0, name=gpio-keys, classes=1
I/KeyInputQueue( 58): Device added: id=0x10000, name=S3C TouchScreen, classes=4
I/KeyInputQueue( 58): X: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue( 58): Y: min=0 max=272 flat=0 fuzz=0
I/KeyInputQueue( 58): Pressure: min=0 max=1 flat=0 fuzz=0
I/KeyInputQueue( 58): Size: unknown values
I/KeyInputQueue( 58): No virtual keys found
(2)make a file build/target/board/idea6410/gpio-keys.kl
key 158 BACK WAKE_DROPPED
key 139 MENU WAKE_DROPPED
key 102 HOME WAKE
key 116 ENDCALL WAKE_DROPPED
key 99 ROTATOR
key 42 POWER WAKE
(3)make another file build/target/board/idea6410/gpio-keys.kcm
First,I just copy it from tutule2.kcm,but it does not work.
So I find this form net,just a little change.
It seems like 9 number keyboard more than qwerty.
[type=QWERTY]
# keycode display number base caps fn caps_fn
A 'A' '2' 'a' 'A' '#' 0x00
B 'B' '2' 'b' 'B' '<' 0x00
C 'C' '2' 'c' 'C' '9' 0x00E7
D 'D' '3' 'd' 'D' '5' 0x00
E 'E' '3' 'e' 'E' '2' 0x0301
F 'F' '3' 'f' 'F' '6' 0x00A5
G 'G' '4' 'g' 'G' '-' '_'
H 'H' '4' 'h' 'H' '[' '{'
I 'I' '4' 'i' 'I' '$' 0x0302
J 'J' '5' 'j' 'J' ']' '}'
K 'K' '5' 'k' 'K' '"' '~'
L 'L' '5' 'l' 'L' ''' '`'
M 'M' '6' 'm' 'M' '!' 0x00
N 'N' '6' 'n' 'N' '>' 0x0303
O 'O' '6' 'o' 'O' '(' 0x00
P 'P' '7' 'p' 'P' ')' 0x00
Q 'Q' '7' 'q' 'Q' '*' 0x0300
R 'R' '7' 'r' 'R' '3' 0x20AC
S 'S' '7' 's' 'S' '4' 0x00DF
T 'T' '8' 't' 'T' '+' 0x00A3
U 'U' '8' 'u' 'U' '&' 0x0308
V 'V' '8' 'v' 'V' '=' '^'
W 'W' '9' 'w' 'W' '1' 0x00
X 'X' '9' 'x' 'X' '8' 0xEF00
Y 'Y' '9' 'y' 'Y' '%' 0x00A1
Z 'Z' '9' 'z' 'Z' '7' 0x00
# on pc keyboards
COMMA ',' ',' ',' ';' ';' '|'
PERIOD '.' '.' '.' ':' ':' 0x2026
AT '@' '0' '@' '0' '0' 0x2022
SLASH '/' '/' '/' '?' '?' '/'
SPACE 0x20 0x20 0x20 0x20 0xEF01 0xEF01
ENTER 0xa 0xa 0xa 0xa 0xa 0xa
TAB 0x9 0x9 0x9 0x9 0x9 0x9
0 '0' '0' '0' ')' ')' ')'
1 '1' '1' '1' '!' '!' '!'
2 '2' '2' '2' '@' '@' '@'
3 '3' '3' '3' '#' '#' '#'
4 '4' '4' '4' '$' '$' '$'
5 '5' '5' '5' '%' '%' '%'
6 '6' '6' '6' '^' '^' '^'
7 '7' '7' '7' '&' '&' '&'
8 '8' '8' '8' '*' '*' '*'
9 '9' '9' '9' '(' '(' '('
GRAVE '`' '`' '`' '~' '`' '~'
MINUS '-' '-' '-' '_' '-' '_'
EQUALS '=' '=' '=' '+' '=' '+'
LEFT_BRACKET '[' '[' '[' '{' '[' '{'
RIGHT_BRACKET ']' ']' ']' '}' ']' '}'
BACKSLASH '/' '/' '/' '|' '/' '|'
SEMICOLON ';' ';' ';' ':' ';' ':'
APOSTROPHE ''' ''' ''' '"' ''' '"'
STAR '*' '*' '*' '*' '*' '*'
POUND '#' '#' '#' '#' '#' '#'
PLUS '+' '+' '+' '+' '+' '+'
(4)add these to AndroidBoard.mk
file := $(TARGET_OUT_KEYLAYOUT)/gpio-keys.kl
ALL_PREBUILT += $(file)
$(file) : $(LOCAL_PATH)/gpio-keys.kl | $(ACP)
$(transform-prebuilt-to-target)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := gpio-keys.kcm
include $(BUILD_KEY_CHAR_MAP)
(5)add these to system.prop
android.keylayout.gpio-keys = /system/usr/keylayout/gpio-keys.kl
android.keychar.gpio-keys = /system/usr/keychars/gpio-keys.kcm
(6)build your system again
Now we can see the different:
I/EventHub( 63): New device: path=/dev/input/event1 name=S3C TouchScreen id=0x10000 (of 0x1) index=1 fd=50 classes=0x4
E/EventHub( 63): could not get driver version for /dev/input/mice, Not a typewriter
E/KeyLayoutMap( 63): /system/usr/keylayout/gpio-keys.kl:10: expected keycode, got 'ROTATOR'
I/EventHub( 63): New keyboard: publicID=0 device->id=0x10001 devname='gpio-keys' propName='hw.keyboards.0.devname' keylayout='/system/usr/keylayout/gpio-keys.kl'<<<<<<<<OK correct!
I/EventHub( 63): New device: path=/dev/input/event0 name=gpio-keys id=0x10001 (of 0x2) index=2 fd=52 classes=0x1
E/EventHub( 63): could not get driver version for /dev/input/mouse0, Not a typewriter
I/KeyInputQueue( 63): Device added: id=0x0, name=gpio-keys, classes=1
I/KeyInputQueue( 63): Device added: id=0x10000, name=S3C TouchScreen, classes=4
I/KeyInputQueue( 63): X: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue( 63): Y: min=0 max=272 flat=0 fuzz=0
I/KeyInputQueue( 63): Pressure: min=0 max=1 flat=0 fuzz=0
I/KeyInputQueue( 63): Size: unknown values
I/KeyInputQueue( 63): No virtual keys found
System do not know the word "ROTATOR" presently.
You can add a USB-KEYBOARD too.
Rockie Cheng 阿虚
Reference:
http://www.kandroid.org/android_pdk/keymaps_keyboard_input.html