• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!--
2   Copyright 2011 The Android Open Source Project
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15-->
16
17# Key Layout Files #
18
19Key layout files (`.kl` files) are responsible for mapping Linux key codes
20and axis codes to Android key codes and axis codes and specifying associated
21policy flags.
22
23Device-specific key layout files are *required* for all internal (built-in)
24input devices that have keys, including special keys such as volume, power
25and headset media keys.
26
27Device-specific key layout files are *optional* for other input devices but
28they are *recommended* for special-purpose keyboards and joysticks.
29
30If no device-specific key layout file is available, then the system will
31choose a default instead.
32
33## Location ##
34
35Key layout files are located by USB vendor, product (and optionally version)
36id or by input device name.
37
38The following paths are consulted in order.
39
40*   `/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl`
41*   `/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl`
42*   `/system/usr/keylayout/DEVICE_NAME.kl`
43*   `/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl`
44*   `/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl`
45*   `/data/system/devices/keylayout/DEVICE_NAME.kl`
46*   `/system/usr/keylayout/Generic.kl`
47*   `/data/system/devices/keylayout/Generic.kl`
48
49When constructing a file path that contains the device name, all characters
50in the device name other than '0'-'9', 'a'-'z', 'A'-'Z', '-' or '_' are replaced by '_'.
51
52## Generic Key Layout File ##
53
54The system provides a special built-in generic key layout file called `Generic.kl`.
55This key layout is intended to support a variety of standard external
56keyboards and joysticks.
57
58*Do not modify the generic key layout!*
59
60## Syntax ##
61
62A key layout file is a plain text file consisting of key or axis declarations
63and flags.
64
65### Key Declarations ###
66
67Key declarations each consist of the keyword `key` followed by a Linux key code
68number, an Android key code name, and optional set of whitespace delimited policy flags.
69
70    key 1     ESCAPE
71    key 114   VOLUME_DOWN       WAKE
72    key 16    Q                 VIRTUAL     WAKE
73
74The following policy flags are recognized:
75
76*   `WAKE`: The key should wake the device when it is asleep.  For historical reasons,
77    this flag behaves in the same manner as `WAKE_DROPPED` below.
78*   `WAKE_DROPPED`: The key should wake the device when it is asleep but the key itself
79    should be dropped when the wake-up occurs.  In a sense, the key's action was to
80    wake the device, but the key itself is not processed.
81*   `SHIFT`: The key should be interpreted as if the SHIFT key were also pressed.
82*   `CAPS_LOCK`: The key should be interpreted as if the CAPS LOCK key were also pressed.
83*   `ALT`: The key should be interpreted as if the ALT key were also pressed.
84*   `ALT_GR`: The key should be interpreted as if the RIGHT ALT key were also pressed.
85*   `FUNCTION`: The key should be interpreted as if the FUNCTION key were also pressed.
86*   `VIRTUAL`: The key is a virtual soft key (capacitive button) that is adjacent to
87    the main touch screen.  This causes special debouncing logic to be enabled, see below.
88*   `MENU`: Deprecated.  Do not use.
89*   `LAUNCHER`: Deprecated.  Do not use.
90
91### Axis Declarations ###
92
93Axis declarations each consist of the keyword `axis` followed by a Linux axis code
94number, and qualifiers that control the behavior of the axis including at least
95one Android axis code name.
96
97#### Basic Axes ####
98
99A basic axis simply maps a Linux axis code to an Android axis code name.
100
101The following declaration maps `ABS_X` (indicated by `0x00`) to `AXIS_X` (indicated by `X`).
102
103    axis 0x00 X
104
105In the above example, if the value of `ABS_X` is `5` then `AXIS_X` will be set to `5`.
106
107#### Split Axes ####
108
109A split axis maps a Linux axis code to two Android axis code names, such that
110values less than or greater than a threshold are split across two different axes when
111mapped.  This mapping is useful when a single physical axis reported by the device
112encodes two different mutually exclusive logical axes.
113
114The following declaration maps values of the `ABS_Y` axis (indicated by `0x01`) to
115`AXIS_GAS` when less than `0x7f` or to `AXIS_BRAKE` when greater than `0x7f`.
116
117    axis 0x01 split 0x7f GAS BRAKE
118
119In the above example, if the value of `ABS_Y` is `0x7d` then `AXIS_GAS` is set
120to `2` (`0x7f - 0x7d`) and `AXIS_BRAKE` is set to `0`.  Conversely, if the value of
121`ABS_Y` is `0x83` then `AXIS_GAS` is set to `0` and `AXIS_BRAKE` is set to `4`
122(`0x83 - 0x7f`).  Finally, if the value of `ABS_Y` equals the split value of `0x7f`
123then both `AXIS_GAS` and `AXIS_BRAKE` are set to `0`.
124
125#### Inverted Axes ####
126
127An inverted axis inverts the sign of the axis value.
128
129The following declaration maps `ABS_RZ` (indicated by `0x05`) to `AXIS_BRAKE`
130(indicated by `BRAKE`), and inverts the output by negating it.
131
132    axis 0x05 invert AXIS_RZ
133
134In the above example, if the value of `ABS_RZ` is `2` then `AXIS_RZ` is set to `-2`.
135
136#### Center Flat Position Option ####
137
138The Linux input protocol provides a way for input device drivers to specify the
139center flat position of joystick axes but not all of them do and some of them
140provide incorrect values.
141
142The center flat position is the neutral position of the axis, such as when
143a directional pad is in the very middle of its range and the user is not
144touching it.
145
146To resolve this issue, an axis declaration may be followed by a `flat`
147option that specifies the value of the center flat position for the axis.
148
149    axis 0x03 Z flat 4096
150
151In the above example, the center flat position is set to `4096`.
152
153### Comments ###
154
155Comment lines begin with '#' and continue to the end of the line.  Like this:
156
157    # A comment!
158
159Blank lines are ignored.
160
161### Examples ###
162
163#### Keyboard ####
164
165    # This is an example of a key layout file for a keyboard.
166
167    key 1     ESCAPE
168    key 2     1
169    key 3     2
170    key 4     3
171    key 5     4
172    key 6     5
173    key 7     6
174    key 8     7
175    key 9     8
176    key 10    9
177    key 11    0
178    key 12    MINUS
179    key 13    EQUALS
180    key 14    DEL
181
182    # etc...
183
184#### System Controls ####
185
186    # This is an example of a key layout file for basic system controls, such as
187    # volume and power keys which are typically implemented as GPIO pins that
188    # the device decodes into key presses.
189
190    key 114   VOLUME_DOWN       WAKE
191    key 115   VOLUME_UP         WAKE
192    key 116   POWER             WAKE
193
194#### Capacitive Buttons ####
195
196    # This is an example of a key layout file for a touch device with capacitive buttons.
197
198    key 139    MENU           VIRTUAL
199    key 102    HOME           VIRTUAL
200    key 158    BACK           VIRTUAL
201    key 217    SEARCH         VIRTUAL
202
203#### Headset Jack Media Controls ####
204
205    # This is an example of a key layout file for headset mounted media controls.
206    # A typical headset jack interface might have special control wires or detect known
207    # resistive loads as corresponding to media functions or volume controls.
208    # This file assumes that the driver decodes these signals and reports media
209    # controls as key presses.
210
211    key 163   MEDIA_NEXT        WAKE
212    key 165   MEDIA_PREVIOUS    WAKE
213    key 226   HEADSETHOOK       WAKE
214
215#### Joystick ####
216
217    # This is an example of a key layout file for a joystick.
218
219    # These are the buttons that the joystick supports, represented as keys.
220    key 304   BUTTON_A
221    key 305   BUTTON_B
222    key 307   BUTTON_X
223    key 308   BUTTON_Y
224    key 310   BUTTON_L1
225    key 311   BUTTON_R1
226    key 314   BUTTON_SELECT
227    key 315   BUTTON_START
228    key 316   BUTTON_MODE
229    key 317   BUTTON_THUMBL
230    key 318   BUTTON_THUMBR
231
232    # Left and right stick.
233    # The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd.
234    # This confuses applications that rely on the flat value because the joystick actually
235    # settles in a flat range of +/- 4096 or so.  We override it here.
236    axis 0x00 X flat 4096
237    axis 0x01 Y flat 4096
238    axis 0x03 Z flat 4096
239    axis 0x04 RZ flat 4096
240
241    # Triggers.
242    axis 0x02 LTRIGGER
243    axis 0x05 RTRIGGER
244
245    # Hat.
246    axis 0x10 HAT_X
247    axis 0x11 HAT_Y
248
249## Wake Keys ##
250
251Wake keys are special keys that wake the device from sleep, such as the power key.
252
253By default, for internal keyboard devices, no key is a wake key.  For external
254keyboard device, all keys are wake keys.
255
256To make a key be a wake key, set the `WAKE_DROPPED` flag in the key layout file
257for the keyboard device.
258
259Note that the `WindowManagerPolicy` component is responsible for implementing wake
260key behavior.  Moreover, the key guard may prevent certain keys from functioning
261as wake keys.  A good place to start understanding wake key behavior is
262`PhoneWindowManager.interceptKeyBeforeQueueing`.
263
264## Virtual Soft Keys ##
265
266The input system provides special features for implementing virtual soft keys.
267
268There are three cases:
269
2701.  If the virtual soft keys are displayed graphically on the screen, as on the
271    Galaxy Nexus, then they are implemented by the Navigation Bar component in
272    the System UI package.
273
274    Because graphical virtual soft keys are implemented at a high layer in the
275    system, key layout files are not involved and the following information does
276    not apply.
277
2782.  If the virtual soft keys are implemented as an extended touchable region
279    that is part of the main touch screen, as on the Nexus One, then the
280    input system uses a virtual key map file to translate X / Y touch coordinates
281    into Linux key codes, then uses the key layout file to translate
282    Linux key codes into Android key codes.
283
284    Refer to the section on [Touch Devices](/tech/input/touch-devices.html)
285    for more details about virtual key map files.
286
287    The key layout file for the touch screen input device must specify the
288    appropriate key mapping and include the `VIRTUAL` flag for each key.
289
2903.  If the virtual soft keys are implemented as capacitive buttons that are
291    separate from the main touch screen, as on the Nexus S, then the kernel
292    device driver or firmware is responsible for translating touches into
293    Linux key codes which the input system then translates into Android
294    key codes using the key layout file.
295
296    The key layout file for the capacitive button input device must specify the
297    appropriate key mapping and include the `VIRTUAL` flag for each key.
298
299When virtual soft key are located within or in close physical proximity of the
300touch screen, it is easy for the user to accidentally press one of the buttons
301when touching near the bottom of the screen or when sliding a finger from top
302to bottom or from bottom to top on the screen.
303
304To prevent this from happening, the input system applies a little debouncing
305such that virtual soft key presses are ignored for a brief period of time
306after the most recent touch on the touch screen.  The delay is called the
307virtual key quiet time.
308
309To enable virtual soft key debouncing, we must do two things.
310
311First, we provide a key layout file for the touch screen or capacitive button
312input device with the `VIRTUAL` flag set for each key.
313
314    key 139    MENU           VIRTUAL
315    key 102    HOME           VIRTUAL
316    key 158    BACK           VIRTUAL
317    key 217    SEARCH         VIRTUAL
318
319Then, we set the value of the virtual key quiet time in a resource overlay
320for the framework `config.xml` resource.
321
322    <!-- Specifies the amount of time to disable virtual keys after the screen is touched
323         in order to filter out accidental virtual key presses due to swiping gestures
324         or taps near the edge of the display.  May be 0 to disable the feature.
325         It is recommended that this value be no more than 250 ms.
326         This feature should be disabled for most devices. -->
327    <integer name="config_virtualKeyQuietTimeMillis">250</integer>
328
329## Validation ##
330
331Make sure to validate your key layout files using the
332[Validate Keymaps](/tech/input/validate-keymaps.html) tool.
333