]>
Commit | Line | Data |
---|---|---|
2a0bd75e AO |
1 | Elantech 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 | ||
14 | Contents | |
15 | ~~~~~~~~ | |
16 | ||
17 | 1. Introduction | |
18 | 2. Extra knobs | |
28f49616 JD |
19 | 3. Differentiating hardware versions |
20 | 4. Hardware version 1 | |
2a0bd75e | 21 | 4.1 Registers |
28f49616 JD |
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 | |
1dc6edec JD |
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 | |
2a0bd75e AO |
41 | |
42 | ||
43 | ||
44 | 1. Introduction | |
45 | ~~~~~~~~~~~~ | |
46 | ||
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 | |
71c6d188 ÉP |
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. | |
2a0bd75e AO |
52 | |
53 | The driver tries to support both hardware versions and should be compatible | |
54 | with the Xorg Synaptics touchpad driver and its graphical configuration | |
55 | utilities. | |
56 | ||
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. | |
61 | ||
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. | |
66 | ||
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 | |
72 | completeness sake. | |
73 | ||
74 | ||
75 | ///////////////////////////////////////////////////////////////////////////// | |
76 | ||
77 | ||
78 | 2. Extra knobs | |
79 | ~~~~~~~~~~~ | |
80 | ||
81 | Currently 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 | ||
71c6d188 ÉP |
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. | |
2a0bd75e AO |
114 | |
115 | ///////////////////////////////////////////////////////////////////////////// | |
116 | ||
71c6d188 ÉP |
117 | 3. Differentiating hardware versions |
118 | ================================= | |
119 | ||
120 | To 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 | |
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. | |
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 | |
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. | |
138 | ||
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. | |
142 | ||
143 | ///////////////////////////////////////////////////////////////////////////// | |
2a0bd75e | 144 | |
71c6d188 | 145 | 4. Hardware version 1 |
2a0bd75e AO |
146 | ================== |
147 | ||
71c6d188 | 148 | 4.1 Registers |
2a0bd75e AO |
149 | ~~~~~~~~~ |
150 | ||
151 | By echoing a hexadecimal value to a register it contents can be altered. | |
152 | ||
153 | For 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 | ||
71c6d188 | 211 | 4.2 Native relative mode 4 byte packet format |
2a0bd75e AO |
212 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
213 | ||
214 | byte 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 | ||
224 | byte 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 | ||
231 | byte 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 | ||
237 | byte 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 | ||
71c6d188 | 269 | 4.3 Native absolute mode 4 byte packet format |
2a0bd75e AO |
270 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
271 | ||
71c6d188 ÉP |
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. | |
275 | ||
2a0bd75e AO |
276 | byte 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 | ||
295 | byte 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 | ||
310 | byte 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 | ||
316 | byte 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 | ||
71c6d188 | 326 | 5. Hardware version 2 |
2a0bd75e AO |
327 | ================== |
328 | ||
329 | ||
71c6d188 | 330 | 5.1 Registers |
2a0bd75e AO |
331 | ~~~~~~~~~ |
332 | ||
333 | By echoing a hexadecimal value to a register it contents can be altered. | |
334 | ||
335 | For 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 | ||
71c6d188 | 363 | 5.2 Native absolute mode 6 byte packet format |
2a0bd75e | 364 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
71c6d188 ÉP |
365 | 5.2.1 Parity checking and packet re-synchronization |
366 | There is no parity checking, however some consistency checks can be performed. | |
367 | ||
368 | For 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 | ||
383 | For 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 | ||
389 | In case an error is detected, all the packets are shifted by one (and packet[0] is discarded). | |
390 | ||
28f49616 | 391 | 5.2.2 One/Three finger touch |
2a0bd75e AO |
392 | ~~~~~~~~~~~~~~~~ |
393 | ||
394 | byte 0: | |
395 | ||
396 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 | 397 | n1 n0 w3 w2 . . R L |
2a0bd75e AO |
398 | |
399 | L, R = 1 when Left, Right mouse button pressed | |
28f49616 | 400 | n1..n0 = number of fingers on touchpad |
2a0bd75e AO |
401 | |
402 | byte 1: | |
403 | ||
404 | bit 7 6 5 4 3 2 1 0 | |
11559619 | 405 | p7 p6 p5 p4 x11 x10 x9 x8 |
2a0bd75e AO |
406 | |
407 | byte 2: | |
408 | ||
409 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 | 410 | x7 x6 x5 x4 x3 x2 x1 x0 |
2a0bd75e | 411 | |
11559619 | 412 | x11..x0 = absolute x value (horizontal) |
2a0bd75e AO |
413 | |
414 | byte 3: | |
415 | ||
416 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 ÉP |
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 | |
2a0bd75e AO |
432 | |
433 | byte 4: | |
434 | ||
435 | bit 7 6 5 4 3 2 1 0 | |
11559619 | 436 | p3 p1 p2 p0 y11 y10 y9 y8 |
71c6d188 ÉP |
437 | |
438 | p7..p0 = pressure (not EF113) | |
2a0bd75e AO |
439 | |
440 | byte 5: | |
441 | ||
442 | bit 7 6 5 4 3 2 1 0 | |
443 | y7 y6 y5 y4 y3 y2 y1 y0 | |
444 | ||
11559619 | 445 | y11..y0 = absolute y value (vertical) |
2a0bd75e AO |
446 | |
447 | ||
28f49616 | 448 | 5.2.3 Two finger touch |
2a0bd75e AO |
449 | ~~~~~~~~~~~~~~~~ |
450 | ||
71c6d188 ÉP |
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. | |
455 | ||
2a0bd75e AO |
456 | byte 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 | |
28f49616 | 462 | n1..n0 = number of fingers on touchpad |
2a0bd75e AO |
463 | |
464 | byte 1: | |
465 | ||
466 | bit 7 6 5 4 3 2 1 0 | |
467 | ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 | |
468 | ||
71c6d188 | 469 | ax8..ax0 = lower-left finger absolute x value |
2a0bd75e AO |
470 | |
471 | byte 2: | |
472 | ||
473 | bit 7 6 5 4 3 2 1 0 | |
474 | ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 | |
475 | ||
71c6d188 | 476 | ay8..ay0 = lower-left finger absolute y value |
2a0bd75e AO |
477 | |
478 | byte 3: | |
479 | ||
480 | bit 7 6 5 4 3 2 1 0 | |
481 | . . by8 bx8 . . . . | |
482 | ||
483 | byte 4: | |
484 | ||
485 | bit 7 6 5 4 3 2 1 0 | |
486 | bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 | |
487 | ||
71c6d188 | 488 | bx8..bx0 = upper-right finger absolute x value |
2a0bd75e AO |
489 | |
490 | byte 5: | |
491 | ||
492 | bit 7 6 5 4 3 2 1 0 | |
493 | by7 by8 by5 by4 by3 by2 by1 by0 | |
494 | ||
71c6d188 | 495 | by8..by0 = upper-right finger absolute y value |
28f49616 JD |
496 | |
497 | ///////////////////////////////////////////////////////////////////////////// | |
498 | ||
499 | 6. Hardware version 3 | |
500 | ================== | |
501 | ||
502 | 6.1 Registers | |
503 | ~~~~~~~~~ | |
504 | * reg_10 | |
505 | ||
506 | bit 7 6 5 4 3 2 1 0 | |
36189cc3 | 507 | 0 0 0 0 R F T A |
28f49616 JD |
508 | |
509 | A: 1 = enable absolute tracking | |
36189cc3 HG |
510 | T: 1 = enable two finger mode auto correct |
511 | F: 1 = disable ABS Position Filter | |
512 | R: 1 = enable real hardware resolution | |
28f49616 JD |
513 | |
514 | 6.2 Native absolute mode 6 byte packet format | |
515 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
516 | 1 and 3 finger touch shares the same 6-byte packet format, except that | |
517 | 3 finger touch only reports the position of the center of all three fingers. | |
518 | ||
519 | Firmware would send 12 bytes of data for 2 finger touch. | |
520 | ||
521 | Note on debounce: | |
522 | In case the box has unstable power supply or other electricity issues, or | |
523 | when number of finger changes, F/W would send "debounce packet" to inform | |
524 | driver that the hardware is in debounce status. | |
525 | The 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 | |
532 | When we encounter this kind of packet, we just ignore it. | |
533 | ||
534 | 6.2.1 One/Three finger touch | |
535 | ~~~~~~~~~~~~~~~~~~~~~~ | |
536 | ||
537 | byte 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 | ||
545 | byte 1: | |
546 | ||
547 | bit 7 6 5 4 3 2 1 0 | |
548 | p7 p6 p5 p4 x11 x10 x9 x8 | |
549 | ||
550 | byte 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 | ||
557 | byte 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 | ||
564 | byte 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 | ||
571 | byte 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 | ||
578 | 6.2.2 Two finger touch | |
579 | ~~~~~~~~~~~~~~~~ | |
580 | ||
581 | The packet format is exactly the same for two finger touch, except the hardware | |
582 | sends two 6 byte packets. The first packet contains data for the first finger, | |
583 | the second packet has data for the second finger. So for two finger touch a | |
584 | total of 12 bytes are sent. | |
1dc6edec JD |
585 | |
586 | ///////////////////////////////////////////////////////////////////////////// | |
587 | ||
588 | 7. Hardware version 4 | |
589 | ================== | |
590 | ||
591 | 7.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 | ||
600 | 7.2 Native absolute mode 6 byte packet format | |
601 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
602 | v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers. | |
603 | Unfortunately, due to PS/2's limited bandwidth, its packet format is rather | |
604 | complex. | |
605 | ||
606 | Whenever the numbers or identities of the fingers changes, the hardware sends a | |
607 | status packet to indicate how many and which fingers is on touchpad, followed by | |
608 | head packets or motion packets. A head packet contains data of finger id, finger | |
609 | position (absolute x, y values), width, and pressure. A motion packet contains | |
610 | two fingers' position delta. | |
611 | ||
612 | For example, when status packet tells there are 2 fingers on touchpad, then we | |
613 | can expect two following head packets. If the finger status doesn't change, | |
614 | the following packets would be motion packets, only sending delta of finger | |
615 | position, until we receive a status packet. | |
616 | ||
617 | One exception is one finger touch. when a status packet tells us there is only | |
618 | one finger, the hardware would just send head packets afterwards. | |
619 | ||
620 | 7.2.1 Status packet | |
621 | ~~~~~~~~~~~~~ | |
622 | ||
623 | byte 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 | ||
630 | byte 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 | ||
637 | byte 2: not used | |
638 | ||
639 | byte 3: | |
640 | ||
641 | bit 7 6 5 4 3 2 1 0 | |
642 | . . . 1 0 0 0 0 | |
643 | ||
644 | constant bits | |
645 | ||
646 | byte 4: | |
647 | ||
648 | bit 7 6 5 4 3 2 1 0 | |
649 | p . . . . . . . | |
650 | ||
651 | p = 1 for palm | |
652 | ||
653 | byte 5: not used | |
654 | ||
655 | 7.2.2 Head packet | |
656 | ~~~~~~~~~~~ | |
657 | ||
658 | byte 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 | ||
666 | byte 1: | |
667 | ||
668 | bit 7 6 5 4 3 2 1 0 | |
669 | p7 p6 p5 p4 x11 x10 x9 x8 | |
670 | ||
671 | byte 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 | ||
678 | byte 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 | ||
685 | byte 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 | ||
692 | byte 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 | ||
699 | 7.2.3 Motion packet | |
700 | ~~~~~~~~~~~~~ | |
701 | ||
702 | byte 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 | ||
712 | byte 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 | ||
719 | byte 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 | ||
726 | byte 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 | ||
733 | byte 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 | ||
740 | byte 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 |