| Jeff Brown | 590a9d6 | 2011-06-30 12:55:34 -0700 | [diff] [blame] | 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. |