Home | History | Annotate | Download | only in input
      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 
     19 Key layout files (`.kl` files) are responsible for mapping Linux key codes
     20 and axis codes to Android key codes and axis codes and specifying associated
     21 policy flags.
     22 
     23 Device-specific key layout files are *required* for all internal (built-in)
     24 input devices that have keys, including special keys such as volume, power
     25 and headset media keys.
     26 
     27 Device-specific key layout files are *optional* for other input devices but
     28 they are *recommended* for special-purpose keyboards and joysticks.
     29 
     30 If no device-specific key layout file is available, then the system will
     31 choose a default instead.
     32 
     33 ## Location ##
     34 
     35 Key layout files are located by USB vendor, product (and optionally version)
     36 id or by input device name.
     37 
     38 The 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 
     49 When constructing a file path that contains the device name, all characters
     50 in the device name other than '0'-'9', 'a'-'z', 'A'-'Z', '-' or '_' are replaced by '_'.
     51 
     52 ## Generic Key Layout File ##
     53 
     54 The system provides a special built-in generic key layout file called `Generic.kl`.
     55 This key layout is intended to support a variety of standard external
     56 keyboards and joysticks.
     57 
     58 *Do not modify the generic key layout!*
     59 
     60 ## Syntax ##
     61 
     62 A key layout file is a plain text file consisting of key or axis declarations
     63 and flags.
     64 
     65 ### Key Declarations ###
     66 
     67 Key declarations each consist of the keyword `key` followed by a Linux key code
     68 number, 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 
     74 The 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 
     93 Axis declarations each consist of the keyword `axis` followed by a Linux axis code
     94 number, and qualifiers that control the behavior of the axis including at least
     95 one Android axis code name.
     96 
     97 #### Basic Axes ####
     98 
     99 A basic axis simply maps a Linux axis code to an Android axis code name.
    100 
    101 The following declaration maps `ABS_X` (indicated by `0x00`) to `AXIS_X` (indicated by `X`).
    102 
    103     axis 0x00 X
    104 
    105 In the above example, if the value of `ABS_X` is `5` then `AXIS_X` will be set to `5`.
    106 
    107 #### Split Axes ####
    108 
    109 A split axis maps a Linux axis code to two Android axis code names, such that
    110 values less than or greater than a threshold are split across two different axes when
    111 mapped.  This mapping is useful when a single physical axis reported by the device
    112 encodes two different mutually exclusive logical axes.
    113 
    114 The 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 
    119 In the above example, if the value of `ABS_Y` is `0x7d` then `AXIS_GAS` is set
    120 to `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`
    123 then both `AXIS_GAS` and `AXIS_BRAKE` are set to `0`.
    124 
    125 #### Inverted Axes ####
    126 
    127 An inverted axis inverts the sign of the axis value.
    128 
    129 The 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 
    134 In 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 
    138 The Linux input protocol provides a way for input device drivers to specify the
    139 center flat position of joystick axes but not all of them do and some of them
    140 provide incorrect values.
    141 
    142 The center flat position is the neutral position of the axis, such as when
    143 a directional pad is in the very middle of its range and the user is not
    144 touching it.
    145 
    146 To resolve this issue, an axis declaration may be followed by a `flat`
    147 option that specifies the value of the center flat position for the axis.
    148 
    149     axis 0x03 Z flat 4096
    150 
    151 In the above example, the center flat position is set to `4096`.
    152 
    153 ### Comments ###
    154 
    155 Comment lines begin with '#' and continue to the end of the line.  Like this:
    156 
    157     # A comment!
    158 
    159 Blank 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 
    251 Wake keys are special keys that wake the device from sleep, such as the power key.
    252 
    253 By default, for internal keyboard devices, no key is a wake key.  For external
    254 keyboard device, all keys are wake keys.
    255 
    256 To make a key be a wake key, set the `WAKE_DROPPED` flag in the key layout file
    257 for the keyboard device.
    258 
    259 Note that the `WindowManagerPolicy` component is responsible for implementing wake
    260 key behavior.  Moreover, the key guard may prevent certain keys from functioning
    261 as wake keys.  A good place to start understanding wake key behavior is
    262 `PhoneWindowManager.interceptKeyBeforeQueueing`.
    263 
    264 ## Virtual Soft Keys ##
    265 
    266 The input system provides special features for implementing virtual soft keys.
    267 
    268 There are three cases:
    269 
    270 1.  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 
    278 2.  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 
    290 3.  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 
    299 When virtual soft key are located within or in close physical proximity of the
    300 touch screen, it is easy for the user to accidentally press one of the buttons
    301 when touching near the bottom of the screen or when sliding a finger from top
    302 to bottom or from bottom to top on the screen.
    303 
    304 To prevent this from happening, the input system applies a little debouncing
    305 such that virtual soft key presses are ignored for a brief period of time
    306 after the most recent touch on the touch screen.  The delay is called the
    307 virtual key quiet time.
    308 
    309 To enable virtual soft key debouncing, we must do two things.
    310 
    311 First, we provide a key layout file for the touch screen or capacitive button
    312 input 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 
    319 Then, we set the value of the virtual key quiet time in a resource overlay
    320 for 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 
    331 Make sure to validate your key layout files using the
    332 [Validate Keymaps](/tech/input/validate-keymaps.html) tool.
    333