Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.17-rc2 748 lines 20 kB view raw
1Elantech Touchpad Driver 2======================== 3 4 Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net> 5 6 Extra information for hardware version 1 found and 7 provided by Steve Havelka 8 9 Version 2 (EeePC) hardware support based on patches 10 received from Woody at Xandros and forwarded to me 11 by user StewieGriffin at the eeeuser.com forum 12 13 14Contents 15~~~~~~~~ 16 17 1. Introduction 18 2. Extra knobs 19 3. Differentiating hardware versions 20 4. Hardware version 1 21 4.1 Registers 22 4.2 Native relative mode 4 byte packet format 23 4.3 Native absolute mode 4 byte packet format 24 5. Hardware version 2 25 5.1 Registers 26 5.2 Native absolute mode 6 byte packet format 27 5.2.1 Parity checking and packet re-synchronization 28 5.2.2 One/Three finger touch 29 5.2.3 Two finger touch 30 6. Hardware version 3 31 6.1 Registers 32 6.2 Native absolute mode 6 byte packet format 33 6.2.1 One/Three finger touch 34 6.2.2 Two finger touch 35 7. Hardware version 4 36 7.1 Registers 37 7.2 Native absolute mode 6 byte packet format 38 7.2.1 Status packet 39 7.2.2 Head packet 40 7.2.3 Motion packet 41 42 43 441. Introduction 45 ~~~~~~~~~~~~ 46 47Currently the Linux Elantech touchpad driver is aware of two different 48hardware versions unimaginatively called version 1 and version 2. Version 1 49is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to 50be introduced with the EeePC and uses 6 bytes per packet, and provides 51additional features such as position of two fingers, and width of the touch. 52 53The driver tries to support both hardware versions and should be compatible 54with the Xorg Synaptics touchpad driver and its graphical configuration 55utilities. 56 57Additionally the operation of the touchpad can be altered by adjusting the 58contents of some of its internal registers. These registers are represented 59by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? 60that can be read from and written to. 61 62Currently only the registers for hardware version 1 are somewhat understood. 63Hardware version 2 seems to use some of the same registers but it is not 64known whether the bits in the registers represent the same thing or might 65have changed their meaning. 66 67On top of that, some register settings have effect only when the touchpad is 68in relative mode and not in absolute mode. As the Linux Elantech touchpad 69driver always puts the hardware into absolute mode not all information 70mentioned below can be used immediately. But because there is no freely 71available Elantech documentation the information is provided here anyway for 72completeness sake. 73 74 75///////////////////////////////////////////////////////////////////////////// 76 77 782. Extra knobs 79 ~~~~~~~~~~~ 80 81Currently the Linux Elantech touchpad driver provides two extra knobs under 82/sys/bus/serio/drivers/psmouse/serio? for the user. 83 84* debug 85 86 Turn different levels of debugging ON or OFF. 87 88 By echoing "0" to this file all debugging will be turned OFF. 89 90 Currently a value of "1" will turn on some basic debugging and a value of 91 "2" will turn on packet debugging. For hardware version 1 the default is 92 OFF. For version 2 the default is "1". 93 94 Turning packet debugging on will make the driver dump every packet 95 received to the syslog before processing it. Be warned that this can 96 generate quite a lot of data! 97 98* paritycheck 99 100 Turns parity checking ON or OFF. 101 102 By echoing "0" to this file parity checking will be turned OFF. Any 103 non-zero value will turn it ON. For hardware version 1 the default is ON. 104 For version 2 the default it is OFF. 105 106 Hardware version 1 provides basic data integrity verification by 107 calculating a parity bit for the last 3 bytes of each packet. The driver 108 can check these bits and reject any packet that appears corrupted. Using 109 this knob you can bypass that check. 110 111 Hardware version 2 does not provide the same parity bits. Only some basic 112 data consistency checking can be done. For now checking is disabled by 113 default. Currently even turning it on will do nothing. 114 115///////////////////////////////////////////////////////////////////////////// 116 1173. Differentiating hardware versions 118 ================================= 119 120To detect the hardware version, read the version number as param[0].param[1].param[2] 121 122 4 bytes version: (after the arrow is the name given in the Dell-provided driver) 123 02.00.22 => EF013 124 02.06.00 => EF019 125In the wild, there appear to be more versions, such as 00.01.64, 01.00.21, 12602.00.00, 02.00.04, 02.00.06. 127 128 6 bytes: 129 02.00.30 => EF113 130 02.08.00 => EF023 131 02.08.XX => EF123 132 02.0B.00 => EF215 133 04.01.XX => Scroll_EF051 134 04.02.XX => EF051 135In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There 136appears to be almost no difference, except for EF113, which does not report 137pressure/width and has different data consistency checks. 138 139Probably all the versions with param[0] <= 01 can be considered as 1404 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as 1414 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes. 142 143///////////////////////////////////////////////////////////////////////////// 144 1454. Hardware version 1 146 ================== 147 1484.1 Registers 149 ~~~~~~~~~ 150 151By echoing a hexadecimal value to a register it contents can be altered. 152 153For example: 154 155 echo -n 0x16 > reg_10 156 157* reg_10 158 159 bit 7 6 5 4 3 2 1 0 160 B C T D L A S E 161 162 E: 1 = enable smart edges unconditionally 163 S: 1 = enable smart edges only when dragging 164 A: 1 = absolute mode (needs 4 byte packets, see reg_11) 165 L: 1 = enable drag lock (see reg_22) 166 D: 1 = disable dynamic resolution 167 T: 1 = disable tapping 168 C: 1 = enable corner tap 169 B: 1 = swap left and right button 170 171* reg_11 172 173 bit 7 6 5 4 3 2 1 0 174 1 0 0 H V 1 F P 175 176 P: 1 = enable parity checking for relative mode 177 F: 1 = enable native 4 byte packet mode 178 V: 1 = enable vertical scroll area 179 H: 1 = enable horizontal scroll area 180 181* reg_20 182 183 single finger width? 184 185* reg_21 186 187 scroll area width (small: 0x40 ... wide: 0xff) 188 189* reg_22 190 191 drag lock time out (short: 0x14 ... long: 0xfe; 192 0xff = tap again to release) 193 194* reg_23 195 196 tap make timeout? 197 198* reg_24 199 200 tap release timeout? 201 202* reg_25 203 204 smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast) 205 206* reg_26 207 208 smart edge activation area width? 209 210 2114.2 Native relative mode 4 byte packet format 212 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 214byte 0: 215 bit 7 6 5 4 3 2 1 0 216 c c p2 p1 1 M R L 217 218 L, R, M = 1 when Left, Right, Middle mouse button pressed 219 some models have M as byte 3 odd parity bit 220 when parity checking is enabled (reg_11, P = 1): 221 p1..p2 = byte 1 and 2 odd parity bit 222 c = 1 when corner tap detected 223 224byte 1: 225 bit 7 6 5 4 3 2 1 0 226 dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0 227 228 dx7..dx0 = x movement; positive = right, negative = left 229 byte 1 = 0xf0 when corner tap detected 230 231byte 2: 232 bit 7 6 5 4 3 2 1 0 233 dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0 234 235 dy7..dy0 = y movement; positive = up, negative = down 236 237byte 3: 238 parity checking enabled (reg_11, P = 1): 239 240 bit 7 6 5 4 3 2 1 0 241 w h n1 n0 ds3 ds2 ds1 ds0 242 243 normally: 244 ds3..ds0 = scroll wheel amount and direction 245 positive = down or left 246 negative = up or right 247 when corner tap detected: 248 ds0 = 1 when top right corner tapped 249 ds1 = 1 when bottom right corner tapped 250 ds2 = 1 when bottom left corner tapped 251 ds3 = 1 when top left corner tapped 252 n1..n0 = number of fingers on touchpad 253 only models with firmware 2.x report this, models with 254 firmware 1.x seem to map one, two and three finger taps 255 directly to L, M and R mouse buttons 256 h = 1 when horizontal scroll action 257 w = 1 when wide finger touch? 258 259 otherwise (reg_11, P = 0): 260 261 bit 7 6 5 4 3 2 1 0 262 ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0 263 264 ds7..ds0 = vertical scroll amount and direction 265 negative = up 266 positive = down 267 268 2694.3 Native absolute mode 4 byte packet format 270 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 271 272EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and 273when 1 finger is touching, the first 2 position reports must be discarded. 274This counting is reset whenever a different number of fingers is reported. 275 276byte 0: 277 firmware version 1.x: 278 279 bit 7 6 5 4 3 2 1 0 280 D U p1 p2 1 p3 R L 281 282 L, R = 1 when Left, Right mouse button pressed 283 p1..p3 = byte 1..3 odd parity bit 284 D, U = 1 when rocker switch pressed Up, Down 285 286 firmware version 2.x: 287 288 bit 7 6 5 4 3 2 1 0 289 n1 n0 p2 p1 1 p3 R L 290 291 L, R = 1 when Left, Right mouse button pressed 292 p1..p3 = byte 1..3 odd parity bit 293 n1..n0 = number of fingers on touchpad 294 295byte 1: 296 firmware version 1.x: 297 298 bit 7 6 5 4 3 2 1 0 299 f 0 th tw x9 x8 y9 y8 300 301 tw = 1 when two finger touch 302 th = 1 when three finger touch 303 f = 1 when finger touch 304 305 firmware version 2.x: 306 307 bit 7 6 5 4 3 2 1 0 308 . . . . x9 x8 y9 y8 309 310byte 2: 311 bit 7 6 5 4 3 2 1 0 312 x7 x6 x5 x4 x3 x2 x1 x0 313 314 x9..x0 = absolute x value (horizontal) 315 316byte 3: 317 bit 7 6 5 4 3 2 1 0 318 y7 y6 y5 y4 y3 y2 y1 y0 319 320 y9..y0 = absolute y value (vertical) 321 322 323///////////////////////////////////////////////////////////////////////////// 324 325 3265. Hardware version 2 327 ================== 328 329 3305.1 Registers 331 ~~~~~~~~~ 332 333By echoing a hexadecimal value to a register it contents can be altered. 334 335For example: 336 337 echo -n 0x56 > reg_10 338 339* reg_10 340 341 bit 7 6 5 4 3 2 1 0 342 0 1 0 1 0 1 D 0 343 344 D: 1 = enable drag and drop 345 346* reg_11 347 348 bit 7 6 5 4 3 2 1 0 349 1 0 0 0 S 0 1 0 350 351 S: 1 = enable vertical scroll 352 353* reg_21 354 355 unknown (0x00) 356 357* reg_22 358 359 drag and drop release time out (short: 0x70 ... long 0x7e; 360 0x7f = never i.e. tap again to release) 361 362 3635.2 Native absolute mode 6 byte packet format 364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3655.2.1 Parity checking and packet re-synchronization 366There is no parity checking, however some consistency checks can be performed. 367 368For instance for EF113: 369 SA1= packet[0]; 370 A1 = packet[1]; 371 B1 = packet[2]; 372 SB1= packet[3]; 373 C1 = packet[4]; 374 D1 = packet[5]; 375 if( (((SA1 & 0x3C) != 0x3C) && ((SA1 & 0xC0) != 0x80)) || // check Byte 1 376 (((SA1 & 0x0C) != 0x0C) && ((SA1 & 0xC0) == 0x80)) || // check Byte 1 (one finger pressed) 377 (((SA1 & 0xC0) != 0x80) && (( A1 & 0xF0) != 0x00)) || // check Byte 2 378 (((SB1 & 0x3E) != 0x38) && ((SA1 & 0xC0) != 0x80)) || // check Byte 4 379 (((SB1 & 0x0E) != 0x08) && ((SA1 & 0xC0) == 0x80)) || // check Byte 4 (one finger pressed) 380 (((SA1 & 0xC0) != 0x80) && (( C1 & 0xF0) != 0x00)) ) // check Byte 5 381 // error detected 382 383For all the other ones, there are just a few constant bits: 384 if( ((packet[0] & 0x0C) != 0x04) || 385 ((packet[3] & 0x0f) != 0x02) ) 386 // error detected 387 388 389In case an error is detected, all the packets are shifted by one (and packet[0] is discarded). 390 3915.2.2 One/Three finger touch 392 ~~~~~~~~~~~~~~~~ 393 394byte 0: 395 396 bit 7 6 5 4 3 2 1 0 397 n1 n0 w3 w2 . . R L 398 399 L, R = 1 when Left, Right mouse button pressed 400 n1..n0 = number of fingers on touchpad 401 402byte 1: 403 404 bit 7 6 5 4 3 2 1 0 405 p7 p6 p5 p4 x11 x10 x9 x8 406 407byte 2: 408 409 bit 7 6 5 4 3 2 1 0 410 x7 x6 x5 x4 x3 x2 x1 x0 411 412 x11..x0 = absolute x value (horizontal) 413 414byte 3: 415 416 bit 7 6 5 4 3 2 1 0 417 n4 vf w1 w0 . . . b2 418 419 n4 = set if more than 3 fingers (only in 3 fingers mode) 420 vf = a kind of flag ? (only on EF123, 0 when finger is over one 421 of the buttons, 1 otherwise) 422 w3..w0 = width of the finger touch (not EF113) 423 b2 (on EF113 only, 0 otherwise), b2.R.L indicates one button pressed: 424 0 = none 425 1 = Left 426 2 = Right 427 3 = Middle (Left and Right) 428 4 = Forward 429 5 = Back 430 6 = Another one 431 7 = Another one 432 433byte 4: 434 435 bit 7 6 5 4 3 2 1 0 436 p3 p1 p2 p0 y11 y10 y9 y8 437 438 p7..p0 = pressure (not EF113) 439 440byte 5: 441 442 bit 7 6 5 4 3 2 1 0 443 y7 y6 y5 y4 y3 y2 y1 y0 444 445 y11..y0 = absolute y value (vertical) 446 447 4485.2.3 Two finger touch 449 ~~~~~~~~~~~~~~~~ 450 451Note that the two pairs of coordinates are not exactly the coordinates of the 452two fingers, but only the pair of the lower-left and upper-right coordinates. 453So the actual fingers might be situated on the other diagonal of the square 454defined by these two points. 455 456byte 0: 457 458 bit 7 6 5 4 3 2 1 0 459 n1 n0 ay8 ax8 . . R L 460 461 L, R = 1 when Left, Right mouse button pressed 462 n1..n0 = number of fingers on touchpad 463 464byte 1: 465 466 bit 7 6 5 4 3 2 1 0 467 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 468 469 ax8..ax0 = lower-left finger absolute x value 470 471byte 2: 472 473 bit 7 6 5 4 3 2 1 0 474 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 475 476 ay8..ay0 = lower-left finger absolute y value 477 478byte 3: 479 480 bit 7 6 5 4 3 2 1 0 481 . . by8 bx8 . . . . 482 483byte 4: 484 485 bit 7 6 5 4 3 2 1 0 486 bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 487 488 bx8..bx0 = upper-right finger absolute x value 489 490byte 5: 491 492 bit 7 6 5 4 3 2 1 0 493 by7 by8 by5 by4 by3 by2 by1 by0 494 495 by8..by0 = upper-right finger absolute y value 496 497///////////////////////////////////////////////////////////////////////////// 498 4996. Hardware version 3 500 ================== 501 5026.1 Registers 503 ~~~~~~~~~ 504* reg_10 505 506 bit 7 6 5 4 3 2 1 0 507 0 0 0 0 R F T A 508 509 A: 1 = enable absolute tracking 510 T: 1 = enable two finger mode auto correct 511 F: 1 = disable ABS Position Filter 512 R: 1 = enable real hardware resolution 513 5146.2 Native absolute mode 6 byte packet format 515 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5161 and 3 finger touch shares the same 6-byte packet format, except that 5173 finger touch only reports the position of the center of all three fingers. 518 519Firmware would send 12 bytes of data for 2 finger touch. 520 521Note on debounce: 522In case the box has unstable power supply or other electricity issues, or 523when number of finger changes, F/W would send "debounce packet" to inform 524driver that the hardware is in debounce status. 525The debouce packet has the following signature: 526 byte 0: 0xc4 527 byte 1: 0xff 528 byte 2: 0xff 529 byte 3: 0x02 530 byte 4: 0xff 531 byte 5: 0xff 532When we encounter this kind of packet, we just ignore it. 533 5346.2.1 One/Three finger touch 535 ~~~~~~~~~~~~~~~~~~~~~~ 536 537byte 0: 538 539 bit 7 6 5 4 3 2 1 0 540 n1 n0 w3 w2 0 1 R L 541 542 L, R = 1 when Left, Right mouse button pressed 543 n1..n0 = number of fingers on touchpad 544 545byte 1: 546 547 bit 7 6 5 4 3 2 1 0 548 p7 p6 p5 p4 x11 x10 x9 x8 549 550byte 2: 551 552 bit 7 6 5 4 3 2 1 0 553 x7 x6 x5 x4 x3 x2 x1 x0 554 555 x11..x0 = absolute x value (horizontal) 556 557byte 3: 558 559 bit 7 6 5 4 3 2 1 0 560 0 0 w1 w0 0 0 1 0 561 562 w3..w0 = width of the finger touch 563 564byte 4: 565 566 bit 7 6 5 4 3 2 1 0 567 p3 p1 p2 p0 y11 y10 y9 y8 568 569 p7..p0 = pressure 570 571byte 5: 572 573 bit 7 6 5 4 3 2 1 0 574 y7 y6 y5 y4 y3 y2 y1 y0 575 576 y11..y0 = absolute y value (vertical) 577 5786.2.2 Two finger touch 579 ~~~~~~~~~~~~~~~~ 580 581The packet format is exactly the same for two finger touch, except the hardware 582sends two 6 byte packets. The first packet contains data for the first finger, 583the second packet has data for the second finger. So for two finger touch a 584total of 12 bytes are sent. 585 586///////////////////////////////////////////////////////////////////////////// 587 5887. Hardware version 4 589 ================== 590 5917.1 Registers 592 ~~~~~~~~~ 593* reg_07 594 595 bit 7 6 5 4 3 2 1 0 596 0 0 0 0 0 0 0 A 597 598 A: 1 = enable absolute tracking 599 6007.2 Native absolute mode 6 byte packet format 601 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 602v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers. 603Unfortunately, due to PS/2's limited bandwidth, its packet format is rather 604complex. 605 606Whenever the numbers or identities of the fingers changes, the hardware sends a 607status packet to indicate how many and which fingers is on touchpad, followed by 608head packets or motion packets. A head packet contains data of finger id, finger 609position (absolute x, y values), width, and pressure. A motion packet contains 610two fingers' position delta. 611 612For example, when status packet tells there are 2 fingers on touchpad, then we 613can expect two following head packets. If the finger status doesn't change, 614the following packets would be motion packets, only sending delta of finger 615position, until we receive a status packet. 616 617One exception is one finger touch. when a status packet tells us there is only 618one finger, the hardware would just send head packets afterwards. 619 6207.2.1 Status packet 621 ~~~~~~~~~~~~~ 622 623byte 0: 624 625 bit 7 6 5 4 3 2 1 0 626 . . . . 0 1 R L 627 628 L, R = 1 when Left, Right mouse button pressed 629 630byte 1: 631 632 bit 7 6 5 4 3 2 1 0 633 . . . ft4 ft3 ft2 ft1 ft0 634 635 ft4 ft3 ft2 ft1 ft0 ftn = 1 when finger n is on touchpad 636 637byte 2: not used 638 639byte 3: 640 641 bit 7 6 5 4 3 2 1 0 642 . . . 1 0 0 0 0 643 644 constant bits 645 646byte 4: 647 648 bit 7 6 5 4 3 2 1 0 649 p . . . . . . . 650 651 p = 1 for palm 652 653byte 5: not used 654 6557.2.2 Head packet 656 ~~~~~~~~~~~ 657 658byte 0: 659 660 bit 7 6 5 4 3 2 1 0 661 w3 w2 w1 w0 0 1 R L 662 663 L, R = 1 when Left, Right mouse button pressed 664 w3..w0 = finger width (spans how many trace lines) 665 666byte 1: 667 668 bit 7 6 5 4 3 2 1 0 669 p7 p6 p5 p4 x11 x10 x9 x8 670 671byte 2: 672 673 bit 7 6 5 4 3 2 1 0 674 x7 x6 x5 x4 x3 x2 x1 x0 675 676 x11..x0 = absolute x value (horizontal) 677 678byte 3: 679 680 bit 7 6 5 4 3 2 1 0 681 id2 id1 id0 1 0 0 0 1 682 683 id2..id0 = finger id 684 685byte 4: 686 687 bit 7 6 5 4 3 2 1 0 688 p3 p1 p2 p0 y11 y10 y9 y8 689 690 p7..p0 = pressure 691 692byte 5: 693 694 bit 7 6 5 4 3 2 1 0 695 y7 y6 y5 y4 y3 y2 y1 y0 696 697 y11..y0 = absolute y value (vertical) 698 6997.2.3 Motion packet 700 ~~~~~~~~~~~~~ 701 702byte 0: 703 704 bit 7 6 5 4 3 2 1 0 705 id2 id1 id0 w 0 1 R L 706 707 L, R = 1 when Left, Right mouse button pressed 708 id2..id0 = finger id 709 w = 1 when delta overflows (> 127 or < -128), in this case 710 firmware sends us (delta x / 5) and (delta y / 5) 711 712byte 1: 713 714 bit 7 6 5 4 3 2 1 0 715 x7 x6 x5 x4 x3 x2 x1 x0 716 717 x7..x0 = delta x (two's complement) 718 719byte 2: 720 721 bit 7 6 5 4 3 2 1 0 722 y7 y6 y5 y4 y3 y2 y1 y0 723 724 y7..y0 = delta y (two's complement) 725 726byte 3: 727 728 bit 7 6 5 4 3 2 1 0 729 id2 id1 id0 1 0 0 1 0 730 731 id2..id0 = finger id 732 733byte 4: 734 735 bit 7 6 5 4 3 2 1 0 736 x7 x6 x5 x4 x3 x2 x1 x0 737 738 x7..x0 = delta x (two's complement) 739 740byte 5: 741 742 bit 7 6 5 4 3 2 1 0 743 y7 y6 y5 y4 y3 y2 y1 y0 744 745 y7..y0 = delta y (two's complement) 746 747 byte 0 ~ 2 for one finger 748 byte 3 ~ 5 for another