blob: e1ae127ed099d4934e1d7fb95f1a8ba819c1da9b [file] [log] [blame]
Arjan Opmeer2a0bd752008-10-16 22:10:19 -04001Elantech 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
JJ Ding28f49612011-09-09 10:30:31 -070019 3. Differentiating hardware versions
20 4. Hardware version 1
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040021 4.1 Registers
JJ Ding28f49612011-09-09 10:30:31 -070022 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
JJ Ding1dc6ede2011-09-09 10:31:58 -070035 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040041
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
Éric Piel71c6d182011-05-16 22:45:54 -070050be 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.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040052
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
Éric Piel71c6d182011-05-16 22:45:54 -0700111 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.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400114
115/////////////////////////////////////////////////////////////////////////////
116
Éric Piel71c6d182011-05-16 22:45:54 -07001173. Differentiating hardware versions
118 =================================
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400119
Éric Piel71c6d182011-05-16 22:45:54 -0700120To 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400146 ==================
147
Éric Piel71c6d182011-05-16 22:45:54 -07001484.1 Registers
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400149 ~~~~~~~~~
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
Éric Piel71c6d182011-05-16 22:45:54 -07002114.2 Native relative mode 4 byte packet format
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400212 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
Éric Piel71c6d182011-05-16 22:45:54 -07002694.3 Native absolute mode 4 byte packet format
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400270 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
271
Éric Piel71c6d182011-05-16 22:45:54 -0700272EF013 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400276byte 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
Éric Piel71c6d182011-05-16 22:45:54 -07003265. Hardware version 2
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400327 ==================
328
329
Éric Piel71c6d182011-05-16 22:45:54 -07003305.1 Registers
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400331 ~~~~~~~~~
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
Éric Piel71c6d182011-05-16 22:45:54 -07003635.2 Native absolute mode 6 byte packet format
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Éric Piel71c6d182011-05-16 22:45:54 -07003655.2.1 Parity checking and packet re-synchronization
366There is no parity checking, however some consistency checks can be performed.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400367
Éric Piel71c6d182011-05-16 22:45:54 -0700368For 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
JJ Ding28f49612011-09-09 10:30:31 -07003915.2.2 One/Three finger touch
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400392 ~~~~~~~~~~~~~~~~
393
394byte 0:
395
396 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700397 n1 n0 w3 w2 . . R L
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400398
399 L, R = 1 when Left, Right mouse button pressed
JJ Ding28f49612011-09-09 10:30:31 -0700400 n1..n0 = number of fingers on touchpad
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400401
402byte 1:
403
404 bit 7 6 5 4 3 2 1 0
JJ Ding11559612011-09-09 10:22:19 -0700405 p7 p6 p5 p4 x11 x10 x9 x8
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400406
407byte 2:
408
409 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700410 x7 x6 x5 x4 x3 x2 x1 x0
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400411
JJ Ding11559612011-09-09 10:22:19 -0700412 x11..x0 = absolute x value (horizontal)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400413
414byte 3:
415
416 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700417 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400432
433byte 4:
434
435 bit 7 6 5 4 3 2 1 0
JJ Ding11559612011-09-09 10:22:19 -0700436 p3 p1 p2 p0 y11 y10 y9 y8
Éric Piel71c6d182011-05-16 22:45:54 -0700437
438 p7..p0 = pressure (not EF113)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400439
440byte 5:
441
442 bit 7 6 5 4 3 2 1 0
443 y7 y6 y5 y4 y3 y2 y1 y0
444
JJ Ding11559612011-09-09 10:22:19 -0700445 y11..y0 = absolute y value (vertical)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400446
447
JJ Ding28f49612011-09-09 10:30:31 -07004485.2.3 Two finger touch
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400449 ~~~~~~~~~~~~~~~~
450
Éric Piel71c6d182011-05-16 22:45:54 -0700451Note 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400456byte 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
JJ Ding28f49612011-09-09 10:30:31 -0700462 n1..n0 = number of fingers on touchpad
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400463
464byte 1:
465
466 bit 7 6 5 4 3 2 1 0
467 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
468
Éric Piel71c6d182011-05-16 22:45:54 -0700469 ax8..ax0 = lower-left finger absolute x value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400470
471byte 2:
472
473 bit 7 6 5 4 3 2 1 0
474 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0
475
Éric Piel71c6d182011-05-16 22:45:54 -0700476 ay8..ay0 = lower-left finger absolute y value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400477
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
Éric Piel71c6d182011-05-16 22:45:54 -0700488 bx8..bx0 = upper-right finger absolute x value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400489
490byte 5:
491
492 bit 7 6 5 4 3 2 1 0
493 by7 by8 by5 by4 by3 by2 by1 by0
494
Éric Piel71c6d182011-05-16 22:45:54 -0700495 by8..by0 = upper-right finger absolute y value
JJ Ding28f49612011-09-09 10:30:31 -0700496
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
Hans de Goede36189cc2014-05-05 09:36:43 -0700507 0 0 0 0 R F T A
JJ Ding28f49612011-09-09 10:30:31 -0700508
509 A: 1 = enable absolute tracking
Hans de Goede36189cc2014-05-05 09:36:43 -0700510 T: 1 = enable two finger mode auto correct
511 F: 1 = disable ABS Position Filter
512 R: 1 = enable real hardware resolution
JJ Ding28f49612011-09-09 10:30:31 -0700513
5146.2 Native absolute mode 6 byte packet format
515 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5161 and 3 finger touch shares the same 6-byte packet format, except that
5173 finger touch only reports the position of the center of all three fingers.
518
519Firmware would send 12 bytes of data for 2 finger touch.
520
521Note on debounce:
522In case the box has unstable power supply or other electricity issues, or
523when number of finger changes, F/W would send "debounce packet" to inform
524driver that the hardware is in debounce status.
525The debouce packet has the following signature:
526 byte 0: 0xc4
527 byte 1: 0xff
528 byte 2: 0xff
529 byte 3: 0x02
530 byte 4: 0xff
531 byte 5: 0xff
532When we encounter this kind of packet, we just ignore it.
533
5346.2.1 One/Three finger touch
535 ~~~~~~~~~~~~~~~~~~~~~~
536
537byte 0:
538
539 bit 7 6 5 4 3 2 1 0
540 n1 n0 w3 w2 0 1 R L
541
542 L, R = 1 when Left, Right mouse button pressed
543 n1..n0 = number of fingers on touchpad
544
545byte 1:
546
547 bit 7 6 5 4 3 2 1 0
548 p7 p6 p5 p4 x11 x10 x9 x8
549
550byte 2:
551
552 bit 7 6 5 4 3 2 1 0
553 x7 x6 x5 x4 x3 x2 x1 x0
554
555 x11..x0 = absolute x value (horizontal)
556
557byte 3:
558
559 bit 7 6 5 4 3 2 1 0
560 0 0 w1 w0 0 0 1 0
561
562 w3..w0 = width of the finger touch
563
564byte 4:
565
566 bit 7 6 5 4 3 2 1 0
567 p3 p1 p2 p0 y11 y10 y9 y8
568
569 p7..p0 = pressure
570
571byte 5:
572
573 bit 7 6 5 4 3 2 1 0
574 y7 y6 y5 y4 y3 y2 y1 y0
575
576 y11..y0 = absolute y value (vertical)
577
5786.2.2 Two finger touch
579 ~~~~~~~~~~~~~~~~
580
581The packet format is exactly the same for two finger touch, except the hardware
582sends two 6 byte packets. The first packet contains data for the first finger,
583the second packet has data for the second finger. So for two finger touch a
584total of 12 bytes are sent.
JJ Ding1dc6ede2011-09-09 10:31:58 -0700585
586/////////////////////////////////////////////////////////////////////////////
587
5887. Hardware version 4
589 ==================
590
5917.1 Registers
592 ~~~~~~~~~
593* reg_07
594
595 bit 7 6 5 4 3 2 1 0
596 0 0 0 0 0 0 0 A
597
598 A: 1 = enable absolute tracking
599
6007.2 Native absolute mode 6 byte packet format
601 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
602v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers.
603Unfortunately, due to PS/2's limited bandwidth, its packet format is rather
604complex.
605
606Whenever the numbers or identities of the fingers changes, the hardware sends a
607status packet to indicate how many and which fingers is on touchpad, followed by
608head packets or motion packets. A head packet contains data of finger id, finger
609position (absolute x, y values), width, and pressure. A motion packet contains
610two fingers' position delta.
611
612For example, when status packet tells there are 2 fingers on touchpad, then we
613can expect two following head packets. If the finger status doesn't change,
614the following packets would be motion packets, only sending delta of finger
615position, until we receive a status packet.
616
617One exception is one finger touch. when a status packet tells us there is only
618one finger, the hardware would just send head packets afterwards.
619
6207.2.1 Status packet
621 ~~~~~~~~~~~~~
622
623byte 0:
624
625 bit 7 6 5 4 3 2 1 0
626 . . . . 0 1 R L
627
628 L, R = 1 when Left, Right mouse button pressed
629
630byte 1:
631
632 bit 7 6 5 4 3 2 1 0
633 . . . ft4 ft3 ft2 ft1 ft0
634
635 ft4 ft3 ft2 ft1 ft0 ftn = 1 when finger n is on touchpad
636
637byte 2: not used
638
639byte 3:
640
641 bit 7 6 5 4 3 2 1 0
642 . . . 1 0 0 0 0
643
644 constant bits
645
646byte 4:
647
648 bit 7 6 5 4 3 2 1 0
649 p . . . . . . .
650
651 p = 1 for palm
652
653byte 5: not used
654
6557.2.2 Head packet
656 ~~~~~~~~~~~
657
658byte 0:
659
660 bit 7 6 5 4 3 2 1 0
661 w3 w2 w1 w0 0 1 R L
662
663 L, R = 1 when Left, Right mouse button pressed
664 w3..w0 = finger width (spans how many trace lines)
665
666byte 1:
667
668 bit 7 6 5 4 3 2 1 0
669 p7 p6 p5 p4 x11 x10 x9 x8
670
671byte 2:
672
673 bit 7 6 5 4 3 2 1 0
674 x7 x6 x5 x4 x3 x2 x1 x0
675
676 x11..x0 = absolute x value (horizontal)
677
678byte 3:
679
680 bit 7 6 5 4 3 2 1 0
681 id2 id1 id0 1 0 0 0 1
682
683 id2..id0 = finger id
684
685byte 4:
686
687 bit 7 6 5 4 3 2 1 0
688 p3 p1 p2 p0 y11 y10 y9 y8
689
690 p7..p0 = pressure
691
692byte 5:
693
694 bit 7 6 5 4 3 2 1 0
695 y7 y6 y5 y4 y3 y2 y1 y0
696
697 y11..y0 = absolute y value (vertical)
698
6997.2.3 Motion packet
700 ~~~~~~~~~~~~~
701
702byte 0:
703
704 bit 7 6 5 4 3 2 1 0
705 id2 id1 id0 w 0 1 R L
706
707 L, R = 1 when Left, Right mouse button pressed
708 id2..id0 = finger id
709 w = 1 when delta overflows (> 127 or < -128), in this case
710 firmware sends us (delta x / 5) and (delta y / 5)
711
712byte 1:
713
714 bit 7 6 5 4 3 2 1 0
715 x7 x6 x5 x4 x3 x2 x1 x0
716
717 x7..x0 = delta x (two's complement)
718
719byte 2:
720
721 bit 7 6 5 4 3 2 1 0
722 y7 y6 y5 y4 y3 y2 y1 y0
723
724 y7..y0 = delta y (two's complement)
725
726byte 3:
727
728 bit 7 6 5 4 3 2 1 0
729 id2 id1 id0 1 0 0 1 0
730
731 id2..id0 = finger id
732
733byte 4:
734
735 bit 7 6 5 4 3 2 1 0
736 x7 x6 x5 x4 x3 x2 x1 x0
737
738 x7..x0 = delta x (two's complement)
739
740byte 5:
741
742 bit 7 6 5 4 3 2 1 0
743 y7 y6 y5 y4 y3 y2 y1 y0
744
745 y7..y0 = delta y (two's complement)
746
747 byte 0 ~ 2 for one finger
748 byte 3 ~ 5 for another