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