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# Touch Devices # 18 19Android supports a variety of touch screens and touch pads, including 20stylus-based digitizer tablets. 21 22Touch screens are touch devices that are associated with a display such that 23the user has the impression of directly manipulating items on screen. 24 25Touch pads are touch devices that are not associated with a display such as a 26digitizer tablet. Touch pads are typically used for pointing or for 27absolute indirect positioning or gesture-based control of a user interface. 28 29Touch devices may have buttons whose functions are similar to mouse buttons. 30 31Touch devices can sometimes be manipulated using a variety of different tools 32such as fingers or a stylus depending on the underlying touch sensor technology. 33 34Touch devices are sometimes used to implement virtual keys. For example, on 35some Android devices, the touch screen sensor area extends beyond the edge of 36the display and serves dual purpose as part of a touch sensitive key pad. 37 38Due to the great variety of touch devices, Android relies on a large number of 39configuration properties to describe the characteristics and desired behavior 40of each device. 41 42## Touch Device Classification ## 43 44An input device is classified as a *multi-touch* device if both of 45the following conditions hold: 46 47* The input device reports the presence of the `ABS_MT_POSITION_X` and 48 `ABS_MT_POSITION_Y` absolute axes. 49 50* The input device does not have any gamepad buttons. This condition 51 resolves an ambiguity with certain gamepads that report axes with codes 52 that overlaps those of the MT axes. 53 54An input device is classified as a *single-touch* device if both of the 55following conditions hold: 56 57* The input device is not classified as a multi-touch device. An input device 58 is either classified as a single-touch device or as a multi-touch device, 59 never both. 60 61* The input device reports the presence of the `ABS_X` and `ABS_Y` absolute 62 axes, and the presence of the `BTN_TOUCH` key code. 63 64Once an input device has been classified as a touch device, the presence 65of virtual keys is determined by attempting to load the virtual key map file 66for the device. If a virtual key map is available, then the key layout 67file for the device is also loaded. 68 69Refer to the section below about the location and format of virtual key map 70files. 71 72Next, the system loads the input device configuration file for the touch device. 73 74**All built-in touch devices should have input device configuration files.** 75If no input device configuration file is present, the system will 76choose a default configuration that is appropriate for typical general-purpose 77touch peripherals such as external USB or Bluetooth HID touch screens 78or touch pads. These defaults are not designed for built-in touch screens and 79will most likely result in incorrect behavior. 80 81After the input device configuration loaded, the system will classify the 82input device as a *touch screen*, *touch pad* or *pointer* device. 83 84* A *touch screen* device is used for direct manipulation of objects on the 85 screen. Since the user is directly touching the screen, the system does 86 not require any additional affordances to indicate the objects being 87 manipulated. 88 89* A *touch pad* device is used to provide absolute positioning information 90 to an application about touches on a given sensor area. It may be useful 91 for digitizer tablets. 92 93* A *pointer* device is used for indirect manipulation of objects on the 94 screen using a cursor. Fingers are interpreted as multi-touch pointer 95 gestures. Other tools, such as styluses, are interpreted using 96 absolute positions. 97 98 See [Indirect Multi-touch Pointer Gestures](#indirect-multi-touch-pointer-gestures) 99 for more information. 100 101The following rules are used to classify the input device as a *touch screen*, 102*touch pad* or *pointer* device. 103 104* If the `touch.deviceType` property is set, then the device type will be 105 set as indicated. 106 107* If the input device reports the presence of the `INPUT_PROP_DIRECT` 108 input property (via the `EVIOCGPROP` ioctl), then the device type will 109 be set to *touch screen*. This condition assumes that direct input touch 110 devices are attached to a display that is also connected. 111 112* If the input device reports the presence of the `INPUT_PROP_POINTER` 113 input property (via the `EVIOCGPROP` ioctl), then the device type will 114 be set to *pointer*. 115 116* If the input device reports the presence of the `REL_X` or `REL_Y` relative 117 axes, then the device type will be set to *touch pad*. This condition 118 resolves an ambiguity for input devices that consist of both a mouse and 119 a touch pad. In this case, the touch pad will not be used to control 120 the pointer because the mouse already controls it. 121 122* Otherwise, the device type will be set to *pointer*. This default ensures 123 that touch pads that have not been designated any other special purpose 124 will serve to control the pointer. 125 126## Buttons ## 127 128Buttons are *optional* controls that may be used by applications to perform 129additional functions. Buttons on touch devices behave similarly to mouse 130buttons and are mainly of use with *pointer* type touch devices or with a 131stylus. 132 133The following buttons are supported: 134 135* `BTN_LEFT`: mapped to `MotionEvent.BUTTON_PRIMARY`. 136 137* `BTN_RIGHT`: mapped to `MotionEvent.BUTTON_SECONDARY`. 138 139* `BTN_MIDDLE`: mapped to `MotionEvent.BUTTON_MIDDLE`. 140 141* `BTN_BACK` and `BTN_SIDE`: mapped to `MotionEvent.BUTTON_BACK`. 142 Pressing this button also synthesizes a key press with the key code 143 `KeyEvent.KEYCODE_BACK`. 144 145* `BTN_FORWARD` and `BTN_EXTRA`: mapped to `MotionEvent.BUTTON_FORWARD`. 146 Pressing this button also synthesizes a key press with the key code 147 `KeyEvent.KEYCODE_FORWARD`. 148 149* `BTN_STYLUS`: mapped to `MotionEvent.BUTTON_SECONDARY`. 150 151* `BTN_STYLUS2`: mapped to `MotionEvent.BUTTON_TERTIARY`. 152 153## Tools and Tool Types ## 154 155A *tool* is a finger, stylus or other apparatus that is used to interact with 156the touch device. Some touch devices can distinguish between different 157types of tools. 158 159Elsewhere in Android, as in the `MotionEvent` API, a *tool* is often referred 160to as a *pointer*. 161 162The following tool types are supported: 163 164* `BTN_TOOL_FINGER` and `MT_TOOL_FINGER`: mapped to `MotionEvent.TOOL_TYPE_FINGER`. 165 166* `BTN_TOOL_PEN` and `MT_TOOL_PEN`: mapped to `MotionEvent.TOOL_TYPE_STYLUS`. 167 168* `BTN_TOOL_RUBBER`: mapped to `MotionEvent.TOOL_TYPE_ERASER`. 169 170* `BTN_TOOL_BRUSH`: mapped to `MotionEvent.TOOL_TYPE_STYLUS`. 171 172* `BTN_TOOL_PENCIL`: mapped to `MotionEvent.TOOL_TYPE_STYLUS`. 173 174* `BTN_TOOL_AIRBRUSH`: mapped to `MotionEvent.TOOL_TYPE_STYLUS`. 175 176* `BTN_TOOL_MOUSE`: mapped to `MotionEvent.TOOL_TYPE_MOUSE`. 177 178* `BTN_TOOL_LENS`: mapped to `MotionEvent.TOOL_TYPE_MOUSE`. 179 180* `BTN_TOOL_DOUBLETAP`, `BTN_TOOL_TRIPLETAP`, and `BTN_TOOL_QUADTAP`: 181 mapped to `MotionEvent.TOOL_TYPE_FINGER`. 182 183## Hovering vs. Touching Tools ## 184 185Tools can either be in contact with the touch device or in range and hovering 186above it. Not all touch devices are able to sense the presence of a tool 187hovering above the touch device. Those that do, such as RF-based stylus digitizers, 188can often detect when the tool is within a limited range of the digitizer. 189 190The `InputReader` component takes care to distinguish touching tools from hovering 191tools. Likewise, touching tools and hovering tools are reported to applications 192in different ways. 193 194Touching tools are reported to applications as touch events 195using `MotionEvent.ACTION_DOWN`, `MotionEvent.ACTION_MOVE`, `MotionEvent.ACTION_DOWN`, 196`MotionEvent.ACTION_POINTER_DOWN` and `MotionEvent.ACTION_POINTER_UP`. 197 198Hovering tools are reported to applications as generic motion events using 199`MotionEvent.ACTION_HOVER_ENTER`, `MotionEvent.ACTION_HOVER_MOVE` 200and `MotionEvent.ACTION_HOVER_EXIT`. 201 202## Touch Device Driver Requirements ## 203 2041. Touch device drivers should only register axes and key codes for the axes 205 and buttons that they actually support. Registering excess axes or key codes 206 may confuse the device classification algorithm or cause the system to incorrectly 207 detect the capabilities of the device. 208 209 For example, if the device reports the `BTN_TOUCH` key code, the system will 210 assume that `BTN_TOUCH` will always be used to indicate whether the tool is 211 actually touching the screen or is merely in range and hovering. 212 2132. Single-touch devices use the following Linux input events: 214 215 * `ABS_X`: *(REQUIRED)* Reports the X coordinate of the tool. 216 217 * `ABS_Y`: *(REQUIRED)* Reports the Y coordinate of the tool. 218 219 * `ABS_PRESSURE`: *(optional)* Reports the physical pressure applied to the tip 220 of the tool or the signal strength of the touch contact. 221 222 * `ABS_TOOL_WIDTH`: *(optional)* Reports the cross-sectional area or width of the 223 touch contact or of the tool itself. 224 225 * `ABS_DISTANCE`: *(optional)* Reports the distance of the tool from the surface of 226 the touch device. 227 228 * `ABS_TILT_X`: *(optional)* Reports the tilt of the tool from the surface of the 229 touch device along the X axis. 230 231 * `ABS_TILT_Y`: *(optional)* Reports the tilt of the tool from the surface of the 232 touch device along the Y axis. 233 234 * `BTN_TOUCH`: *(REQUIRED)* Indicates whether the tool is touching the device. 235 236 * `BTN_LEFT`, `BTN_RIGHT`, `BTN_MIDDLE`, `BTN_BACK`, `BTN_SIDE`, `BTN_FORWARD`, 237 `BTN_EXTRA`, `BTN_STYLUS`, `BTN_STYLUS2`: 238 *(optional)* Reports [button](#buttons) states. 239 240 * `BTN_TOOL_FINGER`, `BTN_TOOL_PEN`, `BTN_TOOL_RUBBER`, `BTN_TOOL_BRUSH`, 241 `BTN_TOOL_PENCIL`, `BTN_TOOL_AIRBRUSH`, `BTN_TOOL_MOUSE`, `BTN_TOOL_LENS`, 242 `BTN_TOOL_DOUBLETAP`, `BTN_TOOL_TRIPLETAP`, `BTN_TOOL_QUADTAP`: 243 *(optional)* Reports the [tool type](#tools-and-tool-types). 244 2453. Multi-touch devices use the following Linux input events: 246 247 * `ABS_MT_POSITION_X`: *(REQUIRED)* Reports the X coordinate of the tool. 248 249 * `ABS_MT_POSITION_Y`: *(REQUIRED)* Reports the Y coordinate of the tool. 250 251 * `ABS_MT_PRESSURE`: *(optional)* Reports the physical pressure applied to the 252 tip of the tool or the signal strength of the touch contact. 253 254 * `ABS_MT_TOUCH_MAJOR`: *(optional)* Reports the cross-sectional area of the 255 touch contact, or the length of the longer dimension of the touch contact. 256 257 * `ABS_MT_TOUCH_MINOR`: *(optional)* Reports the length of the shorter dimension of the 258 touch contact. This axis should not be used if `ABS_MT_TOUCH_MAJOR` is reporting an 259 area measurement. 260 261 * `ABS_MT_WIDTH_MAJOR`: *(optional)* Reports the cross-sectional area of the tool itself, 262 or the length of the longer dimension of the tool itself. 263 This axis should not be used if the dimensions of the tool itself are unknown. 264 265 * `ABS_MT_WIDTH_MINOR`: *(optional)* Reports the length of the shorter dimension of 266 the tool itself. This axis should not be used if `ABS_MT_WIDTH_MAJOR` is reporting 267 an area measurement or if the dimensions of the tool itself are unknown. 268 269 * `ABS_MT_ORIENTATION`: *(optional)* Reports the orientation of the tool. 270 271 * `ABS_MT_DISTANCE`: *(optional)* Reports the distance of the tool from the 272 surface of the touch device. 273 274 * `ABS_MT_TOOL_TYPE`: *(optional)* Reports the [tool type](#tools-and-tool-types) as 275 `MT_TOOL_FINGER` or `MT_TOOL_PEN`. 276 277 * `ABS_MT_TRACKING_ID`: *(optional)* Reports the tracking id of the tool. 278 The tracking id is an arbitrary non-negative integer that is used to identify 279 and track each tool independently when multiple tools are active. For example, 280 when multiple fingers are touching the device, each finger should be assigned a distinct 281 tracking id that is used as long as the finger remains in contact. Tracking ids 282 may be reused when their associated tools move out of range. 283 284 * `ABS_MT_SLOT`: *(optional)* Reports the slot id of the tool, when using the Linux 285 multi-touch protocol 'B'. Refer to the Linux multi-touch protocol documentation 286 for more details. 287 288 * `BTN_TOUCH`: *(REQUIRED)* Indicates whether the tool is touching the device. 289 290 * `BTN_LEFT`, `BTN_RIGHT`, `BTN_MIDDLE`, `BTN_BACK`, `BTN_SIDE`, `BTN_FORWARD`, 291 `BTN_EXTRA`, `BTN_STYLUS`, `BTN_STYLUS2`: 292 *(optional)* Reports [button](#buttons) states. 293 294 * `BTN_TOOL_FINGER`, `BTN_TOOL_PEN`, `BTN_TOOL_RUBBER`, `BTN_TOOL_BRUSH`, 295 `BTN_TOOL_PENCIL`, `BTN_TOOL_AIRBRUSH`, `BTN_TOOL_MOUSE`, `BTN_TOOL_LENS`, 296 `BTN_TOOL_DOUBLETAP`, `BTN_TOOL_TRIPLETAP`, `BTN_TOOL_QUADTAP`: 297 *(optional)* Reports the [tool type](#tools-and-tool-types). 298 2994. If axes for both the single-touch and multi-touch protocol are defined, then 300 only the multi-touch axes will be used and the single-touch axes will be ignored. 301 3025. The minimum and maximum values of the `ABS_X`, `ABS_Y`, `ABS_MT_POSITION_X` 303 and `ABS_MT_POSITION_Y` axes define the bounds of the active area of the device 304 in device-specific surface units. In the case of a touch screen, the active area 305 describes the part of the touch device that actually covers the display. 306 307 For a touch screen, the system automatically interpolates the reported touch 308 positions in surface units to obtain touch positions in display pixels according 309 to the following calculation: 310 311 displayX = (x - minX) * displayWidth / (maxX - minX + 1) 312 displayY = (y - minY) * displayHeight / (maxY - minY + 1) 313 314 A touch screen may report touches outside of the reported active area. 315 316 Touches that are initiated outside the active area are not delivered to applications 317 but may be used for virtual keys. 318 319 Touches that are initiated inside the active area, or that enter and exit the display 320 area are delivered to applications. Consequently, if a touch starts within the 321 bounds of an application and then moves outside of the active area, the application 322 may receive touch events with display coordinates that are negative or beyond the 323 bounds of the display. This is expected behavior. 324 325 A touch device should never clamp touch coordinates to the bounds of the active 326 area. If a touch exits the active area, it should be reported as being outside of 327 the active area, or it should not be reported at all. 328 329 For example, if the user's finger is touching near the top-left corner of the 330 touch screen, it may report a coordinate of (minX, minY). If the finger continues 331 to move further outside of the active area, the touch screen should either start 332 reporting coordinates with components less than minX and minY, such as 333 (minX - 2, minY - 3), or it should stop reporting the touch altogether. 334 In other words, the touch screen should *not* be reporting (minX, minY) 335 when the user's finger is really touching outside of the active area. 336 337 Clamping touch coordinates to the display edge creates an artificial 338 hard boundary around the edge of the screen which prevents the system from 339 smoothly tracking motions that enter or exit the bounds of the display area. 340 3416. The values reported by `ABS_PRESSURE` or `ABS_MT_PRESSURE`, if they 342 are reported at all, must be non-zero when the tool is touching the device 343 and zero otherwise to indicate that the tool is hovering. 344 345 Reporting pressure information is *optional* but strongly recommended. 346 Applications can use pressure information to implement pressure-sensitive drawing 347 and other effects. 348 3497. The values reported by `ABS_TOOL_WIDTH`, `ABS_MT_TOUCH_MAJOR`, `ABS_MT_TOUCH_MINOR`, 350 `ABS_MT_WIDTH_MAJOR`, or `ABS_MT_WIDTH_MINOR` should be non-zero when the tool 351 is touching the device and zero otherwise, but this is not required. 352 For example, the touch device may be able to measure the size of finger touch 353 contacts but not stylus touch contacts. 354 355 Reporting size information is *optional* but strongly recommended. 356 Applications can use pressure information to implement size-sensitive drawing 357 and other effects. 358 3598. The values reported by `ABS_DISTANCE` or `ABS_MT_DISTANCE` should approach 360 zero when the tool is touching the device. The distance may remain non-zero 361 even when the tool is in direct contact. The exact values reported depend 362 on the manner in which the hardware measures distance. 363 364 Reporting distance information is *optional* but recommended for 365 stylus devices. 366 3679. The values reported by `ABS_TILT_X` and `ABS_TILT_Y` should be zero when the 368 tool is perpendicular to the device. A non-zero tilt is taken as an indication 369 that the tool is held at an incline. 370 371 The tilt angles along the X and Y axes are assumed to be specified in degrees 372 from perpendicular. The center point (perfectly perpendicular) is given 373 by `(max + min) / 2` for each axis. Values smaller than the center point 374 represent a tilt up or to the left, values larger than the center point 375 represent a tilt down or to the right. 376 377 The `InputReader` converts the X and Y tilt components into a perpendicular 378 tilt angle ranging from 0 to `PI / 2` radians and a planar orientation angle 379 ranging from `-PI` to `PI` radians. This representation results in a 380 description of orientation that is compatible with what is used to describe 381 finger touches. 382 383 Reporting tilt information is *optional* but recommended for stylus devices. 384 38510. If the tool type is reported by `ABS_MT_TOOL_TYPE`, it will supercede any tool 386 type information reported by `BTN_TOOL_*`. 387 If no tool type information is available at all, the tool type defaults to 388 `MotionEvent.TOOL_TYPE_FINGER`. 389 39011. A tool is determined to be active based on the following conditions: 391 392 * When using the single-touch protocol, the tool is active if `BTN_TOUCH`, 393 or `BTN_TOOL_*` is 1. 394 395 This condition implies that the `InputReader` needs to have at least some 396 information about the nature of the tool, either whether it is touching, 397 or at least its tool type. If no information is available, 398 then the tool is assumed to be inactive (out of range). 399 400 * When using the multi-touch protocol 'A', the tool is active whenever it 401 appears in the most recent sync report. When the tool stops appearing in 402 sync reports, it ceases to exist. 403 404 * When using the multi-touch protocol 'B', the tool is active as long as 405 it has an active slot. When the slot it cleared, the tool ceases to exist. 406 40712. A tool is determined to be hovering based on the following conditions: 408 409 * If the tool is `BTN_TOOL_MOUSE` or `BTN_TOOL_LENS`, then the tool 410 is not hovering, even if either of the following conditions are true. 411 412 * If the tool is active and the driver reports pressure information, 413 and the reported pressure is zero, then the tool is hovering. 414 415 * If the tool is active and the driver supports the `BTN_TOUCH` key code and 416 `BTN_TOUCH` has a value of zero, then the tool is hovering. 417 41813. The `InputReader` supports both multi-touch protocol 'A' and 'B'. New drivers 419 should use the 'B' protocol but either will work. 420 42114. **As of Android Ice Cream Sandwich 4.0, touch screen drivers may need to be changed 422 to comply with the Linux input protocol specification.** 423 424 The following changes may be required: 425 426 * When a tool becomes inactive (finger goes "up"), it should stop appearing 427 in subsequent multi-touch sync reports. When all tools become inactive 428 (all fingers go "up"), the driver should send an empty sync report packet, 429 such as `SYN_MT_REPORT` followed by `SYN_REPORT`. 430 431 Previous versions of Android expected "up" events to be reported by sending 432 a pressure value of 0. The old behavior was incompatible with the 433 Linux input protocol specification and is no longer supported. 434 435 * Physical pressure or signal strength information should be reported using 436 `ABS_MT_PRESSURE`. 437 438 Previous versions of Android retrieved pressure information from 439 `ABS_MT_TOUCH_MAJOR`. The old behavior was incompatible with the 440 Linux input protocol specification and is no longer supported. 441 442 * Touch size information should be reported using `ABS_MT_TOUCH_MAJOR`. 443 444 Previous versions of Android retrieved size information from 445 `ABS_MT_TOOL_MAJOR`. The old behavior was incompatible with the 446 Linux input protocol specification and is no longer supported. 447 448 Touch device drivers no longer need Android-specific customizations. 449 By relying on the standard Linux input protocol, Android can support a 450 wider variety of touch peripherals, such as external HID multi-touch 451 touch screens, using unmodified drivers. 452 453## Touch Device Operation ## 454 455The following is a brief summary of the touch device operation on Android. 456 4571. The `EventHub` reads raw events from the `evdev` driver. 458 4592. The `InputReader` consumes the raw events and updates internal state about 460 the position and other characteristics of each tool. It also tracks 461 button states. 462 4633. If the BACK or FORWARD buttons were pressed or released, the `InputReader` 464 notifies the `InputDispatcher` about the key event. 465 4664. The `InputReader` determines whether a virtual key press occurred. If so, 467 it notifies the `InputDispatcher` about the key event. 468 4695. The `InputReader` determines whether the touch was initiated within the 470 bounds of the display. If so, it notifies the `InputDispatcher` about 471 the touch event. 472 4736. If there are no touching tools but there is at least one hovering tool, 474 the `InputReader` notifies the `InputDispatcher` about the hover event. 475 4767. If the touch device type is *pointer*, the `InputReader` performs pointer 477 gesture detection, moves the pointer and spots accordingly and notifies 478 the `InputDispatcher` about the pointer event. 479 4808. The `InputDispatcher` uses the `WindowManagerPolicy` to determine whether 481 the events should be dispatched and whether they should wake the device. 482 Then, the `InputDispatcher` delivers the events to the appropriate applications. 483 484## Touch Device Configuration ## 485 486Touch device behavior is determined by the device's axes, buttons, input properties, 487input device configuration, virtual key map and key layout. 488 489Refer to the following sections for more details about the files that 490participate in keyboard configuration: 491 492* [Input Device Configuration Files](/tech/input/input-device-configuration-files.html) 493* [Virtual Key Map Files](#virtual-key-map-files) 494 495### Properties ### 496 497The system relies on many input device configuration properties to configure 498and calibrate touch device behavior. 499 500One reason for this is that the device drivers for touch devices often report 501the characteristics of touches using device-specific units. 502 503For example, many touch devices measure the touch contact area 504using an internal device-specific scale, such as the total number of 505sensor nodes that were triggered by the touch. This raw size value would 506not be meaningful applications because they would need to know about the 507physical size and other characteristics of the touch device sensor nodes. 508 509The system uses calibration parameters encoded in input device configuration 510files to decode, transform, and normalize the values reported by the touch 511device into a simpler standard representation that applications can understand. 512 513### Documentation Conventions ### 514 515For documentation purposes, we will use the following conventions to describe 516the values used by the system during the calibration process. 517 518#### Raw Axis Values #### 519 520The following expressions denote the raw values reported by the touch 521device driver as `EV_ABS` events. 522 523`raw.x` 524: The value of the `ABS_X` or `ABS_MT_POSITION_X` axis. 525 526`raw.y` 527: The value of the `ABS_Y` or `ABS_MT_POSITION_Y` axis. 528 529`raw.pressure` 530: The value of the `ABS_PRESSURE` or `ABS_MT_PRESSURE` axis, or 0 if not available. 531 532`raw.touchMajor` 533: The value of the `ABS_MT_TOUCH_MAJOR` axis, or 0 if not available. 534 535`raw.touchMinor` 536: The value of the `ABS_MT_TOUCH_MINOR` axis, or `raw.touchMajor` if not available. 537 538`raw.toolMajor` 539: The value of the `ABS_TOOL_WIDTH` or `ABS_MT_WIDTH_MAJOR` axis, or 0 if not available. 540 541`raw.toolMinor` 542: The value of the `ABS_MT_WIDTH_MINOR` axis, or `raw.toolMajor` if not available. 543 544`raw.orientation` 545: The value of the `ABS_MT_ORIENTATION` axis, or 0 if not available. 546 547`raw.distance` 548: The value of the `ABS_DISTANCE` or `ABS_MT_DISTANCE` axis, or 0 if not available. 549 550`raw.tiltX` 551: The value of the `ABS_TILT_X` axis, or 0 if not available. 552 553`raw.tiltY` 554: The value of the `ABS_TILT_Y` axis, or 0 if not available. 555 556#### Raw Axis Ranges #### 557 558The following expressions denote the bounds of raw values. They are obtained 559by calling `EVIOCGABS` ioctl for each axis. 560 561`raw.*.min` 562: The inclusive minimum value of the raw axis. 563 564`raw.*.max` 565: The inclusive maximum value of the raw axis. 566 567`raw.*.range` 568: Equivalent to `raw.*.max - raw.*.min`. 569 570`raw.*.fuzz` 571: The accuracy of the raw axis. eg. fuzz = 1 implies values are accurate to +/- 1 unit. 572 573`raw.width` 574: The inclusive width of the touch area, equivalent to `raw.x.range + 1`. 575 576`raw.height` 577: The inclusive height of the touch area, equivalent to `raw.y.range + 1`. 578 579#### Output Ranges #### 580 581The following expressions denote the characteristics of the output coordinate system. 582The system uses linear interpolation to translate touch position information from 583the surface units used by the touch device into the output units that will 584be reported to applications such as display pixels. 585 586`output.width` 587: The output width. For touch screens (associated with a display), this 588 is the display width in pixels. For touch pads (not associated with a display), 589 the output width equals `raw.width`, indicating that no interpolation will 590 be performed. 591 592`output.height` 593: The output height. For touch screens (associated with a display), this 594 is the display height in pixels. For touch pads (not associated with a display), 595 the output height equals `raw.height`, indicating that no interpolation will 596 be performed. 597 598`output.diag` 599: The diagonal length of the output coordinate system, equivalent to 600 `sqrt(output.width ^2 + output.height ^2)`. 601 602### Basic Configuration ### 603 604The touch input mapper uses many configuration properties in the input device 605configuration file to specify calibration values. The following table describes 606some general purpose configuration properties. All other properties are described 607in the following sections along with the fields they are used to calibrate. 608 609#### `touch.deviceType` #### 610 611*Definition:* `touch.deviceType` = `touchScreen` | `touchPad` | `pointer` | `default` 612 613Specifies the touch device type. 614 615* If the value is `touchScreen`, the touch device is a touch screen associated 616 with a display. 617 618* If the value is `touchPad`, the touch device is a touch pad not associated 619 with a display. 620 621* If the value is `pointer`, the touch device is a touch pad not associated 622 with a display, and its motions are used for 623 [indirect multi-touch pointer gestures](#indirect-multi-touch-pointer-gestures). 624 625* If the value is `default`, the system automatically detects the device type 626 according to the classification algorithm. 627 628Refer to the [Classification](#touch-device-classification) section for more details 629about how the device type influences the behavior of the touch device. 630 631Prior to Honeycomb, all touch devices were assumed to be touch screens. 632 633#### `touch.orientationAware` #### 634 635*Definition:* `touch.orientationAware` = `0` | `1` 636 637Specifies whether the touch device should react to display orientation changes. 638 639* If the value is `1`, touch positions reported by the touch device are rotated 640 whenever the display orientation changes. 641 642* If the value is `0`, touch positions reported by the touch device are immune 643 to display orientation changes. 644 645The default value is `1` if the device is a touch screen, `0` otherwise. 646 647The system distinguishes between internal and external touch screens and displays. 648An orientation aware internal touch screen is rotated based on the orientation 649of the internal display. An orientation aware external touch screen is rotated 650based on the orientation of the external display. 651 652Orientation awareness is used to support rotation of touch screens on devices 653like the Nexus One. For example, when the device is rotated clockwise 90 degrees 654from its natural orientation, the absolute positions of touches are remapped such 655that a touch in the top-left corner of the touch screen's absolute coordinate system 656is reported as a touch in the top-left corner of the display's rotated coordinate system. 657This is done so that touches are reported with the same coordinate system that 658applications use to draw their visual elements. 659 660Prior to Honeycomb, all touch devices were assumed to be orientation aware. 661 662#### `touch.gestureMode` #### 663 664*Definition:* `touch.gestureMode` = `pointer` | `spots` | `default` 665 666Specifies the presentation mode for pointer gestures. This configuration property 667is only relevant when the touch device is of type *pointer*. 668 669* If the value is `pointer`, the touch pad gestures are presented by way of a cursor 670 similar to a mouse pointer. 671 672* If the value is `spots`, the touch pad gestures are presented by an anchor 673 that represents the centroid of the gesture and a set of circular spots 674 that represent the position of individual fingers. 675 676The default value is `pointer` when the `INPUT_PROP_SEMI_MT` input property 677is set, or `spots` otherwise. 678 679### `X` and `Y` Fields ### 680 681The X and Y fields provide positional information for the center of the contact area. 682 683#### Calculation #### 684 685The calculation is straightforward: positional information from the touch driver is 686linearly interpolated to the output coordinate system. 687 688 xScale = output.width / raw.width 689 yScale = output.height / raw.height 690 691 If not orientation aware or screen rotation is 0 degrees: 692 output.x = (raw.x - raw.x.min) * xScale 693 output.y = (raw.y - raw.y.min) * yScale 694 Else If rotation is 90 degrees: 695 output.x = (raw.y - raw.y.min) * yScale 696 output.y = (raw.x.max - raw.x) * xScale 697 Else If rotation is 180 degrees: 698 output.x = (raw.x.max - raw.x) * xScale 699 output.y = (raw.y.max - raw.y) * yScale 700 Else If rotation is 270 degrees: 701 output.x = (raw.y.max - raw.y) * yScale 702 output.y = (raw.x - raw.x.min) * xScale 703 End If 704 705### `TouchMajor`, `TouchMinor`, `ToolMajor`, `ToolMinor`, `Size` Fields ### 706 707The `TouchMajor` and `TouchMinor` fields describe the approximate dimensions 708of the contact area in output units (pixels). 709 710The `ToolMajor` and `ToolMinor` fields describe the approximate dimensions 711of the [tool](#tools-and-tool-types) itself in output units (pixels). 712 713The `Size` field describes the normalized size of the touch relative to 714the largest possible touch that the touch device can sense. The smallest 715possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest 716possible normalized size is 1.0 (sensor area is saturated). 717 718When both the approximate length and breadth can be measured, then the `TouchMajor` field 719specifies the longer dimension and the `TouchMinor` field specifies the shorter dimension 720of the contact area. When only the approximate diameter of the contact area can be measured, 721then the `TouchMajor` and `TouchMinor` fields will be equal. 722 723Likewise, the `ToolMajor` field specifies the longer dimension and the `ToolMinor` 724field specifies the shorter dimension of the tool's cross-sectional area. 725 726If the touch size is unavailable but the tool size is available, then the tool size 727will be set equal to the touch size. Conversely, if the tool size is unavailable 728but the touch size is available, then the touch size will be set equal to the tool size. 729 730Touch devices measure or report the touch size and tool size in various ways. 731The current implementation supports three different kinds of measurements: 732diameter, area, and geometric bounding box in surface units. 733 734#### `touch.size.calibration` #### 735 736*Definition:* `touch.size.calibration` = `none` | `geometric` | `diameter` 737| `area` | `default` 738 739Specifies the kind of measurement used by the touch driver to report the 740touch size and tool size. 741 742* If the value is `none`, the size is set to zero. 743 744* If the value is `geometric`, the size is assumed to be specified in the same 745 surface units as the position, so it is scaled in the same manner. 746 747* If the value is `diameter`, the size is assumed to be proportional to 748 the diameter (width) of the touch or tool. 749 750* If the value is `area`, the size is assumed to be proportional to the 751 area of the touch or tool. 752 753* If the value is `default`, the system uses the `geometric` calibration if the 754 `raw.touchMajor` or `raw.toolMajor` axis is available, otherwise it uses 755 the `none` calibration. 756 757#### `touch.size.scale` #### 758 759*Definition:* `touch.size.scale` = <a non-negative floating point number> 760 761Specifies a constant scale factor used in the calibration. 762 763The default value is `1.0`. 764 765#### `touch.size.bias` #### 766 767*Definition:* `touch.size.bias` = <a non-negative floating point number> 768 769Specifies a constant bias value used in the calibration. 770 771The default value is `0.0`. 772 773#### `touch.size.isSummed` #### 774 775*Definition:* `touch.size.isSummed` = `0` | `1` 776 777Specifies whether the size is reported as the sum of the sizes of all 778active contacts, or is reported individually for each contact. 779 780* If the value is `1`, the reported size will be divided by the number 781 of contacts prior to use. 782 783* If the value is `0`, the reported size will be used as is. 784 785The default value is `0`. 786 787Some touch devices, particularly "Semi-MT" devices cannot distinguish the 788individual dimensions of multiple contacts so they report a size measurement 789that represents their total area or width. This property should only be set to 790`1` for such devices. If in doubt, set this value to `0`. 791 792#### Calculation #### 793 794The calculation of the `TouchMajor`, `TouchMinor`, `ToolMajor`, `ToolMinor` 795and `Size` fields depends on the specified calibration parameters. 796 797 If raw.touchMajor and raw.toolMajor are available: 798 touchMajor = raw.touchMajor 799 touchMinor = raw.touchMinor 800 toolMajor = raw.toolMajor 801 toolMinor = raw.toolMinor 802 Else If raw.touchMajor is available: 803 toolMajor = touchMajor = raw.touchMajor 804 toolMinor = touchMinor = raw.touchMinor 805 Else If raw.toolMajor is available: 806 touchMajor = toolMajor = raw.toolMajor 807 touchMinor = toolMinor = raw.toolMinor 808 Else 809 touchMajor = toolMajor = 0 810 touchMinor = toolMinor = 0 811 size = 0 812 End If 813 814 size = avg(touchMajor, touchMinor) 815 816 If touch.size.isSummed == 1: 817 touchMajor = touchMajor / numberOfActiveContacts 818 touchMinor = touchMinor / numberOfActiveContacts 819 toolMajor = toolMajor / numberOfActiveContacts 820 toolMinor = toolMinor / numberOfActiveContacts 821 size = size / numberOfActiveContacts 822 End If 823 824 If touch.size.calibration == "none": 825 touchMajor = toolMajor = 0 826 touchMinor = toolMinor = 0 827 size = 0 828 Else If touch.size.calibration == "geometric": 829 outputScale = average(output.width / raw.width, output.height / raw.height) 830 touchMajor = touchMajor * outputScale 831 touchMinor = touchMinor * outputScale 832 toolMajor = toolMajor * outputScale 833 toolMinor = toolMinor * outputScale 834 Else If touch.size.calibration == "area": 835 touchMajor = sqrt(touchMajor) 836 touchMinor = touchMajor 837 toolMajor = sqrt(toolMajor) 838 toolMinor = toolMajor 839 Else If touch.size.calibration == "diameter": 840 touchMinor = touchMajor 841 toolMinor = toolMajor 842 End If 843 844 If touchMajor != 0: 845 output.touchMajor = touchMajor * touch.size.scale + touch.size.bias 846 Else 847 output.touchMajor = 0 848 End If 849 850 If touchMinor != 0: 851 output.touchMinor = touchMinor * touch.size.scale + touch.size.bias 852 Else 853 output.touchMinor = 0 854 End If 855 856 If toolMajor != 0: 857 output.toolMajor = toolMajor * touch.size.scale + touch.size.bias 858 Else 859 output.toolMajor = 0 860 End If 861 862 If toolMinor != 0: 863 output.toolMinor = toolMinor * touch.size.scale + touch.size.bias 864 Else 865 output.toolMinor = 0 866 End If 867 868 output.size = size 869 870### `Pressure` Field ### 871 872The `Pressure` field describes the approximate physical pressure applied to the 873touch device as a normalized value between 0.0 (no touch) and 1.0 (full force). 874 875A zero pressure indicates that the tool is hovering. 876 877#### `touch.pressure.calibration` #### 878 879*Definition:* `touch.pressure.calibration` = `none` | `physical` | `amplitude` | `default` 880 881Specifies the kind of measurement used by the touch driver to report the pressure. 882 883* If the value is `none`, the pressure is unknown so it is set to 1.0 when 884 touching and 0.0 when hovering. 885 886* If the value is `physical`, the pressure axis is assumed to measure the actual 887 physical intensity of pressure applied to the touch pad. 888 889* If the value is `amplitude`, the pressure axis is assumed to measure the signal 890 amplitude, which is related to the size of the contact and the pressure applied. 891 892* If the value is `default`, the system uses the `physical` calibration if the 893 pressure axis available, otherwise uses `none`. 894 895#### `touch.pressure.scale` #### 896 897*Definition:* `touch.pressure.scale` = <a non-negative floating point number> 898 899Specifies a constant scale factor used in the calibration. 900 901The default value is `1.0 / raw.pressure.max`. 902 903#### Calculation #### 904 905The calculation of the `Pressure` field depends on the specified calibration parameters. 906 907 If touch.pressure.calibration == "physical" or "amplitude": 908 output.pressure = raw.pressure * touch.pressure.scale 909 Else 910 If hovering: 911 output.pressure = 0 912 Else 913 output.pressure = 1 914 End If 915 End If 916 917### `Orientation` and `Tilt` Fields ### 918 919The `Orientation` field describes the orientation of the touch and tool as an 920angular measurement. An orientation of `0` indicates that the major axis is 921oriented vertically, `-PI/2` indicates that the major axis is oriented to the left, 922`PI/2` indicates that the major axis is oriented to the right. When a stylus 923tool is present, the orientation range may be described in a full circle range 924from `-PI` or `PI`. 925 926The `Tilt` field describes the inclination of the tool as an angular measurement. 927A tilt of `0` indicates that the tool is perpendicular to the surface. 928A tilt of `PI/2` indicates that the tool is flat on the surface. 929 930#### `touch.orientation.calibration` #### 931 932*Definition:* `touch.orientation.calibration` = `none` | `interpolated` | `vector` | `default` 933 934Specifies the kind of measurement used by the touch driver to report the orientation. 935 936* If the value is `none`, the orientation is unknown so it is set to 0. 937 938* If the value is `interpolated`, the orientation is linearly interpolated such that a 939 raw value of `raw.orientation.min` maps to `-PI/2` and a raw value of 940 `raw.orientation.max` maps to `PI/2`. The center value of 941 `(raw.orientation.min + raw.orientation.max) / 2` maps to `0`. 942 943* If the value is `vector`, the orientation is interpreted as a packed vector consisiting 944 of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol 945 parts. When decoded, the vector yields an orientation angle and confidence 946 magnitude. The confidence magnitude is used to scale the size information, 947 unless it is geometric. 948 949* If the value is `default`, the system uses the `interpolated` calibration if the 950 orientation axis available, otherwise uses `none`. 951 952#### Calculation #### 953 954The calculation of the `Orientation` and `Tilt` fields depends on the specified 955calibration parameters and available input. 956 957 If touch.tiltX and touch.tiltY are available: 958 tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) 959 tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) 960 tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 961 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 962 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) 963 output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) 964 Else If touch.orientation.calibration == "interpolated": 965 center = average(raw.orientation.min, raw.orientation.max) 966 output.orientation = PI / (raw.orientation.max - raw.orientation.min) 967 output.tilt = 0 968 Else If touch.orientation.calibration == "vector": 969 c1 = (raw.orientation & 0xF0) >> 4 970 c2 = raw.orientation & 0x0F 971 972 If c1 != 0 or c2 != 0: 973 If c1 >= 8 Then c1 = c1 - 16 974 If c2 >= 8 Then c2 = c2 - 16 975 angle = atan2(c1, c2) / 2 976 confidence = sqrt(c1*c1 + c2*c2) 977 978 output.orientation = angle 979 980 If touch.size.calibration == "diameter" or "area": 981 scale = 1.0 + confidence / 16 982 output.touchMajor *= scale 983 output.touchMinor /= scale 984 output.toolMajor *= scale 985 output.toolMinor /= scale 986 End If 987 Else 988 output.orientation = 0 989 End If 990 output.tilt = 0 991 Else 992 output.orientation = 0 993 output.tilt = 0 994 End If 995 996 If orientation aware: 997 If screen rotation is 90 degrees: 998 output.orientation = output.orientation - PI / 2 999 Else If screen rotation is 270 degrees: 1000 output.orientation = output.orientation + PI / 2 1001 End If 1002 End If 1003 1004### `Distance` Field ### 1005 1006The `Distance` field describes the distance between the tool and the touch device 1007surface. A value of 0.0 indicates direct contact and larger values indicate 1008increasing distance from the surface. 1009 1010#### `touch.distance.calibration` #### 1011 1012*Definition:* `touch.distance.calibration` = `none` | `scaled` | `default` 1013 1014Specifies the kind of measurement used by the touch driver to report the distance. 1015 1016* If the value is `none`, the distance is unknown so it is set to 0. 1017 1018* If the value is `scaled`, the reported distance is multiplied by a 1019 constant scale factor. 1020 1021* If the value is `default`, the system uses the `scaled` calibration if the 1022 distance axis available, otherwise uses `none`. 1023 1024#### `touch.distance.scale` #### 1025 1026*Definition:* `touch.distance.scale` = <a non-negative floating point number> 1027 1028Specifies a constant scale factor used in the calibration. 1029 1030The default value is `1.0`. 1031 1032#### Calculation #### 1033 1034The calculation of the `Distance` field depends on the specified calibration parameters. 1035 1036 If touch.distance.calibration == "scaled": 1037 output.distance = raw.distance * touch.distance.scale 1038 Else 1039 output.distance = 0 1040 End If 1041 1042### Example ### 1043 1044 # Input device configuration file for a touch screen that supports pressure, 1045 # size and orientation. The pressure and size scale factors were obtained 1046 # by measuring the characteristics of the device itself and deriving 1047 # useful approximations based on the resolution of the touch sensor and the 1048 # display. 1049 # 1050 # Note that these parameters are specific to a particular device model. 1051 # Different parameters will need to be used for other devices. 1052 1053 # Basic Parameters 1054 touch.deviceType = touchScreen 1055 touch.orientationAware = 1 1056 1057 # Size 1058 # Based on empirical measurements, we estimate the size of the contact 1059 # using size = sqrt(area) * 28 + 0. 1060 touch.size.calibration = area 1061 touch.size.scale = 28 1062 touch.size.bias = 0 1063 touch.size.isSummed = 0 1064 1065 # Pressure 1066 # Driver reports signal strength as pressure. 1067 # 1068 # A normal index finger touch typically registers about 80 signal strength 1069 # units although we don't expect these values to be accurate. 1070 touch.pressure.calibration = amplitude 1071 touch.pressure.scale = 0.0125 1072 1073 # Orientation 1074 touch.orientation.calibration = vector 1075 1076### Compatibility Notes ### 1077 1078The configuration properties for touch devices changed significantly in 1079Android Ice Cream Sandwich 4.0. **All input device configuration files for touch 1080devices must be updated to use the new configuration properties.** 1081 1082Older touch device [drivers](#touch-device-driver-requirements) may also need to be 1083updated. 1084 1085## Virtual Key Map Files ## 1086 1087Touch devices are often used to implement virtual keys. 1088 1089There are several ways of doing this, depending on the capabilities of the 1090touch controller. Some touch controllers can be directly configured to implement 1091soft keys by setting firmware registers. Other times it is desirable to perform 1092the mapping from touch coordinates to key codes in software. 1093 1094When virtual keys are implemented in software, the kernel must export a virtual key map 1095file called `virtualkeys.<devicename>` as a board property. For example, 1096if the touch screen device drivers reports its name as "touchyfeely" then 1097the virtual key map file must have the path `/sys/board_properties/virtualkeys.touchyfeely`. 1098 1099A virtual key map file describes the coordinates and Linux key codes of virtual keys 1100on the touch screen. 1101 1102In addition to the virtual key map file, there must be a corresponding key layout 1103file and key character map file to map the Linux key codes to Android key codes and 1104to specify the type of the keyboard device (usually `SPECIAL_FUNCTION`). 1105 1106### Syntax ### 1107 1108A virtual key map file is a plain text file consisting of a sequence of virtual key 1109layout descriptions either separated by newlines or by colons. 1110 1111Comment lines begin with '#' and continue to the end of the line. 1112 1113Each virtual key is described by 6 colon-delimited components: 1114 1115* `0x01`: A version code. Must always be `0x01`. 1116* <Linux key code>: The Linux key code of the virtual key. 1117* <centerX>: The X pixel coordinate of the center of the virtual key. 1118* <centerY>: The Y pixel coordinate of the center of the virtual key. 1119* <width>: The width of the virtual key in pixels. 1120* <height>: The height of the virtual key in pixels. 1121 1122All coordinates and sizes are specified in terms of the display coordinate system. 1123 1124Here is a virtual key map file all written on one line. 1125 1126 # All on one line 1127 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55 1128 1129The same virtual key map file can also be written on multiple lines. 1130 1131 # One key per line 1132 0x01:158:55:835:90:55 1133 0x01:139:172:835:125:55 1134 0x01:102:298:835:115:55 1135 0x01:217:412:835:95:55 1136 1137In the above example, the touch screen has a resolution of 480x800. Accordingly, all of 1138the virtual keys have a <centerY> coordinate of 835, which is a little bit below 1139the visible area of the touch screen. 1140 1141The first key has a Linux scan code of `158` (`KEY_BACK`), centerX of `55`, 1142centerY of `835`, width of `90` and height of `55`. 1143 1144### Example ### 1145 1146Virtual key map file: `/sys/board_properties/virtualkeys.touchyfeely`. 1147 1148 0x01:158:55:835:90:55 1149 0x01:139:172:835:125:55 1150 0x01:102:298:835:115:55 1151 0x01:217:412:835:95:55 1152 1153Key layout file: `/system/usr/keylayout/touchyfeely.kl`. 1154 1155 key 158 BACK 1156 key 139 MENU 1157 key 102 HOME 1158 key 217 SEARCH 1159 1160Key character map file: `/system/usr/keychars/touchyfeely.kcm`. 1161 1162 type SPECIAL_FUNCTION 1163 1164## Indirect Multi-touch Pointer Gestures ## 1165 1166In pointer mode, the system interprets the following gestures: 1167 11681. Single finger tap: click. 1169 11702. Single finger motion: move the pointer. 1171 11723. Single finger motion plus button presses: drag the pointer. 1173 11744. Two finger motion both fingers moving in the same direction: drag the area under the pointer 1175 in that direction. The pointer itself does not move. 1176 11775. Two finger motion both fingers moving towards each other or apart in 1178 different directions: pan/scale/rotate the area surrounding the pointer. 1179 The pointer itself does not move. 1180 11816. Multiple finger motion: freeform gesture. 1182 1183## Further Reading ## 1184 11851. [Linux multi-touch protocol](http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt) 11862. [ENAC list of available multitouch devices on Linux](http://lii-enac.fr/en/architecture/linux-input/multitouch-devices.html) 1187