| <!-- | 
 |    Copyright 2011 The Android Open Source Project | 
 |  | 
 |    Licensed under the Apache License, Version 2.0 (the "License"); | 
 |    you may not use this file except in compliance with the License. | 
 |    You may obtain a copy of the License at | 
 |  | 
 |        http://www.apache.org/licenses/LICENSE-2.0 | 
 |  | 
 |    Unless required by applicable law or agreed to in writing, software | 
 |    distributed under the License is distributed on an "AS IS" BASIS, | 
 |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |    See the License for the specific language governing permissions and | 
 |    limitations under the License. | 
 | --> | 
 |  | 
 | # Key Layout Files # | 
 |  | 
 | Key layout files (`.kl` files) are responsible for mapping Linux key codes | 
 | and axis codes to Android key codes and axis codes and specifying associated | 
 | policy flags. | 
 |  | 
 | Device-specific key layout files are *required* for all internal (built-in) | 
 | input devices that have keys, including special keys such as volume, power | 
 | and headset media keys. | 
 |  | 
 | Device-specific key layout files are *optional* for other input devices but | 
 | they are *recommended* for special-purpose keyboards and joysticks. | 
 |  | 
 | If no device-specific key layout file is available, then the system will | 
 | choose a default instead. | 
 |  | 
 | ## Location ## | 
 |  | 
 | Key layout files are located by USB vendor, product (and optionally version) | 
 | id or by input device name. | 
 |  | 
 | The following paths are consulted in order. | 
 |  | 
 | *   `/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl` | 
 | *   `/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl` | 
 | *   `/system/usr/keylayout/DEVICE_NAME.kl` | 
 | *   `/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl` | 
 | *   `/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl` | 
 | *   `/data/system/devices/keylayout/DEVICE_NAME.kl` | 
 | *   `/system/usr/keylayout/Generic.kl` | 
 | *   `/data/system/devices/keylayout/Generic.kl` | 
 |  | 
 | When constructing a file path that contains the device name, all characters | 
 | in the device name other than '0'-'9', 'a'-'z', 'A'-'Z', '-' or '_' are replaced by '_'. | 
 |  | 
 | ## Generic Key Layout File ## | 
 |  | 
 | The system provides a special built-in generic key layout file called `Generic.kl`. | 
 | This key layout is intended to support a variety of standard external | 
 | keyboards and joysticks. | 
 |  | 
 | *Do not modify the generic key layout!* | 
 |  | 
 | ## Syntax ## | 
 |  | 
 | A key layout file is a plain text file consisting of key or axis declarations | 
 | and flags. | 
 |  | 
 | ### Key Declarations ### | 
 |  | 
 | Key declarations each consist of the keyword `key` followed by a Linux key code | 
 | number, an Android key code name, and optional set of whitespace delimited policy flags. | 
 |  | 
 |     key 1     ESCAPE | 
 |     key 114   VOLUME_DOWN       WAKE | 
 |     key 16    Q                 VIRTUAL     WAKE | 
 |  | 
 | The following policy flags are recognized: | 
 |  | 
 | *   `WAKE`: The key should wake the device when it is asleep.  For historical reasons, | 
 |     this flag behaves in the same manner as `WAKE_DROPPED` below. | 
 | *   `WAKE_DROPPED`: The key should wake the device when it is asleep but the key itself | 
 |     should be dropped when the wake-up occurs.  In a sense, the key's action was to | 
 |     wake the device, but the key itself is not processed. | 
 | *   `SHIFT`: The key should be interpreted as if the SHIFT key were also pressed. | 
 | *   `CAPS_LOCK`: The key should be interpreted as if the CAPS LOCK key were also pressed. | 
 | *   `ALT`: The key should be interpreted as if the ALT key were also pressed. | 
 | *   `ALT_GR`: The key should be interpreted as if the RIGHT ALT key were also pressed. | 
 | *   `FUNCTION`: The key should be interpreted as if the FUNCTION key were also pressed. | 
 | *   `VIRTUAL`: The key is a virtual soft key (capacitive button) that is adjacent to | 
 |     the main touch screen.  This causes special debouncing logic to be enabled, see below. | 
 | *   `MENU`: Deprecated.  Do not use. | 
 | *   `LAUNCHER`: Deprecated.  Do not use. | 
 |  | 
 | ### Axis Declarations ### | 
 |  | 
 | Axis declarations each consist of the keyword `axis` followed by a Linux axis code | 
 | number, and qualifiers that control the behavior of the axis including at least | 
 | one Android axis code name. | 
 |  | 
 | #### Basic Axes #### | 
 |  | 
 | A basic axis simply maps a Linux axis code to an Android axis code name. | 
 |  | 
 | The following declaration maps `ABS_X` (indicated by `0x00`) to `AXIS_X` (indicated by `X`). | 
 |  | 
 |     axis 0x00 X | 
 |  | 
 | In the above example, if the value of `ABS_X` is `5` then `AXIS_X` will be set to `5`. | 
 |  | 
 | #### Split Axes #### | 
 |  | 
 | A split axis maps a Linux axis code to two Android axis code names, such that | 
 | values less than or greater than a threshold are split across two different axes when | 
 | mapped.  This mapping is useful when a single physical axis reported by the device | 
 | encodes two different mutually exclusive logical axes. | 
 |  | 
 | The following declaration maps values of the `ABS_Y` axis (indicated by `0x01`) to | 
 | `AXIS_GAS` when less than `0x7f` or to `AXIS_BRAKE` when greater than `0x7f`. | 
 |  | 
 |     axis 0x01 split 0x7f GAS BRAKE | 
 |  | 
 | In the above example, if the value of `ABS_Y` is `0x7d` then `AXIS_GAS` is set | 
 | to `2` (`0x7f - 0x7d`) and `AXIS_BRAKE` is set to `0`.  Conversely, if the value of | 
 | `ABS_Y` is `0x83` then `AXIS_GAS` is set to `0` and `AXIS_BRAKE` is set to `4` | 
 | (`0x83 - 0x7f`).  Finally, if the value of `ABS_Y` equals the split value of `0x7f` | 
 | then both `AXIS_GAS` and `AXIS_BRAKE` are set to `0`. | 
 |  | 
 | #### Inverted Axes #### | 
 |  | 
 | An inverted axis inverts the sign of the axis value. | 
 |  | 
 | The following declaration maps `ABS_RZ` (indicated by `0x05`) to `AXIS_BRAKE` | 
 | (indicated by `BRAKE`), and inverts the output by negating it. | 
 |  | 
 |     axis 0x05 invert AXIS_RZ | 
 |  | 
 | In the above example, if the value of `ABS_RZ` is `2` then `AXIS_RZ` is set to `-2`. | 
 |  | 
 | #### Center Flat Position Option #### | 
 |  | 
 | The Linux input protocol provides a way for input device drivers to specify the | 
 | center flat position of joystick axes but not all of them do and some of them | 
 | provide incorrect values. | 
 |  | 
 | The center flat position is the neutral position of the axis, such as when | 
 | a directional pad is in the very middle of its range and the user is not | 
 | touching it. | 
 |  | 
 | To resolve this issue, an axis declaration may be followed by a `flat` | 
 | option that specifies the value of the center flat position for the axis. | 
 |  | 
 |     axis 0x03 Z flat 4096 | 
 |  | 
 | In the above example, the center flat position is set to `4096`. | 
 |  | 
 | ### Comments ### | 
 |  | 
 | Comment lines begin with '#' and continue to the end of the line.  Like this: | 
 |  | 
 |     # A comment! | 
 |  | 
 | Blank lines are ignored. | 
 |  | 
 | ### Examples ### | 
 |  | 
 | #### Keyboard #### | 
 |  | 
 |     # This is an example of a key layout file for a keyboard. | 
 |  | 
 |     key 1     ESCAPE | 
 |     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    MINUS | 
 |     key 13    EQUALS | 
 |     key 14    DEL | 
 |  | 
 |     # etc... | 
 |  | 
 | #### System Controls #### | 
 |  | 
 |     # This is an example of a key layout file for basic system controls, such as | 
 |     # volume and power keys which are typically implemented as GPIO pins that | 
 |     # the device decodes into key presses. | 
 |  | 
 |     key 114   VOLUME_DOWN       WAKE | 
 |     key 115   VOLUME_UP         WAKE | 
 |     key 116   POWER             WAKE | 
 |  | 
 | #### Capacitive Buttons #### | 
 |  | 
 |     # This is an example of a key layout file for a touch device with capacitive buttons. | 
 |  | 
 |     key 139    MENU           VIRTUAL | 
 |     key 102    HOME           VIRTUAL | 
 |     key 158    BACK           VIRTUAL | 
 |     key 217    SEARCH         VIRTUAL | 
 |  | 
 | #### Headset Jack Media Controls #### | 
 |  | 
 |     # This is an example of a key layout file for headset mounted media controls. | 
 |     # A typical headset jack interface might have special control wires or detect known | 
 |     # resistive loads as corresponding to media functions or volume controls. | 
 |     # This file assumes that the driver decodes these signals and reports media | 
 |     # controls as key presses. | 
 |  | 
 |     key 163   MEDIA_NEXT        WAKE | 
 |     key 165   MEDIA_PREVIOUS    WAKE | 
 |     key 226   HEADSETHOOK       WAKE | 
 |  | 
 | #### Joystick #### | 
 |  | 
 |     # This is an example of a key layout file for a joystick. | 
 |  | 
 |     # These are the buttons that the joystick supports, represented as keys. | 
 |     key 304   BUTTON_A | 
 |     key 305   BUTTON_B | 
 |     key 307   BUTTON_X | 
 |     key 308   BUTTON_Y | 
 |     key 310   BUTTON_L1 | 
 |     key 311   BUTTON_R1 | 
 |     key 314   BUTTON_SELECT | 
 |     key 315   BUTTON_START | 
 |     key 316   BUTTON_MODE | 
 |     key 317   BUTTON_THUMBL | 
 |     key 318   BUTTON_THUMBR | 
 |  | 
 |     # Left and right stick. | 
 |     # The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. | 
 |     # This confuses applications that rely on the flat value because the joystick actually | 
 |     # settles in a flat range of +/- 4096 or so.  We override it here. | 
 |     axis 0x00 X flat 4096 | 
 |     axis 0x01 Y flat 4096 | 
 |     axis 0x03 Z flat 4096 | 
 |     axis 0x04 RZ flat 4096 | 
 |  | 
 |     # Triggers. | 
 |     axis 0x02 LTRIGGER | 
 |     axis 0x05 RTRIGGER | 
 |  | 
 |     # Hat. | 
 |     axis 0x10 HAT_X | 
 |     axis 0x11 HAT_Y | 
 |  | 
 | ## Wake Keys ## | 
 |  | 
 | Wake keys are special keys that wake the device from sleep, such as the power key. | 
 |  | 
 | By default, for internal keyboard devices, no key is a wake key.  For external | 
 | keyboard device, all keys are wake keys. | 
 |  | 
 | To make a key be a wake key, set the `WAKE_DROPPED` flag in the key layout file | 
 | for the keyboard device. | 
 |  | 
 | Note that the `WindowManagerPolicy` component is responsible for implementing wake | 
 | key behavior.  Moreover, the key guard may prevent certain keys from functioning | 
 | as wake keys.  A good place to start understanding wake key behavior is | 
 | `PhoneWindowManager.interceptKeyBeforeQueueing`. | 
 |  | 
 | ## Virtual Soft Keys ## | 
 |  | 
 | The input system provides special features for implementing virtual soft keys. | 
 |  | 
 | There are three cases: | 
 |  | 
 | 1.  If the virtual soft keys are displayed graphically on the screen, as on the | 
 |     Galaxy Nexus, then they are implemented by the Navigation Bar component in | 
 |     the System UI package. | 
 |  | 
 |     Because graphical virtual soft keys are implemented at a high layer in the | 
 |     system, key layout files are not involved and the following information does | 
 |     not apply. | 
 |  | 
 | 2.  If the virtual soft keys are implemented as an extended touchable region | 
 |     that is part of the main touch screen, as on the Nexus One, then the | 
 |     input system uses a virtual key map file to translate X / Y touch coordinates | 
 |     into Linux key codes, then uses the key layout file to translate | 
 |     Linux key codes into Android key codes. | 
 |  | 
 |     Refer to the section on [Touch Devices](/tech/input/touch-devices.html) | 
 |     for more details about virtual key map files. | 
 |  | 
 |     The key layout file for the touch screen input device must specify the | 
 |     appropriate key mapping and include the `VIRTUAL` flag for each key. | 
 |  | 
 | 3.  If the virtual soft keys are implemented as capacitive buttons that are | 
 |     separate from the main touch screen, as on the Nexus S, then the kernel | 
 |     device driver or firmware is responsible for translating touches into | 
 |     Linux key codes which the input system then translates into Android | 
 |     key codes using the key layout file. | 
 |  | 
 |     The key layout file for the capacitive button input device must specify the | 
 |     appropriate key mapping and include the `VIRTUAL` flag for each key. | 
 |  | 
 | When virtual soft key are located within or in close physical proximity of the | 
 | touch screen, it is easy for the user to accidentally press one of the buttons | 
 | when touching near the bottom of the screen or when sliding a finger from top | 
 | to bottom or from bottom to top on the screen. | 
 |  | 
 | To prevent this from happening, the input system applies a little debouncing | 
 | such that virtual soft key presses are ignored for a brief period of time | 
 | after the most recent touch on the touch screen.  The delay is called the | 
 | virtual key quiet time. | 
 |  | 
 | To enable virtual soft key debouncing, we must do two things. | 
 |  | 
 | First, we provide a key layout file for the touch screen or capacitive button | 
 | input device with the `VIRTUAL` flag set for each key. | 
 |  | 
 |     key 139    MENU           VIRTUAL | 
 |     key 102    HOME           VIRTUAL | 
 |     key 158    BACK           VIRTUAL | 
 |     key 217    SEARCH         VIRTUAL | 
 |  | 
 | Then, we set the value of the virtual key quiet time in a resource overlay | 
 | for the framework `config.xml` resource. | 
 |  | 
 |     <!-- Specifies the amount of time to disable virtual keys after the screen is touched | 
 |          in order to filter out accidental virtual key presses due to swiping gestures | 
 |          or taps near the edge of the display.  May be 0 to disable the feature. | 
 |          It is recommended that this value be no more than 250 ms. | 
 |          This feature should be disabled for most devices. --> | 
 |     <integer name="config_virtualKeyQuietTimeMillis">250</integer> | 
 |  | 
 | ## Validation ## | 
 |  | 
 | Make sure to validate your key layout files using the | 
 | [Validate Keymaps](/tech/input/validate-keymaps.html) tool. |