| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 1 | page.title=Overview | 
 | 2 | @jd:body | 
 | 3 |  | 
 | 4 | <!-- | 
| Clay Murphy | 768b82a | 2013-11-12 11:32:41 -0800 | [diff] [blame] | 5 |     Copyright 2013 The Android Open Source Project | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 6 |  | 
 | 7 |     Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 8 |     you may not use this file except in compliance with the License. | 
 | 9 |     You may obtain a copy of the License at | 
 | 10 |  | 
 | 11 |         http://www.apache.org/licenses/LICENSE-2.0 | 
 | 12 |  | 
 | 13 |     Unless required by applicable law or agreed to in writing, software | 
 | 14 |     distributed under the License is distributed on an "AS IS" BASIS, | 
 | 15 |     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 16 |     See the License for the specific language governing permissions and | 
 | 17 |     limitations under the License. | 
 | 18 | --> | 
 | 19 | <p>The Android input subsystem nominally consists of an event pipeline | 
 | 20 | that traverses multiple layers of the system.</p> | 
 | 21 | <h2 id="input-pipeline">Input Pipeline</h2> | 
 | 22 | <p>At the lowest layer, the physical input device produces signals that | 
 | 23 | describe state changes such as key presses and touch contact points. | 
 | 24 | The device firmware encodes and transmits these signals in some way | 
 | 25 | such as by sending USB HID reports to the system or by producing | 
 | 26 | interrupts on an I2C bus.</p> | 
 | 27 | <p>The signals are then decoded by a device driver in the Linux kernel. | 
 | 28 | The Linux kernel provides drivers for many standard peripherals, | 
 | 29 | particularly those that adhere to the HID protocol.  However, an OEM | 
 | 30 | must often provide custom drivers for embedded devices that are | 
 | 31 | tightly integrated into the system at a low-level, such as touch screens.</p> | 
 | 32 | <p>The input device drivers are responsible for translating device-specific | 
 | 33 | signals into a standard input event format, by way of the Linux | 
 | 34 | input protocol.  The Linux input protocol defines a standard set of | 
 | 35 | event types and codes in the <code>linux/input.h</code> kernel header file. | 
 | 36 | In this way, components outside the kernel do not need to care about | 
 | 37 | the details such as physical scan codes, HID usages, I2C messages, | 
 | 38 | GPIO pins, and the like.</p> | 
 | 39 | <p>Next, the Android <code>EventHub</code> component reads input events from the kernel | 
 | 40 | by opening the <code>evdev</code> driver associated with each input device. | 
 | 41 | The Android InputReader component then decodes the input events | 
 | 42 | according to the device class and produces a stream of Android input | 
 | 43 | events.  As part of this process, the Linux input protocol event codes | 
 | 44 | are translated into Android event codes according to the | 
 | 45 | input device configuration, keyboard layout files, and various | 
 | 46 | mapping tables.</p> | 
 | 47 | <p>Finally, the <code>InputReader</code> sends input events to the InputDispatcher | 
 | 48 | which forwards them to the appropriate window.</p> | 
 | 49 | <h2 id="control-points">Control Points</h2> | 
 | 50 | <p>There are several stages in the input pipeline which effect control | 
 | 51 | over the behavior of the input device.</p> | 
 | 52 | <h3 id="driver-and-firmware-configuration">Driver and Firmware Configuration</h3> | 
 | 53 | <p>Input device drivers frequently configure the behavior of the input | 
 | 54 | device by setting parameters in registers or even uploading the | 
 | 55 | firmware itself.  This is particularly the case for embedded | 
 | 56 | devices such as touch screens where a large part of the calibration | 
 | 57 | process involves tuning these parameters or fixing the firmware | 
 | 58 | to provide the desired accuracy and responsiveness and to suppress | 
 | 59 | noise.</p> | 
 | 60 | <p>Driver configuration options are often specified as module parameters | 
 | 61 | in the kernel board support package (BSP) so that the same driver | 
 | 62 | can support multiple different hardware implementations.</p> | 
 | 63 | <p>This documentation does attempt to describe driver or firmware | 
 | 64 | configuration, but it does offer guidance as to device calibration | 
 | 65 | in general.</p> | 
 | 66 | <h3 id="board-configuration-properties">Board Configuration Properties</h3> | 
 | 67 | <p>The kernel board support package (BSP) may export board configuration | 
 | 68 | properties via SysFS that are used by the Android InputReader component, | 
 | 69 | such as the placement of virtual keys on a touch screen.</p> | 
 | 70 | <p>Refer to the device class sections for details about how different | 
 | 71 | devices use board configuration properties.</p> | 
 | 72 | <h3 id="resource-overlays">Resource Overlays</h3> | 
 | 73 | <p>A few input behaviors are configured by way of resource overlays | 
 | 74 | in <code>config.xml</code> such as the operation of lid switch.</p> | 
 | 75 | <p>Here are a few examples:</p> | 
 | 76 | <ul> | 
 | 77 | <li> | 
 | 78 | <p><code>config_lidKeyboardAccessibility</code>: Specifies the effect of the | 
 | 79 |     lid switch on whether the hardware keyboard is accessible or hidden.</p> | 
 | 80 | </li> | 
 | 81 | <li> | 
 | 82 | <p><code>config_lidNavigationAccessibility</code>: Specifies the effect of the | 
 | 83 |     lid switch on whether the trackpad is accessible or hidden.</p> | 
 | 84 | </li> | 
 | 85 | <li> | 
 | 86 | <p><code>config_longPressOnPowerBehavior</code>: Specifies what should happen when | 
 | 87 |     the user holds down the power button.</p> | 
 | 88 | </li> | 
 | 89 | <li> | 
 | 90 | <p><code>config_lidOpenRotation</code>: Specifies the effect of the lid switch | 
 | 91 |     on screen orientation.</p> | 
 | 92 | </li> | 
 | 93 | </ul> | 
 | 94 | <p>Refer to the documentation within <code>frameworks/base/core/res/res/values/config.xml</code> | 
 | 95 | for details about each configuration option.</p> | 
 | 96 | <h3 id="key-maps">Key Maps</h3> | 
 | 97 | <p>Key maps are used by the Android <code>EventHub</code> and <code>InputReader</code> components | 
 | 98 | to configure the mapping from Linux event codes to Android event codes | 
 | 99 | for keys, joystick buttons and joystick axes.  The mapping may | 
 | 100 | be device or language dependent.</p> | 
 | 101 | <p>Refer to the device class sections for details about how different | 
 | 102 | devices use key maps.</p> | 
 | 103 | <h3 id="input-device-configuration-files">Input Device Configuration Files</h3> | 
 | 104 | <p>Input device configuration files are used by the Android <code>EventHub</code> and | 
 | 105 | <code>InputReader</code> components to configure special device characteristics | 
 | 106 | such as how touch size information is reported.</p> | 
 | 107 | <p>Refer to the device class sections for details about how different | 
 | 108 | devices use input device configuration maps.</p> | 
 | 109 | <h2 id="understanding-hid-usages-and-event-codes">Understanding HID Usages and Event Codes</h2> | 
 | 110 | <p>There are often several different identifiers used to refer to any | 
 | 111 | given key on a keyboard, button on a game controller, joystick axis | 
 | 112 | or other control.  The relationships between these identifiers | 
 | 113 | are not always the same: they are dependent on a set of mapping tables, | 
 | 114 | some of which are fixed, and some which vary based on characteristics | 
 | 115 | of the device, the device driver, the current locale, the system | 
 | 116 | configuration, user preferences and other factors.</p> | 
 | 117 | <dl> | 
 | 118 | <dt>Physical Scan Code</dt> | 
 | 119 | <dd> | 
 | 120 | <p>A physical scan code is a device-specific identifier that is associated | 
 | 121 | with each key, button or other control.  Because physical scan codes | 
 | 122 | often vary from one device to another, the firmware or device driver | 
 | 123 | is responsible for mapping them to standard identifiers such as | 
 | 124 | HID Usages or Linux key codes.</p> | 
 | 125 | <p>Scan codes are mainly of interest for keyboards.  Other devices | 
 | 126 | typically communicate at a low-level using GPIO pins, I2C messages | 
 | 127 | or other means.  Consequently, the upper layers of the software | 
 | 128 | stack rely on the device drivers to make sense of what is going on.</p> | 
 | 129 | </dd> | 
 | 130 | <dt>HID Usage</dt> | 
 | 131 | <dd> | 
 | 132 | <p>A HID usage is a standard identifier that is used to report the | 
 | 133 | state of a control such as a keyboard key, joystick axis, | 
 | 134 | mouse button, or touch contact point.  Most USB and Bluetooth | 
 | 135 | input devices conform to the HID specification, which enables | 
 | 136 | the system to interface with them in a uniform manner.</p> | 
 | 137 | <p>The Android Framework relies on the Linux kernel HID drivers to | 
 | 138 | translate HID usage codes into Linux key codes and other identifiers. | 
 | 139 | Therefore HID usages are mainly of interest to peripheral manufacturers.</p> | 
 | 140 | </dd> | 
 | 141 | <dt>Linux Key Code</dt> | 
 | 142 | <dd> | 
 | 143 | <p>A Linux key code is a standard identifier for a key or button. | 
 | 144 | Linux key codes are defined in the <code>linux/input.h</code> header file using | 
 | 145 | constants that begin with the prefix <code>KEY_</code> or <code>BTN_</code>.  The Linux | 
 | 146 | kernel input drivers are responsible for translating physical | 
 | 147 | scan codes, HID usages and other device-specific signals into Linux | 
 | 148 | key codes and delivering information about them as part of | 
 | 149 | <code>EV_KEY</code> events.</p> | 
 | 150 | <p>The Android API sometimes refers to the Linux key code associated | 
 | 151 | with a key as its "scan code".  This is technically incorrect in | 
 | 152 | but it helps to distinguish Linux key codes from Android key codes | 
 | 153 | in the API.</p> | 
 | 154 | </dd> | 
 | 155 | <dt>Linux Relative or Absolute Axis Code</dt> | 
 | 156 | <dd> | 
 | 157 | <p>A Linux relative or absolute axis code is a standard identifier | 
 | 158 | for reporting relative movements or absolute positions along an | 
 | 159 | axis, such as the relative movements of a mouse along its X axis | 
 | 160 | or the absolute position of a joystick along its X axis. | 
 | 161 | Linux axis code are defined in the <code>linux/input.h</code> header file using | 
 | 162 | constants that begin with the prefix <code>REL_</code> or <code>ABS_</code>.  The Linux | 
 | 163 | kernel input drivers are responsible for translating HID usages | 
 | 164 | and other device-specific signals into Linux axis codes and | 
 | 165 | delivering information about them as part of <code>EV_REL</code> and | 
 | 166 | <code>EV_ABS</code> events.</p> | 
 | 167 | </dd> | 
 | 168 | <dt>Linux Switch Code</dt> | 
 | 169 | <dd> | 
 | 170 | <p>A Linux switch code is a standard identifier for reporting the | 
 | 171 | state of a switch on a device, such as a lid switch.  Linux | 
 | 172 | switch codes are defined in the <code>linux/input.h</code> header file | 
 | 173 | using constants that begin with the prefix <code>SW_</code>.  The Linux | 
 | 174 | kernel input drivers report switch state changes as <code>EV_SW</code> events.</p> | 
 | 175 | <p>Android applications generally do not receive events from switches, | 
 | 176 | but the system may use them interally to control various | 
 | 177 | device-specific functions.</p> | 
 | 178 | </dd> | 
 | 179 | <dt>Android Key Code</dt> | 
 | 180 | <dd> | 
 | 181 | <p>An Android key code is a standard identifier defined in the Android | 
 | 182 | API for indicating a particular key such as 'HOME'.  Android key codes | 
 | 183 | are defined by the <code>android.view.KeyEvent</code> class as constants that | 
 | 184 | begin with the prefix <code>KEYCODE_</code>.</p> | 
 | 185 | <p>The key layout specifies how Linux key codes are mapped to Android | 
 | 186 | key codes.  Different key layouts may be used depending on the keyboard | 
 | 187 | model, language, country, layout, or special functions.</p> | 
 | 188 | <p>Combinations of Android key codes are transformed into character codes | 
 | 189 | using a device and locale specific key character map.  For example, | 
 | 190 | when the keys identified as <code>KEYCODE_SHIFT</code> and <code>KEYCODE_A</code> are both | 
 | 191 | pressed together, the system looks up the combination in the key | 
 | 192 | character map and finds the capital letter 'A', which is then inserted | 
 | 193 | into the currently focused text widget.</p> | 
 | 194 | </dd> | 
 | 195 | <dt>Android Axis Code</dt> | 
 | 196 | <dd> | 
 | 197 | <p>An Android axis code is a standard identifier defined in the Android | 
 | 198 | API for indicating a particular device axis.  Android axis codes are | 
 | 199 | defined by the <code>android.view.MotionEvent</code> class as constants that | 
 | 200 | begin with the prefix <code>AXIS_</code>.</p> | 
 | 201 | <p>The key layout specifies how Linux Axis Codes are mapped to Android | 
 | 202 | axis codes.  Different key layouts may be used depending on the device | 
 | 203 | model, language, country, layout, or special functions.</p> | 
 | 204 | </dd> | 
 | 205 | <dt>Android Meta State</dt> | 
 | 206 | <dd> | 
 | 207 | <p>An Android meta state is a standard identifier defined in the Android | 
 | 208 | API for indicating which modifier keys are pressed.  Android meta states | 
 | 209 | are defined by the <code>android.view.KeyEvent</code> class as constants that | 
 | 210 | begin with the prefix <code>META_</code>.</p> | 
 | 211 | <p>The current meta state is determined by the Android InputReader | 
 | 212 | component which monitors when modifier keys such as <code>KEYCODE_SHIFT_LEFT</code> | 
 | 213 | are pressed / released and sets / resets the appropriate meta state flag.</p> | 
 | 214 | <p>The relationship between modifier keys and meta states is hardcoded | 
 | 215 | but the key layout can alter how the modifier keys themselves are | 
 | 216 | mapped which in turns affects the meta states.</p> | 
 | 217 | </dd> | 
 | 218 | <dt>Android Button State</dt> | 
 | 219 | <dd> | 
 | 220 | <p>An Android button state is a standard identifier defined in the Android | 
 | 221 | API for indicating which buttons (on a mouse or stylus) are pressed. | 
 | 222 | Android button states are defined by the <code>android.view.MotionEvent</code> | 
 | 223 | class as constants that begin with the prefix <code>BUTTON_</code>.</p> | 
 | 224 | <p>The current button state is determined by the Android InputReader | 
 | 225 | component which monitors when buttons (on a mouse or stylus) are | 
 | 226 | pressed / released and sets / resets appropriate button state flag.</p> | 
 | 227 | <p>The relationship between buttons and button states is hardcoded.</p> | 
 | 228 | </dd> | 
 | 229 | </dl> | 
 | 230 | <h2 id="further-reading">Further Reading</h2> | 
 | 231 | <ol> | 
 | 232 | <li><a href="http://www.kernel.org/doc/Documentation/input/event-codes.txt">Linux input event codes</a></li> | 
 | 233 | <li><a href="http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt">Linux multi-touch protocol</a></li> | 
 | 234 | <li><a href="http://www.kernel.org/doc/Documentation/input/input.txt">Linux input drivers</a></li> | 
 | 235 | <li><a href="http://www.kernel.org/doc/Documentation/input/ff.txt">Linux force feedback</a></li> | 
 | 236 | <li><a href="http://www.usb.org/developers/hidpage">HID information, including HID usage tables</a></li> | 
 | 237 | </ol> |