elantech.rst (22441B)
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.. 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 format 21 4.3 Native absolute mode 4 byte packet format 22 5. Hardware version 2 23 5.1 Registers 24 5.2 Native absolute mode 6 byte packet format 25 5.2.1 Parity checking and packet re-synchronization 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 format 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 format 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 format 42 8.2.1 Status Packet 43 44 45 46Introduction 47~~~~~~~~~~~~ 48 49Currently the Linux Elantech touchpad driver is aware of four different 50hardware versions unimaginatively called version 1,version 2, version 3 51and version 4. Version 1 is found in "older" laptops and uses 4 bytes per 52packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes 53per packet, and provides additional features such as position of two fingers, 54and width of the touch. Hardware version 3 uses 6 bytes per packet (and 55for 2 fingers the concatenation of two 6 bytes packets) and allows tracking 56of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can 57combine a status packet with multiple head or motion packets. Hardware version 584 allows tracking up to 5 fingers. 59 60Some Hardware version 3 and version 4 also have a trackpoint which uses a 61separate packet format. It is also 6 bytes per packet. 62 63The driver tries to support both hardware versions and should be compatible 64with the Xorg Synaptics touchpad driver and its graphical configuration 65utilities. 66 67Note that a mouse button is also associated with either the touchpad or the 68trackpoint when a trackpoint is available. Disabling the Touchpad in xorg 69(TouchPadOff=0) will also disable the buttons associated with the touchpad. 70 71Additionally the operation of the touchpad can be altered by adjusting the 72contents of some of its internal registers. These registers are represented 73by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? 74that can be read from and written to. 75 76Currently only the registers for hardware version 1 are somewhat understood. 77Hardware version 2 seems to use some of the same registers but it is not 78known whether the bits in the registers represent the same thing or might 79have changed their meaning. 80 81On top of that, some register settings have effect only when the touchpad is 82in relative mode and not in absolute mode. As the Linux Elantech touchpad 83driver always puts the hardware into absolute mode not all information 84mentioned below can be used immediately. But because there is no freely 85available Elantech documentation the information is provided here anyway for 86completeness sake. 87 88 89Extra knobs 90~~~~~~~~~~~ 91 92Currently the Linux Elantech touchpad driver provides three extra knobs under 93/sys/bus/serio/drivers/psmouse/serio? for the user. 94 95* debug 96 97 Turn different levels of debugging ON or OFF. 98 99 By echoing "0" to this file all debugging will be turned OFF. 100 101 Currently a value of "1" will turn on some basic debugging and a value of 102 "2" will turn on packet debugging. For hardware version 1 the default is 103 OFF. For version 2 the default is "1". 104 105 Turning packet debugging on will make the driver dump every packet 106 received to the syslog before processing it. Be warned that this can 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 will be turned OFF. Any 114 non-zero value will turn it ON. For hardware version 1 the default is ON. 115 For version 2 the default it is OFF. 116 117 Hardware version 1 provides basic data integrity verification by 118 calculating a parity bit for the last 3 bytes of each packet. The driver 119 can check these bits and reject any packet that appears corrupted. Using 120 this knob you can bypass that check. 121 122 Hardware version 2 does not provide the same parity bits. Only some basic 123 data consistency checking can be done. For now checking is disabled by 124 default. Currently even turning it on will do nothing. 125 126* crc_enabled 127 128 Sets crc_enabled to 0/1. The name "crc_enabled" is the official name of 129 this integrity check, even though it is not an actual cyclic redundancy 130 check. 131 132 Depending on the state of crc_enabled, certain basic data integrity 133 verification is done by the driver on hardware version 3 and 4. The 134 driver will reject any packet that appears corrupted. Using this knob, 135 The state of crc_enabled can be altered with this knob. 136 137 Reading the crc_enabled value will show the active value. Echoing 138 "0" or "1" to this file will set the state to "0" or "1". 139 140Differentiating hardware versions 141~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 142 143To detect the hardware version, read the version number as param[0].param[1].param[2]:: 144 145 4 bytes version: (after the arrow is the name given in the Dell-provided driver) 146 02.00.22 => EF013 147 02.06.00 => EF019 148 149In the wild, there appear to be more versions, such as 00.01.64, 01.00.21, 15002.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 160In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There 161appears to be almost no difference, except for EF113, which does not report 162pressure/width and has different data consistency checks. 163 164Probably all the versions with param[0] <= 01 can be considered as 1654 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as 1664 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes. 167 168 169Hardware version 1 170~~~~~~~~~~~~~~~~~~ 171 172Registers 173--------- 174 175By echoing a hexadecimal value to a register it contents can be altered. 176 177For 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 unconditionally 187 S: 1 = enable smart edges only when dragging 188 A: 1 = absolute mode (needs 4 byte packets, see reg_11) 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 relative mode 201 F: 1 = enable native 4 byte packet mode 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 ... wide: 0xff) 212 213* reg_22:: 214 215 drag lock time out (short: 0x14 ... long: 0xfe; 216 0xff = tap again to release) 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, 0x03 = medium, 0x04 = fast) 229 230* reg_26:: 231 232 smart edge activation area width? 233 234 235Native relative mode 4 byte packet format 236----------------------------------------- 237 238byte 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 mouse button pressed 244 some models have M as byte 3 odd parity bit 245 when parity checking is enabled (reg_11, P = 1): 246 p1..p2 = byte 1 and 2 odd parity bit 247 c = 1 when corner tap detected 248 249byte 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 = right, negative = left 255 byte 1 = 0xf0 when corner tap detected 256 257byte 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 = up, negative = down 263 264byte 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 and direction 273 positive = down or left 274 negative = up or right 275 when corner tap detected: 276 ds0 = 1 when top right corner tapped 277 ds1 = 1 when bottom right corner tapped 278 ds2 = 1 when bottom left corner tapped 279 ds3 = 1 when top left corner tapped 280 n1..n0 = number of fingers on touchpad 281 only models with firmware 2.x report this, models with 282 firmware 1.x seem to map one, two and three finger taps 283 directly to L, M and R mouse buttons 284 h = 1 when horizontal scroll action 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 and direction 293 negative = up 294 positive = down 295 296 297Native absolute mode 4 byte packet format 298----------------------------------------- 299 300EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and 301when 1 finger is touching, the first 2 position reports must be discarded. 302This counting is reset whenever a different number of fingers is reported. 303 304byte 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 button pressed 312 p1..p3 = byte 1..3 odd parity bit 313 D, U = 1 when rocker switch pressed Up, Down 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 button pressed 321 p1..p3 = byte 1..3 odd parity bit 322 n1..n0 = number of fingers on touchpad 323 324byte 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 340byte 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 347byte 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 355Hardware version 2 356~~~~~~~~~~~~~~~~~~ 357 358 359Registers 360--------- 361 362By echoing a hexadecimal value to a register it contents can be altered. 363 364For 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: 0x70 ... long 0x7e; 389 0x7f = never i.e. tap again to release) 390 391 392Native absolute mode 6 byte packet format 393----------------------------------------- 394 395Parity checking and packet re-synchronization 396^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 397 398There is no parity checking, however some consistency checks can be performed. 399 400For 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 & 0xC0) != 0x80)) || // check Byte 1 409 (((SA1 & 0x0C) != 0x0C) && ((SA1 & 0xC0) == 0x80)) || // check Byte 1 (one finger pressed) 410 (((SA1 & 0xC0) != 0x80) && (( A1 & 0xF0) != 0x00)) || // check Byte 2 411 (((SB1 & 0x3E) != 0x38) && ((SA1 & 0xC0) != 0x80)) || // check Byte 4 412 (((SB1 & 0x0E) != 0x08) && ((SA1 & 0xC0) == 0x80)) || // check Byte 4 (one finger pressed) 413 (((SA1 & 0xC0) != 0x80) && (( C1 & 0xF0) != 0x00)) ) // check Byte 5 414 // error detected 415 416For all the other ones, there are just a few constant bits:: 417 418 if( ((packet[0] & 0x0C) != 0x04) || 419 ((packet[3] & 0x0f) != 0x02) ) 420 // error detected 421 422 423In case an error is detected, all the packets are shifted by one (and packet[0] is discarded). 424 425One/Three finger touch 426^^^^^^^^^^^^^^^^^^^^^^ 427 428byte 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 button pressed 434 n1..n0 = number of fingers on touchpad 435 436byte 1:: 437 438 bit 7 6 5 4 3 2 1 0 439 p7 p6 p5 p4 x11 x10 x9 x8 440 441byte 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 (horizontal) 447 448byte 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 in 3 fingers mode) 454 vf = a kind of flag ? (only on EF123, 0 when finger is over one 455 of the buttons, 1 otherwise) 456 w3..w0 = width of the finger touch (not EF113) 457 b2 (on EF113 only, 0 otherwise), b2.R.L indicates one button pressed: 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 467byte 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 474byte 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 482Two finger touch 483^^^^^^^^^^^^^^^^ 484 485Note that the two pairs of coordinates are not exactly the coordinates of the 486two fingers, but only the pair of the lower-left and upper-right coordinates. 487So the actual fingers might be situated on the other diagonal of the square 488defined by these two points. 489 490byte 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 button pressed 496 n1..n0 = number of fingers on touchpad 497 498byte 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 x value 504 505byte 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 y value 511 512byte 3:: 513 514 bit 7 6 5 4 3 2 1 0 515 . . by8 bx8 . . . . 516 517byte 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 absolute x value 523 524byte 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 absolute y value 530 531Hardware version 3 532~~~~~~~~~~~~~~~~~~ 533 534Registers 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 correct 544 F: 1 = disable ABS Position Filter 545 R: 1 = enable real hardware resolution 546 547Native absolute mode 6 byte packet format 548----------------------------------------- 549 5501 and 3 finger touch shares the same 6-byte packet format, except that 5513 finger touch only reports the position of the center of all three fingers. 552 553Firmware would send 12 bytes of data for 2 finger touch. 554 555Note on debounce: 556In case the box has unstable power supply or other electricity issues, or 557when number of finger changes, F/W would send "debounce packet" to inform 558driver that the hardware is in debounce status. 559The 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 568When we encounter this kind of packet, we just ignore it. 569 570One/Three finger touch 571^^^^^^^^^^^^^^^^^^^^^^ 572 573byte 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 pressed 579 n1..n0 = number of fingers on touchpad 580 581byte 1:: 582 583 bit 7 6 5 4 3 2 1 0 584 p7 p6 p5 p4 x11 x10 x9 x8 585 586byte 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 593byte 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 600byte 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 607byte 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 614Two finger touch 615^^^^^^^^^^^^^^^^ 616 617The packet format is exactly the same for two finger touch, except the hardware 618sends two 6 byte packets. The first packet contains data for the first finger, 619the second packet has data for the second finger. So for two finger touch a 620total of 12 bytes are sent. 621 622Hardware version 4 623~~~~~~~~~~~~~~~~~~ 624 625Registers 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 635Native absolute mode 6 byte packet format 636----------------------------------------- 637 638v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers. 639Unfortunately, due to PS/2's limited bandwidth, its packet format is rather 640complex. 641 642Whenever the numbers or identities of the fingers changes, the hardware sends a 643status packet to indicate how many and which fingers is on touchpad, followed by 644head packets or motion packets. A head packet contains data of finger id, finger 645position (absolute x, y values), width, and pressure. A motion packet contains 646two fingers' position delta. 647 648For example, when status packet tells there are 2 fingers on touchpad, then we 649can expect two following head packets. If the finger status doesn't change, 650the following packets would be motion packets, only sending delta of finger 651position, until we receive a status packet. 652 653One exception is one finger touch. when a status packet tells us there is only 654one finger, the hardware would just send head packets afterwards. 655 656Status packet 657^^^^^^^^^^^^^ 658 659byte 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 button pressed 665 666byte 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 finger n is on touchpad 672 673byte 2:: 674 675 not used 676 677byte 3:: 678 679 bit 7 6 5 4 3 2 1 0 680 . . . 1 0 0 0 0 681 682 constant bits 683 684byte 4:: 685 686 bit 7 6 5 4 3 2 1 0 687 p . . . . . . . 688 689 p = 1 for palm 690 691byte 5:: 692 693 not used 694 695Head packet 696^^^^^^^^^^^ 697 698byte 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 pressed 704 w3..w0 = finger width (spans how many trace lines) 705 706byte 1:: 707 708 bit 7 6 5 4 3 2 1 0 709 p7 p6 p5 p4 x11 x10 x9 x8 710 711byte 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 718byte 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 725byte 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 732byte 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 739Motion packet 740^^^^^^^^^^^^^ 741 742byte 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 pressed 748 id2..id0 = finger id 749 w = 1 when delta overflows (> 127 or < -128), in this case 750 firmware sends us (delta x / 5) and (delta y / 5) 751 752byte 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 759byte 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 766byte 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 773byte 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 780byte 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 791Trackpoint (for Hardware version 3 and 4) 792~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 793 794Registers 795--------- 796 797No special registers have been identified. 798 799Native relative mode 6 byte packet format 800----------------------------------------- 801 802Status Packet 803^^^^^^^^^^^^^ 804 805byte 0:: 806 807 bit 7 6 5 4 3 2 1 0 808 0 0 sx sy 0 M R L 809 810byte 1:: 811 812 bit 7 6 5 4 3 2 1 0 813 ~sx 0 0 0 0 0 0 0 814 815byte 2:: 816 817 bit 7 6 5 4 3 2 1 0 818 ~sy 0 0 0 0 0 0 0 819 820byte 3:: 821 822 bit 7 6 5 4 3 2 1 0 823 0 0 ~sy ~sx 0 1 1 0 824 825byte 4:: 826 827 bit 7 6 5 4 3 2 1 0 828 x7 x6 x5 x4 x3 x2 x1 x0 829 830byte 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 complement spread 837 over 9 bits with sx/sy the relative top bit and 838 x7..x0 and y7..y0 the lower bits. 839 ~sx is the inverse of sx, ~sy is the inverse of sy. 840 The sign of y is opposite to what the input driver 841 expects for a relative movement