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
41 Currently the Linux Elantech touchpad driver is aware of two different
42 hardware versions unimaginatively called version 1 and version 2. Version 1
43 is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to
44 be introduced with the EeePC and uses 6 bytes per packet, and provides
45 additional features such as position of two fingers, and width of the touch.
47 The driver tries to support both hardware versions and should be compatible
48 with the Xorg Synaptics touchpad driver and its graphical configuration
51 Additionally the operation of the touchpad can be altered by adjusting the
52 contents of some of its internal registers. These registers are represented
53 by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio?
54 that can be read from and written to.
56 Currently only the registers for hardware version 1 are somewhat understood.
57 Hardware version 2 seems to use some of the same registers but it is not
58 known whether the bits in the registers represent the same thing or might
59 have changed their meaning.
61 On top of that, some register settings have effect only when the touchpad is
62 in relative mode and not in absolute mode. As the Linux Elantech touchpad
63 driver always puts the hardware into absolute mode not all information
64 mentioned below can be used immediately. But because there is no freely
65 available Elantech documentation the information is provided here anyway for
69 /////////////////////////////////////////////////////////////////////////////
75 Currently the Linux Elantech touchpad driver provides two extra knobs under
76 /sys/bus/serio/drivers/psmouse/serio? for the user.
80 Turn different levels of debugging ON or OFF.
82 By echoing "0" to this file all debugging will be turned OFF.
84 Currently a value of "1" will turn on some basic debugging and a value of
85 "2" will turn on packet debugging. For hardware version 1 the default is
86 OFF. For version 2 the default is "1".
88 Turning packet debugging on will make the driver dump every packet
89 received to the syslog before processing it. Be warned that this can
90 generate quite a lot of data!
94 Turns parity checking ON or OFF.
96 By echoing "0" to this file parity checking will be turned OFF. Any
97 non-zero value will turn it ON. For hardware version 1 the default is ON.
98 For version 2 the default it is OFF.
100 Hardware version 1 provides basic data integrity verification by
101 calculating a parity bit for the last 3 bytes of each packet. The driver
102 can check these bits and reject any packet that appears corrupted. Using
103 this knob you can bypass that check.
105 Hardware version 2 does not provide the same parity bits. Only some basic
106 data consistency checking can be done. For now checking is disabled by
107 default. Currently even turning it on will do nothing.
109 /////////////////////////////////////////////////////////////////////////////
111 3. Differentiating hardware versions
112 =================================
114 To detect the hardware version, read the version number as param[0].param[1].param[2]
116 4 bytes version: (after the arrow is the name given in the Dell-provided driver)
119 In the wild, there appear to be more versions, such as 00.01.64, 01.00.21,
120 02.00.00, 02.00.04, 02.00.06.
127 04.01.XX => Scroll_EF051
129 In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There
130 appears to be almost no difference, except for EF113, which does not report
131 pressure/width and has different data consistency checks.
133 Probably all the versions with param[0] <= 01 can be considered as
134 4 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as
135 4 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes.
137 /////////////////////////////////////////////////////////////////////////////
139 4. Hardware version 1
145 By echoing a hexadecimal value to a register it contents can be altered.
149 echo -n 0x16 > reg_10
156 E: 1 = enable smart edges unconditionally
157 S: 1 = enable smart edges only when dragging
158 A: 1 = absolute mode (needs 4 byte packets, see reg_11)
159 L: 1 = enable drag lock (see reg_22)
160 D: 1 = disable dynamic resolution
161 T: 1 = disable tapping
162 C: 1 = enable corner tap
163 B: 1 = swap left and right button
170 P: 1 = enable parity checking for relative mode
171 F: 1 = enable native 4 byte packet mode
172 V: 1 = enable vertical scroll area
173 H: 1 = enable horizontal scroll area
181 scroll area width (small: 0x40 ... wide: 0xff)
185 drag lock time out (short: 0x14 ... long: 0xfe;
186 0xff = tap again to release)
198 smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast)
202 smart edge activation area width?
205 4.2 Native relative mode 4 byte packet format
206 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212 L, R, M = 1 when Left, Right, Middle mouse button pressed
213 some models have M as byte 3 odd parity bit
214 when parity checking is enabled (reg_11, P = 1):
215 p1..p2 = byte 1 and 2 odd parity bit
216 c = 1 when corner tap detected
220 dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
222 dx7..dx0 = x movement; positive = right, negative = left
223 byte 1 = 0xf0 when corner tap detected
227 dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
229 dy7..dy0 = y movement; positive = up, negative = down
232 parity checking enabled (reg_11, P = 1):
235 w h n1 n0 ds3 ds2 ds1 ds0
238 ds3..ds0 = scroll wheel amount and direction
239 positive = down or left
240 negative = up or right
241 when corner tap detected:
242 ds0 = 1 when top right corner tapped
243 ds1 = 1 when bottom right corner tapped
244 ds2 = 1 when bottom left corner tapped
245 ds3 = 1 when top left corner tapped
246 n1..n0 = number of fingers on touchpad
247 only models with firmware 2.x report this, models with
248 firmware 1.x seem to map one, two and three finger taps
249 directly to L, M and R mouse buttons
250 h = 1 when horizontal scroll action
251 w = 1 when wide finger touch?
253 otherwise (reg_11, P = 0):
256 ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0
258 ds7..ds0 = vertical scroll amount and direction
263 4.3 Native absolute mode 4 byte packet format
264 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
266 EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and
267 when 1 finger is touching, the first 2 position reports must be discarded.
268 This counting is reset whenever a different number of fingers is reported.
271 firmware version 1.x:
276 L, R = 1 when Left, Right mouse button pressed
277 p1..p3 = byte 1..3 odd parity bit
278 D, U = 1 when rocker switch pressed Up, Down
280 firmware version 2.x:
285 L, R = 1 when Left, Right mouse button pressed
286 p1..p3 = byte 1..3 odd parity bit
287 n1..n0 = number of fingers on touchpad
290 firmware version 1.x:
293 f 0 th tw x9 x8 y9 y8
295 tw = 1 when two finger touch
296 th = 1 when three finger touch
297 f = 1 when finger touch
299 firmware version 2.x:
306 x7 x6 x5 x4 x3 x2 x1 x0
308 x9..x0 = absolute x value (horizontal)
312 y7 y6 y5 y4 y3 y2 y1 y0
314 y9..y0 = absolute y value (vertical)
317 /////////////////////////////////////////////////////////////////////////////
320 5. Hardware version 2
327 By echoing a hexadecimal value to a register it contents can be altered.
331 echo -n 0x56 > reg_10
338 D: 1 = enable drag and drop
345 S: 1 = enable vertical scroll
353 drag and drop release time out (short: 0x70 ... long 0x7e;
354 0x7f = never i.e. tap again to release)
357 5.2 Native absolute mode 6 byte packet format
358 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
359 5.2.1 Parity checking and packet re-synchronization
360 There is no parity checking, however some consistency checks can be performed.
362 For instance for EF113:
369 if( (((SA1 & 0x3C) != 0x3C) && ((SA1 & 0xC0) != 0x80)) || // check Byte 1
370 (((SA1 & 0x0C) != 0x0C) && ((SA1 & 0xC0) == 0x80)) || // check Byte 1 (one finger pressed)
371 (((SA1 & 0xC0) != 0x80) && (( A1 & 0xF0) != 0x00)) || // check Byte 2
372 (((SB1 & 0x3E) != 0x38) && ((SA1 & 0xC0) != 0x80)) || // check Byte 4
373 (((SB1 & 0x0E) != 0x08) && ((SA1 & 0xC0) == 0x80)) || // check Byte 4 (one finger pressed)
374 (((SA1 & 0xC0) != 0x80) && (( C1 & 0xF0) != 0x00)) ) // check Byte 5
377 For all the other ones, there are just a few constant bits:
378 if( ((packet[0] & 0x0C) != 0x04) ||
379 ((packet[3] & 0x0f) != 0x02) )
383 In case an error is detected, all the packets are shifted by one (and packet[0] is discarded).
385 5.2.2 One/Three finger touch
393 L, R = 1 when Left, Right mouse button pressed
394 n1..n0 = number of fingers on touchpad
399 p7 p6 p5 p4 x11 x10 x9 x8
404 x7 x6 x5 x4 x3 x2 x1 x0
406 x11..x0 = absolute x value (horizontal)
413 n4 = set if more than 3 fingers (only in 3 fingers mode)
414 vf = a kind of flag ? (only on EF123, 0 when finger is over one
415 of the buttons, 1 otherwise)
416 w3..w0 = width of the finger touch (not EF113)
417 b2 (on EF113 only, 0 otherwise), b2.R.L indicates one button pressed:
421 3 = Middle (Left and Right)
430 p3 p1 p2 p0 y11 y10 y9 y8
432 p7..p0 = pressure (not EF113)
437 y7 y6 y5 y4 y3 y2 y1 y0
439 y11..y0 = absolute y value (vertical)
442 5.2.3 Two finger touch
445 Note that the two pairs of coordinates are not exactly the coordinates of the
446 two fingers, but only the pair of the lower-left and upper-right coordinates.
447 So the actual fingers might be situated on the other diagonal of the square
448 defined by these two points.
453 n1 n0 ay8 ax8 . . R L
455 L, R = 1 when Left, Right mouse button pressed
456 n1..n0 = number of fingers on touchpad
461 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
463 ax8..ax0 = lower-left finger absolute x value
468 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0
470 ay8..ay0 = lower-left finger absolute y value
480 bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0
482 bx8..bx0 = upper-right finger absolute x value
487 by7 by8 by5 by4 by3 by2 by1 by0
489 by8..by0 = upper-right finger absolute y value
491 /////////////////////////////////////////////////////////////////////////////
493 6. Hardware version 3
503 A: 1 = enable absolute tracking
505 6.2 Native absolute mode 6 byte packet format
506 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
507 1 and 3 finger touch shares the same 6-byte packet format, except that
508 3 finger touch only reports the position of the center of all three fingers.
510 Firmware would send 12 bytes of data for 2 finger touch.
513 In case the box has unstable power supply or other electricity issues, or
514 when number of finger changes, F/W would send "debounce packet" to inform
515 driver that the hardware is in debounce status.
516 The debouce packet has the following signature:
523 When we encounter this kind of packet, we just ignore it.
525 6.2.1 One/Three finger touch
526 ~~~~~~~~~~~~~~~~~~~~~~
533 L, R = 1 when Left, Right mouse button pressed
534 n1..n0 = number of fingers on touchpad
539 p7 p6 p5 p4 x11 x10 x9 x8
544 x7 x6 x5 x4 x3 x2 x1 x0
546 x11..x0 = absolute x value (horizontal)
553 w3..w0 = width of the finger touch
558 p3 p1 p2 p0 y11 y10 y9 y8
565 y7 y6 y5 y4 y3 y2 y1 y0
567 y11..y0 = absolute y value (vertical)
569 6.2.2 Two finger touch
572 The packet format is exactly the same for two finger touch, except the hardware
573 sends two 6 byte packets. The first packet contains data for the first finger,
574 the second packet has data for the second finger. So for two finger touch a
575 total of 12 bytes are sent.