1 Elantech Touchpad Driver 2 ======================== 3 4 Copyright (C) 2007-2008 Arjan Opmeer <a 5 6 Extra information for hardware version 7 provided by Steve Havelka 8 9 Version 2 (EeePC) hardware support bas 10 received from Woody at Xandros and for 11 by user StewieGriffin at the eeeuser.c 12 13 .. Contents 14 15 1. Introduction 16 2. Extra knobs 17 3. Differentiating hardware versions 18 4. Hardware version 1 19 4.1 Registers 20 4.2 Native relative mode 4 byte packet for 21 4.3 Native absolute mode 4 byte packet for 22 5. Hardware version 2 23 5.1 Registers 24 5.2 Native absolute mode 6 byte packet for 25 5.2.1 Parity checking and packet re-sy 26 5.2.2 One/Three finger touch 27 5.2.3 Two finger touch 28 6. Hardware version 3 29 6.1 Registers 30 6.2 Native absolute mode 6 byte packet for 31 6.2.1 One/Three finger touch 32 6.2.2 Two finger touch 33 7. Hardware version 4 34 7.1 Registers 35 7.2 Native absolute mode 6 byte packet for 36 7.2.1 Status packet 37 7.2.2 Head packet 38 7.2.3 Motion packet 39 8. Trackpoint (for Hardware version 3 and 4) 40 8.1 Registers 41 8.2 Native relative mode 6 byte packet for 42 8.2.1 Status Packet 43 44 45 46 Introduction 47 ~~~~~~~~~~~~ 48 49 Currently the Linux Elantech touchpad driver i 50 hardware versions unimaginatively called versi 51 and version 4. Version 1 is found in "older" l 52 packet. Version 2 seems to be introduced with 53 per packet, and provides additional features s 54 and width of the touch. Hardware version 3 us 55 for 2 fingers the concatenation of two 6 bytes 56 of up to 3 fingers. Hardware version 4 uses 6 57 combine a status packet with multiple head or 58 4 allows tracking up to 5 fingers. 59 60 Some Hardware version 3 and version 4 also hav 61 separate packet format. It is also 6 bytes per 62 63 The driver tries to support both hardware vers 64 with the Xorg Synaptics touchpad driver and it 65 utilities. 66 67 Note that a mouse button is also associated wi 68 trackpoint when a trackpoint is available. Di 69 (TouchPadOff=0) will also disable the buttons 70 71 Additionally the operation of the touchpad can 72 contents of some of its internal registers. Th 73 by the driver as sysfs entries under /sys/bus/ 74 that can be read from and written to. 75 76 Currently only the registers for hardware vers 77 Hardware version 2 seems to use some of the sa 78 known whether the bits in the registers repres 79 have changed their meaning. 80 81 On top of that, some register settings have ef 82 in relative mode and not in absolute mode. As 83 driver always puts the hardware into absolute 84 mentioned below can be used immediately. But b 85 available Elantech documentation the informati 86 completeness sake. 87 88 89 Extra knobs 90 ~~~~~~~~~~~ 91 92 Currently the Linux Elantech touchpad driver p 93 /sys/bus/serio/drivers/psmouse/serio? for the 94 95 * debug 96 97 Turn different levels of debugging ON or OF 98 99 By echoing "0" to this file all debugging w 100 101 Currently a value of "1" will turn on some 102 "2" will turn on packet debugging. For hard 103 OFF. For version 2 the default is "1". 104 105 Turning packet debugging on will make the d 106 received to the syslog before processing it 107 generate quite a lot of data! 108 109 * paritycheck 110 111 Turns parity checking ON or OFF. 112 113 By echoing "0" to this file parity checking 114 non-zero value will turn it ON. For hardwar 115 For version 2 the default it is OFF. 116 117 Hardware version 1 provides basic data inte 118 calculating a parity bit for the last 3 byt 119 can check these bits and reject any packet 120 this knob you can bypass that check. 121 122 Hardware version 2 does not provide the sam 123 data consistency checking can be done. For 124 default. Currently even turning it on will 125 126 * crc_enabled 127 128 Sets crc_enabled to 0/1. The name "crc_enab 129 this integrity check, even though it is not 130 check. 131 132 Depending on the state of crc_enabled, cert 133 verification is done by the driver on hardw 134 driver will reject any packet that appears 135 The state of crc_enabled can be altered wit 136 137 Reading the crc_enabled value will show the 138 "0" or "1" to this file will set the state 139 140 Differentiating hardware versions 141 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 142 143 To detect the hardware version, read the versi 144 145 4 bytes version: (after the arrow is the name 146 02.00.22 => EF013 147 02.06.00 => EF019 148 149 In the wild, there appear to be more versions, 150 02.00.00, 02.00.04, 02.00.06:: 151 152 6 bytes: 153 02.00.30 => EF113 154 02.08.00 => EF023 155 02.08.XX => EF123 156 02.0B.00 => EF215 157 04.01.XX => Scroll_EF051 158 04.02.XX => EF051 159 160 In the wild, there appear to be more versions, 161 appears to be almost no difference, except for 162 pressure/width and has different data consiste 163 164 Probably all the versions with param[0] <= 01 165 4 bytes/firmware 1. The versions < 02.08.00, w 166 4 bytes/firmware 2. Everything >= 02.08.00 can 167 168 169 Hardware version 1 170 ~~~~~~~~~~~~~~~~~~ 171 172 Registers 173 --------- 174 175 By echoing a hexadecimal value to a register i 176 177 For example:: 178 179 echo -n 0x16 > reg_10 180 181 * reg_10:: 182 183 bit 7 6 5 4 3 2 1 0 184 B C T D L A S E 185 186 E: 1 = enable smart edges uncondition 187 S: 1 = enable smart edges only when d 188 A: 1 = absolute mode (needs 4 byte pa 189 L: 1 = enable drag lock (see reg_22) 190 D: 1 = disable dynamic resolution 191 T: 1 = disable tapping 192 C: 1 = enable corner tap 193 B: 1 = swap left and right button 194 195 * reg_11:: 196 197 bit 7 6 5 4 3 2 1 0 198 1 0 0 H V 1 F P 199 200 P: 1 = enable parity checking for rel 201 F: 1 = enable native 4 byte packet mo 202 V: 1 = enable vertical scroll area 203 H: 1 = enable horizontal scroll area 204 205 * reg_20:: 206 207 single finger width? 208 209 * reg_21:: 210 211 scroll area width (small: 0x40 ... wi 212 213 * reg_22:: 214 215 drag lock time out (short: 0x14 ... l 216 0xff = tap again 217 218 * reg_23:: 219 220 tap make timeout? 221 222 * reg_24:: 223 224 tap release timeout? 225 226 * reg_25:: 227 228 smart edge cursor speed (0x02 = slow, 229 230 * reg_26:: 231 232 smart edge activation area width? 233 234 235 Native relative mode 4 byte packet format 236 ----------------------------------------- 237 238 byte 0:: 239 240 bit 7 6 5 4 3 2 1 0 241 c c p2 p1 1 M R L 242 243 L, R, M = 1 when Left, Right, Middle 244 some models have M as byte 3 odd p 245 when parity checking is enabled (reg_ 246 p1..p2 = byte 1 and 2 odd parity b 247 c = 1 when corner tap detected 248 249 byte 1:: 250 251 bit 7 6 5 4 3 2 1 0 252 dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0 253 254 dx7..dx0 = x movement; positive = r 255 byte 1 = 0xf0 when corner tap detecte 256 257 byte 2:: 258 259 bit 7 6 5 4 3 2 1 0 260 dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0 261 262 dy7..dy0 = y movement; positive = u 263 264 byte 3:: 265 266 parity checking enabled (reg_11, P = 1): 267 268 bit 7 6 5 4 3 2 1 0 269 w h n1 n0 ds3 ds2 ds1 ds0 270 271 normally: 272 ds3..ds0 = scroll wheel amount 273 positive = down or l 274 negative = up or rig 275 when corner tap detected: 276 ds0 = 1 when top right corner t 277 ds1 = 1 when bottom right corne 278 ds2 = 1 when bottom left corner 279 ds3 = 1 when top left corner ta 280 n1..n0 = number of fingers on touc 281 only models with firmware 2.x r 282 firmware 1.x seem to map one, t 283 directly to L, M and R mouse bu 284 h = 1 when horizontal scroll actio 285 w = 1 when wide finger touch? 286 287 otherwise (reg_11, P = 0): 288 289 bit 7 6 5 4 3 2 1 0 290 ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0 291 292 ds7..ds0 = vertical scroll amount 293 negative = up 294 positive = down 295 296 297 Native absolute mode 4 byte packet format 298 ----------------------------------------- 299 300 EF013 and EF019 have a special behaviour (due 301 when 1 finger is touching, the first 2 positio 302 This counting is reset whenever a different nu 303 304 byte 0:: 305 306 firmware version 1.x: 307 308 bit 7 6 5 4 3 2 1 0 309 D U p1 p2 1 p3 R L 310 311 L, R = 1 when Left, Right mouse bu 312 p1..p3 = byte 1..3 odd parity bit 313 D, U = 1 when rocker switch presse 314 315 firmware version 2.x: 316 317 bit 7 6 5 4 3 2 1 0 318 n1 n0 p2 p1 1 p3 R L 319 320 L, R = 1 when Left, Right mouse bu 321 p1..p3 = byte 1..3 odd parity bit 322 n1..n0 = number of fingers on touc 323 324 byte 1:: 325 326 firmware version 1.x: 327 328 bit 7 6 5 4 3 2 1 0 329 f 0 th tw x9 x8 y9 y8 330 331 tw = 1 when two finger touch 332 th = 1 when three finger touch 333 f = 1 when finger touch 334 335 firmware version 2.x: 336 337 bit 7 6 5 4 3 2 1 0 338 . . . . x9 x8 y9 y8 339 340 byte 2:: 341 342 bit 7 6 5 4 3 2 1 0 343 x7 x6 x5 x4 x3 x2 x1 x0 344 345 x9..x0 = absolute x value (horizontal 346 347 byte 3:: 348 349 bit 7 6 5 4 3 2 1 0 350 y7 y6 y5 y4 y3 y2 y1 y0 351 352 y9..y0 = absolute y value (vertical) 353 354 355 Hardware version 2 356 ~~~~~~~~~~~~~~~~~~ 357 358 359 Registers 360 --------- 361 362 By echoing a hexadecimal value to a register i 363 364 For example:: 365 366 echo -n 0x56 > reg_10 367 368 * reg_10:: 369 370 bit 7 6 5 4 3 2 1 0 371 0 1 0 1 0 1 D 0 372 373 D: 1 = enable drag and drop 374 375 * reg_11:: 376 377 bit 7 6 5 4 3 2 1 0 378 1 0 0 0 S 0 1 0 379 380 S: 1 = enable vertical scroll 381 382 * reg_21:: 383 384 unknown (0x00) 385 386 * reg_22:: 387 388 drag and drop release time out (short 389 0x7f = neve 390 391 392 Native absolute mode 6 byte packet format 393 ----------------------------------------- 394 395 Parity checking and packet re-synchronization 396 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 397 398 There is no parity checking, however some cons 399 400 For instance for EF113:: 401 402 SA1= packet[0]; 403 A1 = packet[1]; 404 B1 = packet[2]; 405 SB1= packet[3]; 406 C1 = packet[4]; 407 D1 = packet[5]; 408 if( (((SA1 & 0x3C) != 0x3C) && ((SA1 & 409 (((SA1 & 0x0C) != 0x0C) && ((SA1 & 410 (((SA1 & 0xC0) != 0x80) && (( A1 & 411 (((SB1 & 0x3E) != 0x38) && ((SA1 & 412 (((SB1 & 0x0E) != 0x08) && ((SA1 & 413 (((SA1 & 0xC0) != 0x80) && (( C1 & 414 // error detected 415 416 For all the other ones, there are just a few c 417 418 if( ((packet[0] & 0x0C) != 0x04) || 419 ((packet[3] & 0x0f) != 0x02) ) 420 // error detected 421 422 423 In case an error is detected, all the packets 424 425 One/Three finger touch 426 ^^^^^^^^^^^^^^^^^^^^^^ 427 428 byte 0:: 429 430 bit 7 6 5 4 3 2 1 0 431 n1 n0 w3 w2 . . R L 432 433 L, R = 1 when Left, Right mouse butto 434 n1..n0 = number of fingers on touchpa 435 436 byte 1:: 437 438 bit 7 6 5 4 3 2 1 0 439 p7 p6 p5 p4 x11 x10 x9 x8 440 441 byte 2:: 442 443 bit 7 6 5 4 3 2 1 0 444 x7 x6 x5 x4 x3 x2 x1 x0 445 446 x11..x0 = absolute x value (horizonta 447 448 byte 3:: 449 450 bit 7 6 5 4 3 2 1 0 451 n4 vf w1 w0 . . . b2 452 453 n4 = set if more than 3 fingers (only 454 vf = a kind of flag ? (only on EF123, 455 of the buttons, 1 otherwise) 456 w3..w0 = width of the finger touch (n 457 b2 (on EF113 only, 0 otherwise), b2.R 458 0 = none 459 1 = Left 460 2 = Right 461 3 = Middle (Left and Right) 462 4 = Forward 463 5 = Back 464 6 = Another one 465 7 = Another one 466 467 byte 4:: 468 469 bit 7 6 5 4 3 2 1 0 470 p3 p1 p2 p0 y11 y10 y9 y8 471 472 p7..p0 = pressure (not EF113) 473 474 byte 5:: 475 476 bit 7 6 5 4 3 2 1 0 477 y7 y6 y5 y4 y3 y2 y1 y0 478 479 y11..y0 = absolute y value (vertical) 480 481 482 Two finger touch 483 ^^^^^^^^^^^^^^^^ 484 485 Note that the two pairs of coordinates are not 486 two fingers, but only the pair of the lower-le 487 So the actual fingers might be situated on the 488 defined by these two points. 489 490 byte 0:: 491 492 bit 7 6 5 4 3 2 1 0 493 n1 n0 ay8 ax8 . . R L 494 495 L, R = 1 when Left, Right mouse butto 496 n1..n0 = number of fingers on touchpa 497 498 byte 1:: 499 500 bit 7 6 5 4 3 2 1 0 501 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 502 503 ax8..ax0 = lower-left finger absolute 504 505 byte 2:: 506 507 bit 7 6 5 4 3 2 1 0 508 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 509 510 ay8..ay0 = lower-left finger absolute 511 512 byte 3:: 513 514 bit 7 6 5 4 3 2 1 0 515 . . by8 bx8 . . . . 516 517 byte 4:: 518 519 bit 7 6 5 4 3 2 1 0 520 bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 521 522 bx8..bx0 = upper-right finger absolut 523 524 byte 5:: 525 526 bit 7 6 5 4 3 2 1 0 527 by7 by8 by5 by4 by3 by2 by1 by0 528 529 by8..by0 = upper-right finger absolut 530 531 Hardware version 3 532 ~~~~~~~~~~~~~~~~~~ 533 534 Registers 535 --------- 536 537 * reg_10:: 538 539 bit 7 6 5 4 3 2 1 0 540 0 0 0 0 R F T A 541 542 A: 1 = enable absolute tracking 543 T: 1 = enable two finger mode auto co 544 F: 1 = disable ABS Position Filter 545 R: 1 = enable real hardware resolutio 546 547 Native absolute mode 6 byte packet format 548 ----------------------------------------- 549 550 1 and 3 finger touch shares the same 6-byte pa 551 3 finger touch only reports the position of th 552 553 Firmware would send 12 bytes of data for 2 fin 554 555 Note on debounce: 556 In case the box has unstable power supply or o 557 when number of finger changes, F/W would send 558 driver that the hardware is in debounce status 559 The debouce packet has the following signature 560 561 byte 0: 0xc4 562 byte 1: 0xff 563 byte 2: 0xff 564 byte 3: 0x02 565 byte 4: 0xff 566 byte 5: 0xff 567 568 When we encounter this kind of packet, we just 569 570 One/Three finger touch 571 ^^^^^^^^^^^^^^^^^^^^^^ 572 573 byte 0:: 574 575 bit 7 6 5 4 3 2 1 0 576 n1 n0 w3 w2 0 1 R L 577 578 L, R = 1 when Left, Right mouse button 579 n1..n0 = number of fingers on touchpad 580 581 byte 1:: 582 583 bit 7 6 5 4 3 2 1 0 584 p7 p6 p5 p4 x11 x10 x9 x8 585 586 byte 2:: 587 588 bit 7 6 5 4 3 2 1 0 589 x7 x6 x5 x4 x3 x2 x1 x0 590 591 x11..x0 = absolute x value (horizontal 592 593 byte 3:: 594 595 bit 7 6 5 4 3 2 1 0 596 0 0 w1 w0 0 0 1 0 597 598 w3..w0 = width of the finger touch 599 600 byte 4:: 601 602 bit 7 6 5 4 3 2 1 0 603 p3 p1 p2 p0 y11 y10 y9 y8 604 605 p7..p0 = pressure 606 607 byte 5:: 608 609 bit 7 6 5 4 3 2 1 0 610 y7 y6 y5 y4 y3 y2 y1 y0 611 612 y11..y0 = absolute y value (vertical) 613 614 Two finger touch 615 ^^^^^^^^^^^^^^^^ 616 617 The packet format is exactly the same for two 618 sends two 6 byte packets. The first packet con 619 the second packet has data for the second fing 620 total of 12 bytes are sent. 621 622 Hardware version 4 623 ~~~~~~~~~~~~~~~~~~ 624 625 Registers 626 --------- 627 628 * reg_07:: 629 630 bit 7 6 5 4 3 2 1 0 631 0 0 0 0 0 0 0 A 632 633 A: 1 = enable absolute tracking 634 635 Native absolute mode 6 byte packet format 636 ----------------------------------------- 637 638 v4 hardware is a true multitouch touchpad, cap 639 Unfortunately, due to PS/2's limited bandwidth 640 complex. 641 642 Whenever the numbers or identities of the fing 643 status packet to indicate how many and which f 644 head packets or motion packets. A head packet 645 position (absolute x, y values), width, and pr 646 two fingers' position delta. 647 648 For example, when status packet tells there ar 649 can expect two following head packets. If the 650 the following packets would be motion packets, 651 position, until we receive a status packet. 652 653 One exception is one finger touch. when a stat 654 one finger, the hardware would just send head 655 656 Status packet 657 ^^^^^^^^^^^^^ 658 659 byte 0:: 660 661 bit 7 6 5 4 3 2 1 0 662 . . . . 0 1 R L 663 664 L, R = 1 when Left, Right mouse butto 665 666 byte 1:: 667 668 bit 7 6 5 4 3 2 1 0 669 . . . ft4 ft3 ft2 ft1 ft0 670 671 ft4 ft3 ft2 ft1 ft0 ftn = 1 when fing 672 673 byte 2:: 674 675 not used 676 677 byte 3:: 678 679 bit 7 6 5 4 3 2 1 0 680 . . . 1 0 0 0 0 681 682 constant bits 683 684 byte 4:: 685 686 bit 7 6 5 4 3 2 1 0 687 p . . . . . . . 688 689 p = 1 for palm 690 691 byte 5:: 692 693 not used 694 695 Head packet 696 ^^^^^^^^^^^ 697 698 byte 0:: 699 700 bit 7 6 5 4 3 2 1 0 701 w3 w2 w1 w0 0 1 R L 702 703 L, R = 1 when Left, Right mouse button 704 w3..w0 = finger width (spans how many 705 706 byte 1:: 707 708 bit 7 6 5 4 3 2 1 0 709 p7 p6 p5 p4 x11 x10 x9 x8 710 711 byte 2:: 712 713 bit 7 6 5 4 3 2 1 0 714 x7 x6 x5 x4 x3 x2 x1 x0 715 716 x11..x0 = absolute x value (horizontal 717 718 byte 3:: 719 720 bit 7 6 5 4 3 2 1 0 721 id2 id1 id0 1 0 0 0 1 722 723 id2..id0 = finger id 724 725 byte 4:: 726 727 bit 7 6 5 4 3 2 1 0 728 p3 p1 p2 p0 y11 y10 y9 y8 729 730 p7..p0 = pressure 731 732 byte 5:: 733 734 bit 7 6 5 4 3 2 1 0 735 y7 y6 y5 y4 y3 y2 y1 y0 736 737 y11..y0 = absolute y value (vertical) 738 739 Motion packet 740 ^^^^^^^^^^^^^ 741 742 byte 0:: 743 744 bit 7 6 5 4 3 2 1 0 745 id2 id1 id0 w 0 1 R L 746 747 L, R = 1 when Left, Right mouse button 748 id2..id0 = finger id 749 w = 1 when delta overflows (> 127 or < 750 firmware sends us (delta x / 5) and (de 751 752 byte 1:: 753 754 bit 7 6 5 4 3 2 1 0 755 x7 x6 x5 x4 x3 x2 x1 x0 756 757 x7..x0 = delta x (two's complement) 758 759 byte 2:: 760 761 bit 7 6 5 4 3 2 1 0 762 y7 y6 y5 y4 y3 y2 y1 y0 763 764 y7..y0 = delta y (two's complement) 765 766 byte 3:: 767 768 bit 7 6 5 4 3 2 1 0 769 id2 id1 id0 1 0 0 1 0 770 771 id2..id0 = finger id 772 773 byte 4:: 774 775 bit 7 6 5 4 3 2 1 0 776 x7 x6 x5 x4 x3 x2 x1 x0 777 778 x7..x0 = delta x (two's complement) 779 780 byte 5:: 781 782 bit 7 6 5 4 3 2 1 0 783 y7 y6 y5 y4 y3 y2 y1 y0 784 785 y7..y0 = delta y (two's complement) 786 787 byte 0 ~ 2 for one finger 788 byte 3 ~ 5 for another 789 790 791 Trackpoint (for Hardware version 3 and 4) 792 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 793 794 Registers 795 --------- 796 797 No special registers have been identified. 798 799 Native relative mode 6 byte packet format 800 ----------------------------------------- 801 802 Status Packet 803 ^^^^^^^^^^^^^ 804 805 byte 0:: 806 807 bit 7 6 5 4 3 2 1 0 808 0 0 sx sy 0 M R L 809 810 byte 1:: 811 812 bit 7 6 5 4 3 2 1 0 813 ~sx 0 0 0 0 0 0 0 814 815 byte 2:: 816 817 bit 7 6 5 4 3 2 1 0 818 ~sy 0 0 0 0 0 0 0 819 820 byte 3:: 821 822 bit 7 6 5 4 3 2 1 0 823 0 0 ~sy ~sx 0 1 1 0 824 825 byte 4:: 826 827 bit 7 6 5 4 3 2 1 0 828 x7 x6 x5 x4 x3 x2 x1 x0 829 830 byte 5:: 831 832 bit 7 6 5 4 3 2 1 0 833 y7 y6 y5 y4 y3 y2 y1 y0 834 835 836 x and y are written in two's compleme 837 over 9 bits with sx/sy the relati 838 x7..x0 and y7..y0 the lower bits. 839 ~sx is the inverse of sx, ~sy is the 840 The sign of y is opposite to what the 841 expects for a relative movement
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.