1 Elantech Touchpad Driver
2 ========================
4 Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
6 Extra information for hardware version 1 found and
7 provided by Steve Havelka
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
19 3. Differentiating hardware versions
22 4.2 Native relative mode 4 byte packet format
23 4.3 Native absolute mode 4 byte packet format
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
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
37 7.2 Native absolute mode 6 byte packet format
47 Currently the Linux Elantech touchpad driver is aware of two different
48 hardware versions unimaginatively called version 1 and version 2. Version 1
49 is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to
50 be introduced with the EeePC and uses 6 bytes per packet, and provides
51 additional features such as position of two fingers, and width of the touch.
53 The driver tries to support both hardware versions and should be compatible
54 with the Xorg Synaptics touchpad driver and its graphical configuration
57 Additionally the operation of the touchpad can be altered by adjusting the
58 contents of some of its internal registers. These registers are represented
59 by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio?
60 that can be read from and written to.
62 Currently only the registers for hardware version 1 are somewhat understood.
63 Hardware version 2 seems to use some of the same registers but it is not
64 known whether the bits in the registers represent the same thing or might
65 have changed their meaning.
67 On top of that, some register settings have effect only when the touchpad is
68 in relative mode and not in absolute mode. As the Linux Elantech touchpad
69 driver always puts the hardware into absolute mode not all information
70 mentioned below can be used immediately. But because there is no freely
71 available Elantech documentation the information is provided here anyway for
75 /////////////////////////////////////////////////////////////////////////////
81 Currently the Linux Elantech touchpad driver provides two extra knobs under
82 /sys/bus/serio/drivers/psmouse/serio? for the user.
86 Turn different levels of debugging ON or OFF.
88 By echoing "0" to this file all debugging will be turned OFF.
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".
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!
100 Turns parity checking ON or OFF.
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.
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.
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.
115 /////////////////////////////////////////////////////////////////////////////
117 3. Differentiating hardware versions
118 =================================
120 To detect the hardware version, read the version number as param[0].param[1].param[2]
122 4 bytes version: (after the arrow is the name given in the Dell-provided driver)
125 In the wild, there appear to be more versions, such as 00.01.64, 01.00.21,
126 02.00.00, 02.00.04, 02.00.06.
133 04.01.XX => Scroll_EF051
135 In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There
136 appears to be almost no difference, except for EF113, which does not report
137 pressure/width and has different data consistency checks.
139 Probably all the versions with param[0] <= 01 can be considered as
140 4 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as
141 4 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes.
143 /////////////////////////////////////////////////////////////////////////////
145 4. Hardware version 1
151 By echoing a hexadecimal value to a register it contents can be altered.
155 echo -n 0x16 > reg_10
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
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
187 scroll area width (small: 0x40 ... wide: 0xff)
191 drag lock time out (short: 0x14 ... long: 0xfe;
192 0xff = tap again to release)
204 smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast)
208 smart edge activation area width?
211 4.2 Native relative mode 4 byte packet format
212 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
226 dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
228 dx7..dx0 = x movement; positive = right, negative = left
229 byte 1 = 0xf0 when corner tap detected
233 dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
235 dy7..dy0 = y movement; positive = up, negative = down
238 parity checking enabled (reg_11, P = 1):
241 w h n1 n0 ds3 ds2 ds1 ds0
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?
259 otherwise (reg_11, P = 0):
262 ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0
264 ds7..ds0 = vertical scroll amount and direction
269 4.3 Native absolute mode 4 byte packet format
270 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
272 EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and
273 when 1 finger is touching, the first 2 position reports must be discarded.
274 This counting is reset whenever a different number of fingers is reported.
277 firmware version 1.x:
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
286 firmware version 2.x:
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
296 firmware version 1.x:
299 f 0 th tw x9 x8 y9 y8
301 tw = 1 when two finger touch
302 th = 1 when three finger touch
303 f = 1 when finger touch
305 firmware version 2.x:
312 x7 x6 x5 x4 x3 x2 x1 x0
314 x9..x0 = absolute x value (horizontal)
318 y7 y6 y5 y4 y3 y2 y1 y0
320 y9..y0 = absolute y value (vertical)
323 /////////////////////////////////////////////////////////////////////////////
326 5. Hardware version 2
333 By echoing a hexadecimal value to a register it contents can be altered.
337 echo -n 0x56 > reg_10
344 D: 1 = enable drag and drop
351 S: 1 = enable vertical scroll
359 drag and drop release time out (short: 0x70 ... long 0x7e;
360 0x7f = never i.e. tap again to release)
363 5.2 Native absolute mode 6 byte packet format
364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
365 5.2.1 Parity checking and packet re-synchronization
366 There is no parity checking, however some consistency checks can be performed.
368 For instance for EF113:
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
383 For all the other ones, there are just a few constant bits:
384 if( ((packet[0] & 0x0C) != 0x04) ||
385 ((packet[3] & 0x0f) != 0x02) )
389 In case an error is detected, all the packets are shifted by one (and packet[0] is discarded).
391 5.2.2 One/Three finger touch
399 L, R = 1 when Left, Right mouse button pressed
400 n1..n0 = number of fingers on touchpad
405 p7 p6 p5 p4 x11 x10 x9 x8
410 x7 x6 x5 x4 x3 x2 x1 x0
412 x11..x0 = absolute x value (horizontal)
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:
427 3 = Middle (Left and Right)
436 p3 p1 p2 p0 y11 y10 y9 y8
438 p7..p0 = pressure (not EF113)
443 y7 y6 y5 y4 y3 y2 y1 y0
445 y11..y0 = absolute y value (vertical)
448 5.2.3 Two finger touch
451 Note that the two pairs of coordinates are not exactly the coordinates of the
452 two fingers, but only the pair of the lower-left and upper-right coordinates.
453 So the actual fingers might be situated on the other diagonal of the square
454 defined by these two points.
459 n1 n0 ay8 ax8 . . R L
461 L, R = 1 when Left, Right mouse button pressed
462 n1..n0 = number of fingers on touchpad
467 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
469 ax8..ax0 = lower-left finger absolute x value
474 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0
476 ay8..ay0 = lower-left finger absolute y value
486 bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0
488 bx8..bx0 = upper-right finger absolute x value
493 by7 by8 by5 by4 by3 by2 by1 by0
495 by8..by0 = upper-right finger absolute y value
497 /////////////////////////////////////////////////////////////////////////////
499 6. Hardware version 3
509 A: 1 = enable absolute tracking
511 6.2 Native absolute mode 6 byte packet format
512 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
513 1 and 3 finger touch shares the same 6-byte packet format, except that
514 3 finger touch only reports the position of the center of all three fingers.
516 Firmware would send 12 bytes of data for 2 finger touch.
519 In case the box has unstable power supply or other electricity issues, or
520 when number of finger changes, F/W would send "debounce packet" to inform
521 driver that the hardware is in debounce status.
522 The debouce packet has the following signature:
529 When we encounter this kind of packet, we just ignore it.
531 6.2.1 One/Three finger touch
532 ~~~~~~~~~~~~~~~~~~~~~~
539 L, R = 1 when Left, Right mouse button pressed
540 n1..n0 = number of fingers on touchpad
545 p7 p6 p5 p4 x11 x10 x9 x8
550 x7 x6 x5 x4 x3 x2 x1 x0
552 x11..x0 = absolute x value (horizontal)
559 w3..w0 = width of the finger touch
564 p3 p1 p2 p0 y11 y10 y9 y8
571 y7 y6 y5 y4 y3 y2 y1 y0
573 y11..y0 = absolute y value (vertical)
575 6.2.2 Two finger touch
578 The packet format is exactly the same for two finger touch, except the hardware
579 sends two 6 byte packets. The first packet contains data for the first finger,
580 the second packet has data for the second finger. So for two finger touch a
581 total of 12 bytes are sent.
583 /////////////////////////////////////////////////////////////////////////////
585 7. Hardware version 4
595 A: 1 = enable absolute tracking
597 7.2 Native absolute mode 6 byte packet format
598 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
599 v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers.
600 Unfortunately, due to PS/2's limited bandwidth, its packet format is rather
603 Whenever the numbers or identities of the fingers changes, the hardware sends a
604 status packet to indicate how many and which fingers is on touchpad, followed by
605 head packets or motion packets. A head packet contains data of finger id, finger
606 position (absolute x, y values), width, and pressure. A motion packet contains
607 two fingers' position delta.
609 For example, when status packet tells there are 2 fingers on touchpad, then we
610 can expect two following head packets. If the finger status doesn't change,
611 the following packets would be motion packets, only sending delta of finger
612 position, until we receive a status packet.
614 One exception is one finger touch. when a status packet tells us there is only
615 one finger, the hardware would just send head packets afterwards.
625 L, R = 1 when Left, Right mouse button pressed
630 . . . ft4 ft3 ft2 ft1 ft0
632 ft4 ft3 ft2 ft1 ft0 ftn = 1 when finger n is on touchpad
660 L, R = 1 when Left, Right mouse button pressed
661 w3..w0 = finger width (spans how many trace lines)
666 p7 p6 p5 p4 x11 x10 x9 x8
671 x7 x6 x5 x4 x3 x2 x1 x0
673 x11..x0 = absolute x value (horizontal)
678 id2 id1 id0 1 0 0 0 1
685 p3 p1 p2 p0 y11 y10 y9 y8
692 y7 y6 y5 y4 y3 y2 y1 y0
694 y11..y0 = absolute y value (vertical)
702 id2 id1 id0 w 0 1 R L
704 L, R = 1 when Left, Right mouse button pressed
706 w = 1 when delta overflows (> 127 or < -128), in this case
707 firmware sends us (delta x / 5) and (delta y / 5)
712 x7 x6 x5 x4 x3 x2 x1 x0
714 x7..x0 = delta x (two's complement)
719 y7 y6 y5 y4 y3 y2 y1 y0
721 y7..y0 = delta y (two's complement)
726 id2 id1 id0 1 0 0 1 0
733 x7 x6 x5 x4 x3 x2 x1 x0
735 x7..x0 = delta x (two's complement)
740 y7 y6 y5 y4 y3 y2 y1 y0
742 y7..y0 = delta y (two's complement)
744 byte 0 ~ 2 for one finger
745 byte 3 ~ 5 for another