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 | ||
604aed61 | 13 | .. Contents |
2a0bd75e AO |
14 | |
15 | 1. Introduction | |
16 | 2. Extra knobs | |
28f49616 JD |
17 | 3. Differentiating hardware versions |
18 | 4. Hardware version 1 | |
2a0bd75e | 19 | 4.1 Registers |
28f49616 JD |
20 | 4.2 Native relative mode 4 byte packet format |
21 | 4.3 Native absolute mode 4 byte packet format | |
22 | 5. Hardware version 2 | |
23 | 5.1 Registers | |
24 | 5.2 Native absolute mode 6 byte packet format | |
25 | 5.2.1 Parity checking and packet re-synchronization | |
26 | 5.2.2 One/Three finger touch | |
27 | 5.2.3 Two finger touch | |
28 | 6. Hardware version 3 | |
29 | 6.1 Registers | |
30 | 6.2 Native absolute mode 6 byte packet format | |
31 | 6.2.1 One/Three finger touch | |
32 | 6.2.2 Two finger touch | |
1dc6edec JD |
33 | 7. Hardware version 4 |
34 | 7.1 Registers | |
35 | 7.2 Native absolute mode 6 byte packet format | |
36 | 7.2.1 Status packet | |
37 | 7.2.2 Head packet | |
38 | 7.2.3 Motion packet | |
c6c748ef UDB |
39 | 8. Trackpoint (for Hardware version 3 and 4) |
40 | 8.1 Registers | |
41 | 8.2 Native relative mode 6 byte packet format | |
42 | 8.2.1 Status Packet | |
2a0bd75e AO |
43 | |
44 | ||
45 | ||
604aed61 MCC |
46 | Introduction |
47 | ~~~~~~~~~~~~ | |
2a0bd75e | 48 | |
c6c748ef UDB |
49 | Currently the Linux Elantech touchpad driver is aware of four different |
50 | hardware versions unimaginatively called version 1,version 2, version 3 | |
51 | and version 4. Version 1 is found in "older" laptops and uses 4 bytes per | |
52 | packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes | |
53 | per packet, and provides additional features such as position of two fingers, | |
54 | and width of the touch. Hardware version 3 uses 6 bytes per packet (and | |
55 | for 2 fingers the concatenation of two 6 bytes packets) and allows tracking | |
56 | of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can | |
57 | combine a status packet with multiple head or motion packets. Hardware version | |
58 | 4 allows tracking up to 5 fingers. | |
59 | ||
60 | Some Hardware version 3 and version 4 also have a trackpoint which uses a | |
61 | separate packet format. It is also 6 bytes per packet. | |
2a0bd75e AO |
62 | |
63 | The driver tries to support both hardware versions and should be compatible | |
64 | with the Xorg Synaptics touchpad driver and its graphical configuration | |
65 | utilities. | |
66 | ||
c6c748ef UDB |
67 | Note that a mouse button is also associated with either the touchpad or the |
68 | trackpoint when a trackpoint is available. Disabling the Touchpad in xorg | |
69 | (TouchPadOff=0) will also disable the buttons associated with the touchpad. | |
70 | ||
2a0bd75e AO |
71 | Additionally the operation of the touchpad can be altered by adjusting the |
72 | contents of some of its internal registers. These registers are represented | |
73 | by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? | |
74 | that can be read from and written to. | |
75 | ||
76 | Currently only the registers for hardware version 1 are somewhat understood. | |
77 | Hardware version 2 seems to use some of the same registers but it is not | |
78 | known whether the bits in the registers represent the same thing or might | |
79 | have changed their meaning. | |
80 | ||
81 | On top of that, some register settings have effect only when the touchpad is | |
82 | in relative mode and not in absolute mode. As the Linux Elantech touchpad | |
83 | driver always puts the hardware into absolute mode not all information | |
84 | mentioned below can be used immediately. But because there is no freely | |
85 | available Elantech documentation the information is provided here anyway for | |
86 | completeness sake. | |
87 | ||
88 | ||
604aed61 MCC |
89 | Extra knobs |
90 | ~~~~~~~~~~~ | |
2a0bd75e | 91 | |
c6c748ef | 92 | Currently the Linux Elantech touchpad driver provides three extra knobs under |
2a0bd75e AO |
93 | /sys/bus/serio/drivers/psmouse/serio? for the user. |
94 | ||
95 | * debug | |
96 | ||
97 | Turn different levels of debugging ON or OFF. | |
98 | ||
99 | By echoing "0" to this file all debugging will be turned OFF. | |
100 | ||
101 | Currently a value of "1" will turn on some basic debugging and a value of | |
102 | "2" will turn on packet debugging. For hardware version 1 the default is | |
103 | OFF. For version 2 the default is "1". | |
104 | ||
105 | Turning packet debugging on will make the driver dump every packet | |
106 | received to the syslog before processing it. Be warned that this can | |
107 | generate quite a lot of data! | |
108 | ||
109 | * paritycheck | |
110 | ||
111 | Turns parity checking ON or OFF. | |
112 | ||
113 | By echoing "0" to this file parity checking will be turned OFF. Any | |
114 | non-zero value will turn it ON. For hardware version 1 the default is ON. | |
115 | For version 2 the default it is OFF. | |
116 | ||
117 | Hardware version 1 provides basic data integrity verification by | |
118 | calculating a parity bit for the last 3 bytes of each packet. The driver | |
119 | can check these bits and reject any packet that appears corrupted. Using | |
120 | this knob you can bypass that check. | |
121 | ||
71c6d188 ÉP |
122 | Hardware version 2 does not provide the same parity bits. Only some basic |
123 | data consistency checking can be done. For now checking is disabled by | |
124 | default. Currently even turning it on will do nothing. | |
2a0bd75e | 125 | |
c6c748ef UDB |
126 | * crc_enabled |
127 | ||
128 | Sets crc_enabled to 0/1. The name "crc_enabled" is the official name of | |
129 | this integrity check, even though it is not an actual cyclic redundancy | |
130 | check. | |
131 | ||
132 | Depending on the state of crc_enabled, certain basic data integrity | |
133 | verification is done by the driver on hardware version 3 and 4. The | |
134 | driver will reject any packet that appears corrupted. Using this knob, | |
135 | The state of crc_enabled can be altered with this knob. | |
136 | ||
137 | Reading the crc_enabled value will show the active value. Echoing | |
138 | "0" or "1" to this file will set the state to "0" or "1". | |
139 | ||
604aed61 MCC |
140 | Differentiating hardware versions |
141 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
2a0bd75e | 142 | |
604aed61 | 143 | To detect the hardware version, read the version number as param[0].param[1].param[2]:: |
71c6d188 ÉP |
144 | |
145 | 4 bytes version: (after the arrow is the name given in the Dell-provided driver) | |
146 | 02.00.22 => EF013 | |
147 | 02.06.00 => EF019 | |
604aed61 | 148 | |
71c6d188 | 149 | In the wild, there appear to be more versions, such as 00.01.64, 01.00.21, |
604aed61 | 150 | 02.00.00, 02.00.04, 02.00.06:: |
71c6d188 ÉP |
151 | |
152 | 6 bytes: | |
153 | 02.00.30 => EF113 | |
154 | 02.08.00 => EF023 | |
155 | 02.08.XX => EF123 | |
156 | 02.0B.00 => EF215 | |
157 | 04.01.XX => Scroll_EF051 | |
158 | 04.02.XX => EF051 | |
604aed61 | 159 | |
71c6d188 ÉP |
160 | In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There |
161 | appears to be almost no difference, except for EF113, which does not report | |
162 | pressure/width and has different data consistency checks. | |
163 | ||
164 | Probably all the versions with param[0] <= 01 can be considered as | |
165 | 4 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as | |
166 | 4 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes. | |
167 | ||
2a0bd75e | 168 | |
604aed61 MCC |
169 | Hardware version 1 |
170 | ~~~~~~~~~~~~~~~~~~ | |
2a0bd75e | 171 | |
604aed61 MCC |
172 | Registers |
173 | --------- | |
2a0bd75e AO |
174 | |
175 | By echoing a hexadecimal value to a register it contents can be altered. | |
176 | ||
604aed61 | 177 | For example:: |
2a0bd75e AO |
178 | |
179 | echo -n 0x16 > reg_10 | |
180 | ||
604aed61 | 181 | * reg_10:: |
2a0bd75e AO |
182 | |
183 | bit 7 6 5 4 3 2 1 0 | |
184 | B C T D L A S E | |
185 | ||
186 | E: 1 = enable smart edges unconditionally | |
187 | S: 1 = enable smart edges only when dragging | |
188 | A: 1 = absolute mode (needs 4 byte packets, see reg_11) | |
189 | L: 1 = enable drag lock (see reg_22) | |
190 | D: 1 = disable dynamic resolution | |
191 | T: 1 = disable tapping | |
192 | C: 1 = enable corner tap | |
193 | B: 1 = swap left and right button | |
194 | ||
604aed61 | 195 | * reg_11:: |
2a0bd75e AO |
196 | |
197 | bit 7 6 5 4 3 2 1 0 | |
198 | 1 0 0 H V 1 F P | |
199 | ||
200 | P: 1 = enable parity checking for relative mode | |
201 | F: 1 = enable native 4 byte packet mode | |
202 | V: 1 = enable vertical scroll area | |
203 | H: 1 = enable horizontal scroll area | |
204 | ||
604aed61 | 205 | * reg_20:: |
2a0bd75e AO |
206 | |
207 | single finger width? | |
208 | ||
604aed61 | 209 | * reg_21:: |
2a0bd75e AO |
210 | |
211 | scroll area width (small: 0x40 ... wide: 0xff) | |
212 | ||
604aed61 | 213 | * reg_22:: |
2a0bd75e AO |
214 | |
215 | drag lock time out (short: 0x14 ... long: 0xfe; | |
216 | 0xff = tap again to release) | |
217 | ||
604aed61 | 218 | * reg_23:: |
2a0bd75e AO |
219 | |
220 | tap make timeout? | |
221 | ||
604aed61 | 222 | * reg_24:: |
2a0bd75e AO |
223 | |
224 | tap release timeout? | |
225 | ||
604aed61 | 226 | * reg_25:: |
2a0bd75e AO |
227 | |
228 | smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast) | |
229 | ||
604aed61 | 230 | * reg_26:: |
2a0bd75e AO |
231 | |
232 | smart edge activation area width? | |
233 | ||
234 | ||
604aed61 MCC |
235 | Native relative mode 4 byte packet format |
236 | ----------------------------------------- | |
237 | ||
238 | byte 0:: | |
2a0bd75e | 239 | |
2a0bd75e AO |
240 | bit 7 6 5 4 3 2 1 0 |
241 | c c p2 p1 1 M R L | |
242 | ||
243 | L, R, M = 1 when Left, Right, Middle mouse button pressed | |
244 | some models have M as byte 3 odd parity bit | |
245 | when parity checking is enabled (reg_11, P = 1): | |
246 | p1..p2 = byte 1 and 2 odd parity bit | |
247 | c = 1 when corner tap detected | |
248 | ||
604aed61 MCC |
249 | byte 1:: |
250 | ||
2a0bd75e AO |
251 | bit 7 6 5 4 3 2 1 0 |
252 | dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0 | |
253 | ||
254 | dx7..dx0 = x movement; positive = right, negative = left | |
255 | byte 1 = 0xf0 when corner tap detected | |
256 | ||
604aed61 MCC |
257 | byte 2:: |
258 | ||
2a0bd75e AO |
259 | bit 7 6 5 4 3 2 1 0 |
260 | dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0 | |
261 | ||
262 | dy7..dy0 = y movement; positive = up, negative = down | |
263 | ||
604aed61 MCC |
264 | byte 3:: |
265 | ||
2a0bd75e AO |
266 | parity checking enabled (reg_11, P = 1): |
267 | ||
268 | bit 7 6 5 4 3 2 1 0 | |
269 | w h n1 n0 ds3 ds2 ds1 ds0 | |
270 | ||
271 | normally: | |
272 | ds3..ds0 = scroll wheel amount and direction | |
273 | positive = down or left | |
274 | negative = up or right | |
275 | when corner tap detected: | |
276 | ds0 = 1 when top right corner tapped | |
277 | ds1 = 1 when bottom right corner tapped | |
278 | ds2 = 1 when bottom left corner tapped | |
279 | ds3 = 1 when top left corner tapped | |
280 | n1..n0 = number of fingers on touchpad | |
281 | only models with firmware 2.x report this, models with | |
282 | firmware 1.x seem to map one, two and three finger taps | |
283 | directly to L, M and R mouse buttons | |
284 | h = 1 when horizontal scroll action | |
285 | w = 1 when wide finger touch? | |
286 | ||
287 | otherwise (reg_11, P = 0): | |
288 | ||
289 | bit 7 6 5 4 3 2 1 0 | |
290 | ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0 | |
291 | ||
292 | ds7..ds0 = vertical scroll amount and direction | |
293 | negative = up | |
294 | positive = down | |
295 | ||
296 | ||
604aed61 MCC |
297 | Native absolute mode 4 byte packet format |
298 | ----------------------------------------- | |
2a0bd75e | 299 | |
71c6d188 ÉP |
300 | EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and |
301 | when 1 finger is touching, the first 2 position reports must be discarded. | |
302 | This counting is reset whenever a different number of fingers is reported. | |
303 | ||
604aed61 MCC |
304 | byte 0:: |
305 | ||
2a0bd75e AO |
306 | firmware version 1.x: |
307 | ||
308 | bit 7 6 5 4 3 2 1 0 | |
309 | D U p1 p2 1 p3 R L | |
310 | ||
311 | L, R = 1 when Left, Right mouse button pressed | |
312 | p1..p3 = byte 1..3 odd parity bit | |
313 | D, U = 1 when rocker switch pressed Up, Down | |
314 | ||
315 | firmware version 2.x: | |
316 | ||
317 | bit 7 6 5 4 3 2 1 0 | |
318 | n1 n0 p2 p1 1 p3 R L | |
319 | ||
320 | L, R = 1 when Left, Right mouse button pressed | |
321 | p1..p3 = byte 1..3 odd parity bit | |
322 | n1..n0 = number of fingers on touchpad | |
323 | ||
604aed61 MCC |
324 | byte 1:: |
325 | ||
2a0bd75e AO |
326 | firmware version 1.x: |
327 | ||
328 | bit 7 6 5 4 3 2 1 0 | |
329 | f 0 th tw x9 x8 y9 y8 | |
330 | ||
331 | tw = 1 when two finger touch | |
332 | th = 1 when three finger touch | |
333 | f = 1 when finger touch | |
334 | ||
335 | firmware version 2.x: | |
336 | ||
337 | bit 7 6 5 4 3 2 1 0 | |
338 | . . . . x9 x8 y9 y8 | |
339 | ||
604aed61 MCC |
340 | byte 2:: |
341 | ||
2a0bd75e AO |
342 | bit 7 6 5 4 3 2 1 0 |
343 | x7 x6 x5 x4 x3 x2 x1 x0 | |
344 | ||
345 | x9..x0 = absolute x value (horizontal) | |
346 | ||
604aed61 MCC |
347 | byte 3:: |
348 | ||
2a0bd75e AO |
349 | bit 7 6 5 4 3 2 1 0 |
350 | y7 y6 y5 y4 y3 y2 y1 y0 | |
351 | ||
352 | y9..y0 = absolute y value (vertical) | |
353 | ||
354 | ||
604aed61 MCC |
355 | Hardware version 2 |
356 | ~~~~~~~~~~~~~~~~~~ | |
2a0bd75e | 357 | |
2a0bd75e | 358 | |
604aed61 MCC |
359 | Registers |
360 | --------- | |
2a0bd75e AO |
361 | |
362 | By echoing a hexadecimal value to a register it contents can be altered. | |
363 | ||
604aed61 | 364 | For example:: |
2a0bd75e AO |
365 | |
366 | echo -n 0x56 > reg_10 | |
367 | ||
604aed61 | 368 | * reg_10:: |
2a0bd75e AO |
369 | |
370 | bit 7 6 5 4 3 2 1 0 | |
371 | 0 1 0 1 0 1 D 0 | |
372 | ||
373 | D: 1 = enable drag and drop | |
374 | ||
604aed61 | 375 | * reg_11:: |
2a0bd75e AO |
376 | |
377 | bit 7 6 5 4 3 2 1 0 | |
378 | 1 0 0 0 S 0 1 0 | |
379 | ||
380 | S: 1 = enable vertical scroll | |
381 | ||
604aed61 | 382 | * reg_21:: |
2a0bd75e AO |
383 | |
384 | unknown (0x00) | |
385 | ||
604aed61 | 386 | * reg_22:: |
2a0bd75e AO |
387 | |
388 | drag and drop release time out (short: 0x70 ... long 0x7e; | |
389 | 0x7f = never i.e. tap again to release) | |
390 | ||
391 | ||
604aed61 MCC |
392 | Native absolute mode 6 byte packet format |
393 | ----------------------------------------- | |
394 | ||
395 | Parity checking and packet re-synchronization | |
396 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
397 | ||
71c6d188 ÉP |
398 | There is no parity checking, however some consistency checks can be performed. |
399 | ||
604aed61 MCC |
400 | For instance for EF113:: |
401 | ||
71c6d188 ÉP |
402 | SA1= packet[0]; |
403 | A1 = packet[1]; | |
404 | B1 = packet[2]; | |
405 | SB1= packet[3]; | |
406 | C1 = packet[4]; | |
407 | D1 = packet[5]; | |
408 | if( (((SA1 & 0x3C) != 0x3C) && ((SA1 & 0xC0) != 0x80)) || // check Byte 1 | |
409 | (((SA1 & 0x0C) != 0x0C) && ((SA1 & 0xC0) == 0x80)) || // check Byte 1 (one finger pressed) | |
410 | (((SA1 & 0xC0) != 0x80) && (( A1 & 0xF0) != 0x00)) || // check Byte 2 | |
411 | (((SB1 & 0x3E) != 0x38) && ((SA1 & 0xC0) != 0x80)) || // check Byte 4 | |
412 | (((SB1 & 0x0E) != 0x08) && ((SA1 & 0xC0) == 0x80)) || // check Byte 4 (one finger pressed) | |
413 | (((SA1 & 0xC0) != 0x80) && (( C1 & 0xF0) != 0x00)) ) // check Byte 5 | |
414 | // error detected | |
415 | ||
604aed61 MCC |
416 | For all the other ones, there are just a few constant bits:: |
417 | ||
71c6d188 ÉP |
418 | if( ((packet[0] & 0x0C) != 0x04) || |
419 | ((packet[3] & 0x0f) != 0x02) ) | |
420 | // error detected | |
421 | ||
422 | ||
423 | In case an error is detected, all the packets are shifted by one (and packet[0] is discarded). | |
424 | ||
604aed61 MCC |
425 | One/Three finger touch |
426 | ^^^^^^^^^^^^^^^^^^^^^^ | |
2a0bd75e | 427 | |
604aed61 | 428 | byte 0:: |
2a0bd75e AO |
429 | |
430 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 | 431 | n1 n0 w3 w2 . . R L |
2a0bd75e AO |
432 | |
433 | L, R = 1 when Left, Right mouse button pressed | |
28f49616 | 434 | n1..n0 = number of fingers on touchpad |
2a0bd75e | 435 | |
604aed61 | 436 | byte 1:: |
2a0bd75e AO |
437 | |
438 | bit 7 6 5 4 3 2 1 0 | |
11559619 | 439 | p7 p6 p5 p4 x11 x10 x9 x8 |
2a0bd75e | 440 | |
604aed61 | 441 | byte 2:: |
2a0bd75e AO |
442 | |
443 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 | 444 | x7 x6 x5 x4 x3 x2 x1 x0 |
2a0bd75e | 445 | |
11559619 | 446 | x11..x0 = absolute x value (horizontal) |
2a0bd75e | 447 | |
604aed61 | 448 | byte 3:: |
2a0bd75e AO |
449 | |
450 | bit 7 6 5 4 3 2 1 0 | |
71c6d188 ÉP |
451 | n4 vf w1 w0 . . . b2 |
452 | ||
453 | n4 = set if more than 3 fingers (only in 3 fingers mode) | |
454 | vf = a kind of flag ? (only on EF123, 0 when finger is over one | |
455 | of the buttons, 1 otherwise) | |
456 | w3..w0 = width of the finger touch (not EF113) | |
457 | b2 (on EF113 only, 0 otherwise), b2.R.L indicates one button pressed: | |
458 | 0 = none | |
459 | 1 = Left | |
460 | 2 = Right | |
461 | 3 = Middle (Left and Right) | |
462 | 4 = Forward | |
463 | 5 = Back | |
464 | 6 = Another one | |
465 | 7 = Another one | |
2a0bd75e | 466 | |
604aed61 | 467 | byte 4:: |
2a0bd75e AO |
468 | |
469 | bit 7 6 5 4 3 2 1 0 | |
11559619 | 470 | p3 p1 p2 p0 y11 y10 y9 y8 |
71c6d188 ÉP |
471 | |
472 | p7..p0 = pressure (not EF113) | |
2a0bd75e | 473 | |
604aed61 | 474 | byte 5:: |
2a0bd75e AO |
475 | |
476 | bit 7 6 5 4 3 2 1 0 | |
477 | y7 y6 y5 y4 y3 y2 y1 y0 | |
478 | ||
11559619 | 479 | y11..y0 = absolute y value (vertical) |
2a0bd75e AO |
480 | |
481 | ||
604aed61 MCC |
482 | Two finger touch |
483 | ^^^^^^^^^^^^^^^^ | |
2a0bd75e | 484 | |
71c6d188 ÉP |
485 | Note that the two pairs of coordinates are not exactly the coordinates of the |
486 | two fingers, but only the pair of the lower-left and upper-right coordinates. | |
487 | So the actual fingers might be situated on the other diagonal of the square | |
488 | defined by these two points. | |
489 | ||
604aed61 | 490 | byte 0:: |
2a0bd75e AO |
491 | |
492 | bit 7 6 5 4 3 2 1 0 | |
493 | n1 n0 ay8 ax8 . . R L | |
494 | ||
495 | L, R = 1 when Left, Right mouse button pressed | |
28f49616 | 496 | n1..n0 = number of fingers on touchpad |
2a0bd75e | 497 | |
604aed61 | 498 | byte 1:: |
2a0bd75e AO |
499 | |
500 | bit 7 6 5 4 3 2 1 0 | |
501 | ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 | |
502 | ||
71c6d188 | 503 | ax8..ax0 = lower-left finger absolute x value |
2a0bd75e | 504 | |
604aed61 | 505 | byte 2:: |
2a0bd75e AO |
506 | |
507 | bit 7 6 5 4 3 2 1 0 | |
508 | ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 | |
509 | ||
71c6d188 | 510 | ay8..ay0 = lower-left finger absolute y value |
2a0bd75e | 511 | |
604aed61 | 512 | byte 3:: |
2a0bd75e AO |
513 | |
514 | bit 7 6 5 4 3 2 1 0 | |
515 | . . by8 bx8 . . . . | |
516 | ||
604aed61 | 517 | byte 4:: |
2a0bd75e AO |
518 | |
519 | bit 7 6 5 4 3 2 1 0 | |
520 | bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 | |
521 | ||
71c6d188 | 522 | bx8..bx0 = upper-right finger absolute x value |
2a0bd75e | 523 | |
604aed61 | 524 | byte 5:: |
2a0bd75e AO |
525 | |
526 | bit 7 6 5 4 3 2 1 0 | |
527 | by7 by8 by5 by4 by3 by2 by1 by0 | |
528 | ||
71c6d188 | 529 | by8..by0 = upper-right finger absolute y value |
28f49616 | 530 | |
604aed61 MCC |
531 | Hardware version 3 |
532 | ~~~~~~~~~~~~~~~~~~ | |
28f49616 | 533 | |
604aed61 MCC |
534 | Registers |
535 | --------- | |
28f49616 | 536 | |
604aed61 | 537 | * reg_10:: |
28f49616 JD |
538 | |
539 | bit 7 6 5 4 3 2 1 0 | |
36189cc3 | 540 | 0 0 0 0 R F T A |
28f49616 JD |
541 | |
542 | A: 1 = enable absolute tracking | |
36189cc3 HG |
543 | T: 1 = enable two finger mode auto correct |
544 | F: 1 = disable ABS Position Filter | |
545 | R: 1 = enable real hardware resolution | |
28f49616 | 546 | |
604aed61 MCC |
547 | Native absolute mode 6 byte packet format |
548 | ----------------------------------------- | |
549 | ||
28f49616 JD |
550 | 1 and 3 finger touch shares the same 6-byte packet format, except that |
551 | 3 finger touch only reports the position of the center of all three fingers. | |
552 | ||
553 | Firmware would send 12 bytes of data for 2 finger touch. | |
554 | ||
555 | Note on debounce: | |
556 | In case the box has unstable power supply or other electricity issues, or | |
557 | when number of finger changes, F/W would send "debounce packet" to inform | |
558 | driver that the hardware is in debounce status. | |
604aed61 MCC |
559 | The debouce packet has the following signature:: |
560 | ||
28f49616 JD |
561 | byte 0: 0xc4 |
562 | byte 1: 0xff | |
563 | byte 2: 0xff | |
564 | byte 3: 0x02 | |
565 | byte 4: 0xff | |
566 | byte 5: 0xff | |
604aed61 | 567 | |
28f49616 JD |
568 | When we encounter this kind of packet, we just ignore it. |
569 | ||
604aed61 MCC |
570 | One/Three finger touch |
571 | ^^^^^^^^^^^^^^^^^^^^^^ | |
28f49616 | 572 | |
604aed61 | 573 | byte 0:: |
28f49616 JD |
574 | |
575 | bit 7 6 5 4 3 2 1 0 | |
576 | n1 n0 w3 w2 0 1 R L | |
577 | ||
578 | L, R = 1 when Left, Right mouse button pressed | |
579 | n1..n0 = number of fingers on touchpad | |
580 | ||
604aed61 | 581 | byte 1:: |
28f49616 JD |
582 | |
583 | bit 7 6 5 4 3 2 1 0 | |
584 | p7 p6 p5 p4 x11 x10 x9 x8 | |
585 | ||
604aed61 | 586 | byte 2:: |
28f49616 JD |
587 | |
588 | bit 7 6 5 4 3 2 1 0 | |
589 | x7 x6 x5 x4 x3 x2 x1 x0 | |
590 | ||
591 | x11..x0 = absolute x value (horizontal) | |
592 | ||
604aed61 | 593 | byte 3:: |
28f49616 JD |
594 | |
595 | bit 7 6 5 4 3 2 1 0 | |
596 | 0 0 w1 w0 0 0 1 0 | |
597 | ||
598 | w3..w0 = width of the finger touch | |
599 | ||
604aed61 | 600 | byte 4:: |
28f49616 JD |
601 | |
602 | bit 7 6 5 4 3 2 1 0 | |
603 | p3 p1 p2 p0 y11 y10 y9 y8 | |
604 | ||
605 | p7..p0 = pressure | |
606 | ||
604aed61 | 607 | byte 5:: |
28f49616 JD |
608 | |
609 | bit 7 6 5 4 3 2 1 0 | |
610 | y7 y6 y5 y4 y3 y2 y1 y0 | |
611 | ||
612 | y11..y0 = absolute y value (vertical) | |
613 | ||
604aed61 MCC |
614 | Two finger touch |
615 | ^^^^^^^^^^^^^^^^ | |
28f49616 JD |
616 | |
617 | The packet format is exactly the same for two finger touch, except the hardware | |
618 | sends two 6 byte packets. The first packet contains data for the first finger, | |
619 | the second packet has data for the second finger. So for two finger touch a | |
620 | total of 12 bytes are sent. | |
1dc6edec | 621 | |
604aed61 MCC |
622 | Hardware version 4 |
623 | ~~~~~~~~~~~~~~~~~~ | |
1dc6edec | 624 | |
604aed61 MCC |
625 | Registers |
626 | --------- | |
1dc6edec | 627 | |
604aed61 | 628 | * reg_07:: |
1dc6edec JD |
629 | |
630 | bit 7 6 5 4 3 2 1 0 | |
631 | 0 0 0 0 0 0 0 A | |
632 | ||
633 | A: 1 = enable absolute tracking | |
634 | ||
604aed61 MCC |
635 | Native absolute mode 6 byte packet format |
636 | ----------------------------------------- | |
637 | ||
1dc6edec JD |
638 | v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers. |
639 | Unfortunately, due to PS/2's limited bandwidth, its packet format is rather | |
640 | complex. | |
641 | ||
642 | Whenever the numbers or identities of the fingers changes, the hardware sends a | |
643 | status packet to indicate how many and which fingers is on touchpad, followed by | |
644 | head packets or motion packets. A head packet contains data of finger id, finger | |
645 | position (absolute x, y values), width, and pressure. A motion packet contains | |
646 | two fingers' position delta. | |
647 | ||
648 | For example, when status packet tells there are 2 fingers on touchpad, then we | |
649 | can expect two following head packets. If the finger status doesn't change, | |
650 | the following packets would be motion packets, only sending delta of finger | |
651 | position, until we receive a status packet. | |
652 | ||
653 | One exception is one finger touch. when a status packet tells us there is only | |
654 | one finger, the hardware would just send head packets afterwards. | |
655 | ||
604aed61 MCC |
656 | Status packet |
657 | ^^^^^^^^^^^^^ | |
1dc6edec | 658 | |
604aed61 | 659 | byte 0:: |
1dc6edec JD |
660 | |
661 | bit 7 6 5 4 3 2 1 0 | |
662 | . . . . 0 1 R L | |
663 | ||
664 | L, R = 1 when Left, Right mouse button pressed | |
665 | ||
604aed61 | 666 | byte 1:: |
1dc6edec JD |
667 | |
668 | bit 7 6 5 4 3 2 1 0 | |
669 | . . . ft4 ft3 ft2 ft1 ft0 | |
670 | ||
671 | ft4 ft3 ft2 ft1 ft0 ftn = 1 when finger n is on touchpad | |
672 | ||
604aed61 MCC |
673 | byte 2:: |
674 | ||
675 | not used | |
1dc6edec | 676 | |
604aed61 | 677 | byte 3:: |
1dc6edec JD |
678 | |
679 | bit 7 6 5 4 3 2 1 0 | |
680 | . . . 1 0 0 0 0 | |
681 | ||
682 | constant bits | |
683 | ||
604aed61 | 684 | byte 4:: |
1dc6edec JD |
685 | |
686 | bit 7 6 5 4 3 2 1 0 | |
687 | p . . . . . . . | |
688 | ||
689 | p = 1 for palm | |
690 | ||
604aed61 | 691 | byte 5:: |
1dc6edec | 692 | |
604aed61 | 693 | not used |
1dc6edec | 694 | |
604aed61 MCC |
695 | Head packet |
696 | ^^^^^^^^^^^ | |
697 | ||
698 | byte 0:: | |
1dc6edec JD |
699 | |
700 | bit 7 6 5 4 3 2 1 0 | |
701 | w3 w2 w1 w0 0 1 R L | |
702 | ||
703 | L, R = 1 when Left, Right mouse button pressed | |
704 | w3..w0 = finger width (spans how many trace lines) | |
705 | ||
604aed61 | 706 | byte 1:: |
1dc6edec JD |
707 | |
708 | bit 7 6 5 4 3 2 1 0 | |
709 | p7 p6 p5 p4 x11 x10 x9 x8 | |
710 | ||
604aed61 | 711 | byte 2:: |
1dc6edec JD |
712 | |
713 | bit 7 6 5 4 3 2 1 0 | |
714 | x7 x6 x5 x4 x3 x2 x1 x0 | |
715 | ||
716 | x11..x0 = absolute x value (horizontal) | |
717 | ||
604aed61 | 718 | byte 3:: |
1dc6edec JD |
719 | |
720 | bit 7 6 5 4 3 2 1 0 | |
721 | id2 id1 id0 1 0 0 0 1 | |
722 | ||
723 | id2..id0 = finger id | |
724 | ||
604aed61 | 725 | byte 4:: |
1dc6edec JD |
726 | |
727 | bit 7 6 5 4 3 2 1 0 | |
728 | p3 p1 p2 p0 y11 y10 y9 y8 | |
729 | ||
730 | p7..p0 = pressure | |
731 | ||
604aed61 | 732 | byte 5:: |
1dc6edec JD |
733 | |
734 | bit 7 6 5 4 3 2 1 0 | |
735 | y7 y6 y5 y4 y3 y2 y1 y0 | |
736 | ||
737 | y11..y0 = absolute y value (vertical) | |
738 | ||
604aed61 MCC |
739 | Motion packet |
740 | ^^^^^^^^^^^^^ | |
1dc6edec | 741 | |
604aed61 | 742 | byte 0:: |
1dc6edec JD |
743 | |
744 | bit 7 6 5 4 3 2 1 0 | |
745 | id2 id1 id0 w 0 1 R L | |
746 | ||
747 | L, R = 1 when Left, Right mouse button pressed | |
748 | id2..id0 = finger id | |
749 | w = 1 when delta overflows (> 127 or < -128), in this case | |
750 | firmware sends us (delta x / 5) and (delta y / 5) | |
751 | ||
604aed61 | 752 | byte 1:: |
1dc6edec JD |
753 | |
754 | bit 7 6 5 4 3 2 1 0 | |
755 | x7 x6 x5 x4 x3 x2 x1 x0 | |
756 | ||
757 | x7..x0 = delta x (two's complement) | |
758 | ||
604aed61 | 759 | byte 2:: |
1dc6edec JD |
760 | |
761 | bit 7 6 5 4 3 2 1 0 | |
762 | y7 y6 y5 y4 y3 y2 y1 y0 | |
763 | ||
764 | y7..y0 = delta y (two's complement) | |
765 | ||
604aed61 | 766 | byte 3:: |
1dc6edec JD |
767 | |
768 | bit 7 6 5 4 3 2 1 0 | |
769 | id2 id1 id0 1 0 0 1 0 | |
770 | ||
771 | id2..id0 = finger id | |
772 | ||
604aed61 | 773 | byte 4:: |
1dc6edec JD |
774 | |
775 | bit 7 6 5 4 3 2 1 0 | |
776 | x7 x6 x5 x4 x3 x2 x1 x0 | |
777 | ||
778 | x7..x0 = delta x (two's complement) | |
779 | ||
604aed61 | 780 | byte 5:: |
1dc6edec JD |
781 | |
782 | bit 7 6 5 4 3 2 1 0 | |
783 | y7 y6 y5 y4 y3 y2 y1 y0 | |
784 | ||
785 | y7..y0 = delta y (two's complement) | |
786 | ||
787 | byte 0 ~ 2 for one finger | |
788 | byte 3 ~ 5 for another | |
c6c748ef UDB |
789 | |
790 | ||
604aed61 MCC |
791 | Trackpoint (for Hardware version 3 and 4) |
792 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
793 | ||
794 | Registers | |
795 | --------- | |
796 | ||
c6c748ef UDB |
797 | No special registers have been identified. |
798 | ||
604aed61 MCC |
799 | Native relative mode 6 byte packet format |
800 | ----------------------------------------- | |
801 | ||
802 | Status Packet | |
803 | ^^^^^^^^^^^^^ | |
804 | ||
805 | byte 0:: | |
c6c748ef | 806 | |
c6c748ef UDB |
807 | bit 7 6 5 4 3 2 1 0 |
808 | 0 0 sx sy 0 M R L | |
604aed61 MCC |
809 | |
810 | byte 1:: | |
811 | ||
c6c748ef UDB |
812 | bit 7 6 5 4 3 2 1 0 |
813 | ~sx 0 0 0 0 0 0 0 | |
604aed61 MCC |
814 | |
815 | byte 2:: | |
816 | ||
c6c748ef UDB |
817 | bit 7 6 5 4 3 2 1 0 |
818 | ~sy 0 0 0 0 0 0 0 | |
604aed61 MCC |
819 | |
820 | byte 3:: | |
821 | ||
c6c748ef UDB |
822 | bit 7 6 5 4 3 2 1 0 |
823 | 0 0 ~sy ~sx 0 1 1 0 | |
604aed61 MCC |
824 | |
825 | byte 4:: | |
826 | ||
c6c748ef UDB |
827 | bit 7 6 5 4 3 2 1 0 |
828 | x7 x6 x5 x4 x3 x2 x1 x0 | |
604aed61 MCC |
829 | |
830 | byte 5:: | |
831 | ||
c6c748ef UDB |
832 | bit 7 6 5 4 3 2 1 0 |
833 | y7 y6 y5 y4 y3 y2 y1 y0 | |
834 | ||
835 | ||
836 | x and y are written in two's complement spread | |
837 | over 9 bits with sx/sy the relative top bit and | |
838 | x7..x0 and y7..y0 the lower bits. | |
839 | ~sx is the inverse of sx, ~sy is the inverse of sy. | |
840 | The sign of y is opposite to what the input driver | |
841 | expects for a relative movement |