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   0   0   0   A
508
509         A: 1 = enable absolute tracking
510
5116.2 Native absolute mode 6 byte packet format
512    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5131 and 3 finger touch shares the same 6-byte packet format, except that
5143 finger touch only reports the position of the center of all three fingers.
515
516Firmware would send 12 bytes of data for 2 finger touch.
517
518Note on debounce:
519In case the box has unstable power supply or other electricity issues, or
520when number of finger changes, F/W would send "debounce packet" to inform
521driver that the hardware is in debounce status.
522The debouce packet has the following signature:
523    byte 0: 0xc4
524    byte 1: 0xff
525    byte 2: 0xff
526    byte 3: 0x02
527    byte 4: 0xff
528    byte 5: 0xff
529When we encounter this kind of packet, we just ignore it.
530
5316.2.1 One/Three finger touch
532      ~~~~~~~~~~~~~~~~~~~~~~
533
534byte 0:
535
536   bit   7   6   5   4   3   2   1   0
537        n1  n0  w3  w2   0   1   R   L
538
539        L, R = 1 when Left, Right mouse button pressed
540        n1..n0 = number of fingers on touchpad
541
542byte 1:
543
544   bit   7   6   5   4   3   2   1   0
545        p7  p6  p5  p4 x11 x10  x9  x8
546
547byte 2:
548
549   bit   7   6   5   4   3   2   1   0
550        x7  x6  x5  x4  x3  x2  x1  x0
551
552        x11..x0 = absolute x value (horizontal)
553
554byte 3:
555
556   bit   7   6   5   4   3   2   1   0
557         0   0  w1  w0   0   0   1   0
558
559         w3..w0 = width of the finger touch
560
561byte 4:
562
563   bit   7   6   5   4   3   2   1   0
564        p3  p1  p2  p0  y11 y10 y9  y8
565
566        p7..p0 = pressure
567
568byte 5:
569
570   bit   7   6   5   4   3   2   1   0
571        y7  y6  y5  y4  y3  y2  y1  y0
572
573        y11..y0 = absolute y value (vertical)
574
5756.2.2 Two finger touch
576      ~~~~~~~~~~~~~~~~
577
578The packet format is exactly the same for two finger touch, except the hardware
579sends two 6 byte packets. The first packet contains data for the first finger,
580the second packet has data for the second finger. So for two finger touch a
581total of 12 bytes are sent.
582
583/////////////////////////////////////////////////////////////////////////////
584
5857. Hardware version 4
586   ==================
587
5887.1 Registers
589    ~~~~~~~~~
590* reg_07
591
592   bit   7   6   5   4   3   2   1   0
593         0   0   0   0   0   0   0   A
594
595         A: 1 = enable absolute tracking
596
5977.2 Native absolute mode 6 byte packet format
598    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
599v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers.
600Unfortunately, due to PS/2's limited bandwidth, its packet format is rather
601complex.
602
603Whenever the numbers or identities of the fingers changes, the hardware sends a
604status packet to indicate how many and which fingers is on touchpad, followed by
605head packets or motion packets. A head packet contains data of finger id, finger
606position (absolute x, y values), width, and pressure. A motion packet contains
607two fingers' position delta.
608
609For example, when status packet tells there are 2 fingers on touchpad, then we
610can expect two following head packets. If the finger status doesn't change,
611the following packets would be motion packets, only sending delta of finger
612position, until we receive a status packet.
613
614One exception is one finger touch. when a status packet tells us there is only
615one finger, the hardware would just send head packets afterwards.
616
6177.2.1 Status packet
618      ~~~~~~~~~~~~~
619
620byte 0:
621
622   bit   7   6   5   4   3   2   1   0
623         .   .   .   .   0   1   R   L
624
625         L, R = 1 when Left, Right mouse button pressed
626
627byte 1:
628
629   bit   7   6   5   4   3   2   1   0
630         .   .   . ft4 ft3 ft2 ft1 ft0
631
632         ft4 ft3 ft2 ft1 ft0 ftn = 1 when finger n is on touchpad
633
634byte 2: not used
635
636byte 3:
637
638   bit   7   6   5   4   3   2   1   0
639         .   .   .   1   0   0   0   0
640
641         constant bits
642
643byte 4:
644
645   bit   7   6   5   4   3   2   1   0
646         p   .   .   .   .   .   .   .
647
648         p = 1 for palm
649
650byte 5: not used
651
6527.2.2 Head packet
653      ~~~~~~~~~~~
654
655byte 0:
656
657   bit   7   6   5   4   3   2   1   0
658        w3  w2  w1  w0   0   1   R   L
659
660        L, R = 1 when Left, Right mouse button pressed
661        w3..w0 = finger width (spans how many trace lines)
662
663byte 1:
664
665   bit   7   6   5   4   3   2   1   0
666        p7  p6  p5  p4 x11 x10  x9  x8
667
668byte 2:
669
670   bit   7   6   5   4   3   2   1   0
671        x7  x6  x5  x4  x3  x2  x1  x0
672
673        x11..x0 = absolute x value (horizontal)
674
675byte 3:
676
677   bit   7   6   5   4   3   2   1   0
678       id2 id1 id0   1   0   0   0   1
679
680       id2..id0 = finger id
681
682byte 4:
683
684   bit   7   6   5   4   3   2   1   0
685        p3  p1  p2  p0  y11 y10 y9  y8
686
687        p7..p0 = pressure
688
689byte 5:
690
691   bit   7   6   5   4   3   2   1   0
692        y7  y6  y5  y4  y3  y2  y1  y0
693
694        y11..y0 = absolute y value (vertical)
695
6967.2.3 Motion packet
697      ~~~~~~~~~~~~~
698
699byte 0:
700
701   bit   7   6   5   4   3   2   1   0
702       id2 id1 id0   w   0   1   R   L
703
704       L, R = 1 when Left, Right mouse button pressed
705       id2..id0 = finger id
706       w = 1 when delta overflows (> 127 or < -128), in this case
707       firmware sends us (delta x / 5) and (delta y  / 5)
708
709byte 1:
710
711   bit   7   6   5   4   3   2   1   0
712        x7  x6  x5  x4  x3  x2  x1  x0
713
714        x7..x0 = delta x (two's complement)
715
716byte 2:
717
718   bit   7   6   5   4   3   2   1   0
719        y7  y6  y5  y4  y3  y2  y1  y0
720
721        y7..y0 = delta y (two's complement)
722
723byte 3:
724
725   bit   7   6   5   4   3   2   1   0
726       id2 id1 id0   1   0   0   1   0
727
728       id2..id0 = finger id
729
730byte 4:
731
732   bit   7   6   5   4   3   2   1   0
733        x7  x6  x5  x4  x3  x2  x1  x0
734
735        x7..x0 = delta x (two's complement)
736
737byte 5:
738
739   bit   7   6   5   4   3   2   1   0
740        y7  y6  y5  y4  y3  y2  y1  y0
741
742        y7..y0 = delta y (two's complement)
743
744        byte 0 ~ 2 for one finger
745        byte 3 ~ 5 for another
746