blob: c3374a7ce7af84b3b9adbd1c9f5ce20dbbd665b1 [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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -070013.. Contents
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040014
15 1. Introduction
16 2. Extra knobs
JJ Ding28f49612011-09-09 10:30:31 -070017 3. Differentiating hardware versions
18 4. Hardware version 1
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040019 4.1 Registers
JJ Ding28f49612011-09-09 10:30:31 -070020 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
JJ Ding1dc6ede2011-09-09 10:31:58 -070033 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
Ulrik De Biec6c748e2014-11-13 17:48:06 -080039 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040043
44
45
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -070046Introduction
47~~~~~~~~~~~~
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040048
Ulrik De Biec6c748e2014-11-13 17:48:06 -080049Currently the Linux Elantech touchpad driver is aware of four different
50hardware versions unimaginatively called version 1,version 2, version 3
51and version 4. Version 1 is found in "older" laptops and uses 4 bytes per
52packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes
53per packet, and provides additional features such as position of two fingers,
54and width of the touch. Hardware version 3 uses 6 bytes per packet (and
55for 2 fingers the concatenation of two 6 bytes packets) and allows tracking
56of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can
57combine a status packet with multiple head or motion packets. Hardware version
584 allows tracking up to 5 fingers.
59
60Some Hardware version 3 and version 4 also have a trackpoint which uses a
61separate packet format. It is also 6 bytes per packet.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040062
63The driver tries to support both hardware versions and should be compatible
64with the Xorg Synaptics touchpad driver and its graphical configuration
65utilities.
66
Ulrik De Biec6c748e2014-11-13 17:48:06 -080067Note that a mouse button is also associated with either the touchpad or the
68trackpoint when a trackpoint is available. Disabling the Touchpad in xorg
69(TouchPadOff=0) will also disable the buttons associated with the touchpad.
70
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040071Additionally the operation of the touchpad can be altered by adjusting the
72contents of some of its internal registers. These registers are represented
73by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio?
74that can be read from and written to.
75
76Currently only the registers for hardware version 1 are somewhat understood.
77Hardware version 2 seems to use some of the same registers but it is not
78known whether the bits in the registers represent the same thing or might
79have changed their meaning.
80
81On top of that, some register settings have effect only when the touchpad is
82in relative mode and not in absolute mode. As the Linux Elantech touchpad
83driver always puts the hardware into absolute mode not all information
84mentioned below can be used immediately. But because there is no freely
85available Elantech documentation the information is provided here anyway for
86completeness sake.
87
88
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -070089Extra knobs
90~~~~~~~~~~~
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040091
Ulrik De Biec6c748e2014-11-13 17:48:06 -080092Currently the Linux Elantech touchpad driver provides three extra knobs under
Arjan Opmeer2a0bd752008-10-16 22:10:19 -040093/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
Éric Piel71c6d182011-05-16 22:45:54 -0700122 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.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400125
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800126* 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700140Differentiating hardware versions
141~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400142
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700143To detect the hardware version, read the version number as param[0].param[1].param[2]::
Éric Piel71c6d182011-05-16 22:45:54 -0700144
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700148
Éric Piel71c6d182011-05-16 22:45:54 -0700149In the wild, there appear to be more versions, such as 00.01.64, 01.00.21,
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -070015002.00.00, 02.00.04, 02.00.06::
Éric Piel71c6d182011-05-16 22:45:54 -0700151
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700159
Éric Piel71c6d182011-05-16 22:45:54 -0700160In the wild, there appear to be more versions, such as 04.03.01, 04.04.11. There
161appears to be almost no difference, except for EF113, which does not report
162pressure/width and has different data consistency checks.
163
164Probably all the versions with param[0] <= 01 can be considered as
1654 bytes/firmware 1. The versions < 02.08.00, with the exception of 02.00.30, as
1664 bytes/firmware 2. Everything >= 02.08.00 can be considered as 6 bytes.
167
Éric Piel71c6d182011-05-16 22:45:54 -0700168
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700169Hardware version 1
170~~~~~~~~~~~~~~~~~~
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400171
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700172Registers
173---------
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400174
175By echoing a hexadecimal value to a register it contents can be altered.
176
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700177For example::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400178
179 echo -n 0x16 > reg_10
180
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700181* reg_10::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400182
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700195* reg_11::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400196
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700205* reg_20::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400206
207 single finger width?
208
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700209* reg_21::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400210
211 scroll area width (small: 0x40 ... wide: 0xff)
212
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700213* reg_22::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400214
215 drag lock time out (short: 0x14 ... long: 0xfe;
216 0xff = tap again to release)
217
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700218* reg_23::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400219
220 tap make timeout?
221
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700222* reg_24::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400223
224 tap release timeout?
225
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700226* reg_25::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400227
228 smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast)
229
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700230* reg_26::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400231
232 smart edge activation area width?
233
234
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700235Native relative mode 4 byte packet format
236-----------------------------------------
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400237
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700238byte 0::
239
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400240 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700249byte 1::
250
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400251 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700257byte 2::
258
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400259 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700264byte 3::
265
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400266 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700297Native absolute mode 4 byte packet format
298-----------------------------------------
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400299
Éric Piel71c6d182011-05-16 22:45:54 -0700300EF013 and EF019 have a special behaviour (due to a bug in the firmware?), and
301when 1 finger is touching, the first 2 position reports must be discarded.
302This counting is reset whenever a different number of fingers is reported.
303
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700304byte 0::
305
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400306 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700324byte 1::
325
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400326 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700340byte 2::
341
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400342 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700347byte 3::
348
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400349 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700355Hardware version 2
356~~~~~~~~~~~~~~~~~~
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400357
358
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700359Registers
360---------
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400361
362By echoing a hexadecimal value to a register it contents can be altered.
363
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700364For example::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400365
366 echo -n 0x56 > reg_10
367
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700368* reg_10::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400369
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700375* reg_11::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400376
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700382* reg_21::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400383
384 unknown (0x00)
385
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700386* reg_22::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400387
388 drag and drop release time out (short: 0x70 ... long 0x7e;
389 0x7f = never i.e. tap again to release)
390
391
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700392Native absolute mode 6 byte packet format
393-----------------------------------------
394
395Parity checking and packet re-synchronization
396^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
397
Éric Piel71c6d182011-05-16 22:45:54 -0700398There is no parity checking, however some consistency checks can be performed.
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400399
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700400For instance for EF113::
401
Éric Piel71c6d182011-05-16 22:45:54 -0700402 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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700416For all the other ones, there are just a few constant bits::
417
Éric Piel71c6d182011-05-16 22:45:54 -0700418 if( ((packet[0] & 0x0C) != 0x04) ||
419 ((packet[3] & 0x0f) != 0x02) )
420 // error detected
421
422
423In case an error is detected, all the packets are shifted by one (and packet[0] is discarded).
424
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700425One/Three finger touch
426^^^^^^^^^^^^^^^^^^^^^^
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400427
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700428byte 0::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400429
430 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700431 n1 n0 w3 w2 . . R L
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400432
433 L, R = 1 when Left, Right mouse button pressed
JJ Ding28f49612011-09-09 10:30:31 -0700434 n1..n0 = number of fingers on touchpad
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400435
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700436byte 1::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400437
438 bit 7 6 5 4 3 2 1 0
JJ Ding11559612011-09-09 10:22:19 -0700439 p7 p6 p5 p4 x11 x10 x9 x8
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400440
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700441byte 2::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400442
443 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700444 x7 x6 x5 x4 x3 x2 x1 x0
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400445
JJ Ding11559612011-09-09 10:22:19 -0700446 x11..x0 = absolute x value (horizontal)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400447
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700448byte 3::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400449
450 bit 7 6 5 4 3 2 1 0
Éric Piel71c6d182011-05-16 22:45:54 -0700451 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
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400466
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700467byte 4::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400468
469 bit 7 6 5 4 3 2 1 0
JJ Ding11559612011-09-09 10:22:19 -0700470 p3 p1 p2 p0 y11 y10 y9 y8
Éric Piel71c6d182011-05-16 22:45:54 -0700471
472 p7..p0 = pressure (not EF113)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400473
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700474byte 5::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400475
476 bit 7 6 5 4 3 2 1 0
477 y7 y6 y5 y4 y3 y2 y1 y0
478
JJ Ding11559612011-09-09 10:22:19 -0700479 y11..y0 = absolute y value (vertical)
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400480
481
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700482Two finger touch
483^^^^^^^^^^^^^^^^
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400484
Éric Piel71c6d182011-05-16 22:45:54 -0700485Note that the two pairs of coordinates are not exactly the coordinates of the
486two fingers, but only the pair of the lower-left and upper-right coordinates.
487So the actual fingers might be situated on the other diagonal of the square
488defined by these two points.
489
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700490byte 0::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400491
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
JJ Ding28f49612011-09-09 10:30:31 -0700496 n1..n0 = number of fingers on touchpad
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400497
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700498byte 1::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400499
500 bit 7 6 5 4 3 2 1 0
501 ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
502
Éric Piel71c6d182011-05-16 22:45:54 -0700503 ax8..ax0 = lower-left finger absolute x value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400504
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700505byte 2::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400506
507 bit 7 6 5 4 3 2 1 0
508 ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0
509
Éric Piel71c6d182011-05-16 22:45:54 -0700510 ay8..ay0 = lower-left finger absolute y value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400511
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700512byte 3::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400513
514 bit 7 6 5 4 3 2 1 0
515 . . by8 bx8 . . . .
516
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700517byte 4::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400518
519 bit 7 6 5 4 3 2 1 0
520 bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0
521
Éric Piel71c6d182011-05-16 22:45:54 -0700522 bx8..bx0 = upper-right finger absolute x value
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400523
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700524byte 5::
Arjan Opmeer2a0bd752008-10-16 22:10:19 -0400525
526 bit 7 6 5 4 3 2 1 0
527 by7 by8 by5 by4 by3 by2 by1 by0
528
Éric Piel71c6d182011-05-16 22:45:54 -0700529 by8..by0 = upper-right finger absolute y value
JJ Ding28f49612011-09-09 10:30:31 -0700530
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700531Hardware version 3
532~~~~~~~~~~~~~~~~~~
JJ Ding28f49612011-09-09 10:30:31 -0700533
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700534Registers
535---------
JJ Ding28f49612011-09-09 10:30:31 -0700536
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700537* reg_10::
JJ Ding28f49612011-09-09 10:30:31 -0700538
539 bit 7 6 5 4 3 2 1 0
Hans de Goede36189cc2014-05-05 09:36:43 -0700540 0 0 0 0 R F T A
JJ Ding28f49612011-09-09 10:30:31 -0700541
542 A: 1 = enable absolute tracking
Hans de Goede36189cc2014-05-05 09:36:43 -0700543 T: 1 = enable two finger mode auto correct
544 F: 1 = disable ABS Position Filter
545 R: 1 = enable real hardware resolution
JJ Ding28f49612011-09-09 10:30:31 -0700546
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700547Native absolute mode 6 byte packet format
548-----------------------------------------
549
JJ Ding28f49612011-09-09 10:30:31 -07005501 and 3 finger touch shares the same 6-byte packet format, except that
5513 finger touch only reports the position of the center of all three fingers.
552
553Firmware would send 12 bytes of data for 2 finger touch.
554
555Note on debounce:
556In case the box has unstable power supply or other electricity issues, or
557when number of finger changes, F/W would send "debounce packet" to inform
558driver that the hardware is in debounce status.
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700559The debouce packet has the following signature::
560
JJ Ding28f49612011-09-09 10:30:31 -0700561 byte 0: 0xc4
562 byte 1: 0xff
563 byte 2: 0xff
564 byte 3: 0x02
565 byte 4: 0xff
566 byte 5: 0xff
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700567
JJ Ding28f49612011-09-09 10:30:31 -0700568When we encounter this kind of packet, we just ignore it.
569
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700570One/Three finger touch
571^^^^^^^^^^^^^^^^^^^^^^
JJ Ding28f49612011-09-09 10:30:31 -0700572
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700573byte 0::
JJ Ding28f49612011-09-09 10:30:31 -0700574
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700581byte 1::
JJ Ding28f49612011-09-09 10:30:31 -0700582
583 bit 7 6 5 4 3 2 1 0
584 p7 p6 p5 p4 x11 x10 x9 x8
585
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700586byte 2::
JJ Ding28f49612011-09-09 10:30:31 -0700587
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700593byte 3::
JJ Ding28f49612011-09-09 10:30:31 -0700594
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700600byte 4::
JJ Ding28f49612011-09-09 10:30:31 -0700601
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700607byte 5::
JJ Ding28f49612011-09-09 10:30:31 -0700608
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700614Two finger touch
615^^^^^^^^^^^^^^^^
JJ Ding28f49612011-09-09 10:30:31 -0700616
617The packet format is exactly the same for two finger touch, except the hardware
618sends two 6 byte packets. The first packet contains data for the first finger,
619the second packet has data for the second finger. So for two finger touch a
620total of 12 bytes are sent.
JJ Ding1dc6ede2011-09-09 10:31:58 -0700621
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700622Hardware version 4
623~~~~~~~~~~~~~~~~~~
JJ Ding1dc6ede2011-09-09 10:31:58 -0700624
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700625Registers
626---------
JJ Ding1dc6ede2011-09-09 10:31:58 -0700627
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700628* reg_07::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700629
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700635Native absolute mode 6 byte packet format
636-----------------------------------------
637
JJ Ding1dc6ede2011-09-09 10:31:58 -0700638v4 hardware is a true multitouch touchpad, capable of tracking up to 5 fingers.
639Unfortunately, due to PS/2's limited bandwidth, its packet format is rather
640complex.
641
642Whenever the numbers or identities of the fingers changes, the hardware sends a
643status packet to indicate how many and which fingers is on touchpad, followed by
644head packets or motion packets. A head packet contains data of finger id, finger
645position (absolute x, y values), width, and pressure. A motion packet contains
646two fingers' position delta.
647
648For example, when status packet tells there are 2 fingers on touchpad, then we
649can expect two following head packets. If the finger status doesn't change,
650the following packets would be motion packets, only sending delta of finger
651position, until we receive a status packet.
652
653One exception is one finger touch. when a status packet tells us there is only
654one finger, the hardware would just send head packets afterwards.
655
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700656Status packet
657^^^^^^^^^^^^^
JJ Ding1dc6ede2011-09-09 10:31:58 -0700658
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700659byte 0::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700660
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700666byte 1::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700667
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700673byte 2::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700674
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700675 not used
676
677byte 3::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700678
679 bit 7 6 5 4 3 2 1 0
680 . . . 1 0 0 0 0
681
682 constant bits
683
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700684byte 4::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700685
686 bit 7 6 5 4 3 2 1 0
687 p . . . . . . .
688
689 p = 1 for palm
690
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700691byte 5::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700692
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700693 not used
JJ Ding1dc6ede2011-09-09 10:31:58 -0700694
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700695Head packet
696^^^^^^^^^^^
697
698byte 0::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700699
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700706byte 1::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700707
708 bit 7 6 5 4 3 2 1 0
709 p7 p6 p5 p4 x11 x10 x9 x8
710
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700711byte 2::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700712
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700718byte 3::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700719
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700725byte 4::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700726
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700732byte 5::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700733
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700739Motion packet
740^^^^^^^^^^^^^
JJ Ding1dc6ede2011-09-09 10:31:58 -0700741
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700742byte 0::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700743
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700752byte 1::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700753
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700759byte 2::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700760
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700766byte 3::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700767
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700773byte 4::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700774
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
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700780byte 5::
JJ Ding1dc6ede2011-09-09 10:31:58 -0700781
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
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800789
790
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700791Trackpoint (for Hardware version 3 and 4)
792~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
793
794Registers
795---------
796
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800797No special registers have been identified.
798
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700799Native relative mode 6 byte packet format
800-----------------------------------------
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800801
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700802Status Packet
803^^^^^^^^^^^^^
804
805byte 0::
806
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800807 bit 7 6 5 4 3 2 1 0
808 0 0 sx sy 0 M R L
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700809
810byte 1::
811
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800812 bit 7 6 5 4 3 2 1 0
813 ~sx 0 0 0 0 0 0 0
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700814
815byte 2::
816
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800817 bit 7 6 5 4 3 2 1 0
818 ~sy 0 0 0 0 0 0 0
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700819
820byte 3::
821
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800822 bit 7 6 5 4 3 2 1 0
823 0 0 ~sy ~sx 0 1 1 0
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700824
825byte 4::
826
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800827 bit 7 6 5 4 3 2 1 0
828 x7 x6 x5 x4 x3 x2 x1 x0
Mauro Carvalho Chehab604aed62017-04-04 17:38:54 -0700829
830byte 5::
831
Ulrik De Biec6c748e2014-11-13 17:48:06 -0800832 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