GNU Linux-libre 6.9.1-gnu
[releases.git] / Documentation / input / devices / sentelic.rst
1 .. include:: <isonum.txt>
2
3 =================
4 Sentelic Touchpad
5 =================
6
7
8 :Copyright: |copy| 2002-2011 Sentelic Corporation.
9
10 :Last update: Dec-07-2011
11
12 Finger Sensing Pad Intellimouse Mode (scrolling wheel, 4th and 5th buttons)
13 ============================================================================
14
15 A) MSID 4: Scrolling wheel mode plus Forward page(4th button) and Backward
16    page (5th button)
17
18 1. Set sample rate to 200;
19 2. Set sample rate to 200;
20 3. Set sample rate to 80;
21 4. Issuing the "Get device ID" command (0xF2) and waits for the response;
22 5. FSP will respond 0x04.
23
24 ::
25
26     Packet 1
27     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
28     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
29       1   |Y|X|y|x|1|M|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 | | |B|F|W|W|W|W|
30           |---------------|     |---------------|    |---------------|    |---------------|
31
32     Byte 1: Bit7 => Y overflow
33             Bit6 => X overflow
34             Bit5 => Y sign bit
35             Bit4 => X sign bit
36             Bit3 => 1
37             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
38             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
39             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
40     Byte 2: X Movement(9-bit 2's complement integers)
41     Byte 3: Y Movement(9-bit 2's complement integers)
42     Byte 4: Bit3~Bit0 => the scrolling wheel's movement since the last data report.
43                         valid values, -8 ~ +7
44             Bit4 => 1 = 4th mouse button is pressed, Forward one page.
45                     0 = 4th mouse button is not pressed.
46             Bit5 => 1 = 5th mouse button is pressed, Backward one page.
47                     0 = 5th mouse button is not pressed.
48
49 B) MSID 6: Horizontal and Vertical scrolling
50
51 - Set bit 1 in register 0x40 to 1
52
53 FSP replaces scrolling wheel's movement as 4 bits to show horizontal and
54 vertical scrolling.
55
56 ::
57
58     Packet 1
59     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
60     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
61       1   |Y|X|y|x|1|M|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 | | |B|F|r|l|u|d|
62           |---------------|     |---------------|    |---------------|    |---------------|
63
64     Byte 1: Bit7 => Y overflow
65             Bit6 => X overflow
66             Bit5 => Y sign bit
67             Bit4 => X sign bit
68             Bit3 => 1
69             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
70             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
71             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
72     Byte 2: X Movement(9-bit 2's complement integers)
73     Byte 3: Y Movement(9-bit 2's complement integers)
74     Byte 4: Bit0 => the Vertical scrolling movement downward.
75             Bit1 => the Vertical scrolling movement upward.
76             Bit2 => the Horizontal scrolling movement leftward.
77             Bit3 => the Horizontal scrolling movement rightward.
78             Bit4 => 1 = 4th mouse button is pressed, Forward one page.
79                     0 = 4th mouse button is not pressed.
80             Bit5 => 1 = 5th mouse button is pressed, Backward one page.
81                     0 = 5th mouse button is not pressed.
82
83 C) MSID 7
84
85 FSP uses 2 packets (8 Bytes) to represent Absolute Position.
86 so we have PACKET NUMBER to identify packets.
87
88   If PACKET NUMBER is 0, the packet is Packet 1.
89   If PACKET NUMBER is 1, the packet is Packet 2.
90   Please count this number in program.
91
92 MSID6 special packet will be enable at the same time when enable MSID 7.
93
94 Absolute position for STL3886-G0
95 ================================
96
97 1. Set bit 2 or 3 in register 0x40 to 1
98 2. Set bit 6 in register 0x40 to 1
99
100 ::
101
102     Packet 1 (ABSOLUTE POSITION)
103     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
104     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
105       1   |0|1|V|1|1|M|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |r|l|d|u|X|X|Y|Y|
106           |---------------|     |---------------|    |---------------|    |---------------|
107
108     Byte 1: Bit7~Bit6 => 00, Normal data packet
109                     => 01, Absolute coordination packet
110                     => 10, Notify packet
111             Bit5 => valid bit
112             Bit4 => 1
113             Bit3 => 1
114             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
115             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
116             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
117     Byte 2: X coordinate (xpos[9:2])
118     Byte 3: Y coordinate (ypos[9:2])
119     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
120             Bit3~Bit2 => X coordinate (ypos[1:0])
121             Bit4 => scroll up
122             Bit5 => scroll down
123             Bit6 => scroll left
124             Bit7 => scroll right
125
126     Notify Packet for G0
127     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
128     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
129       1   |1|0|0|1|1|M|R|L|  2  |C|C|C|C|C|C|C|C|  3 |M|M|M|M|M|M|M|M|  4 |0|0|0|0|0|0|0|0|
130           |---------------|     |---------------|    |---------------|    |---------------|
131
132     Byte 1: Bit7~Bit6 => 00, Normal data packet
133                     => 01, Absolute coordination packet
134                     => 10, Notify packet
135             Bit5 => 0
136             Bit4 => 1
137             Bit3 => 1
138             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
139             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
140             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
141     Byte 2: Message Type => 0x5A (Enable/Disable status packet)
142             Mode Type => 0xA5 (Normal/Icon mode status)
143     Byte 3: Message Type => 0x00 (Disabled)
144                         => 0x01 (Enabled)
145             Mode Type    => 0x00 (Normal)
146                         => 0x01 (Icon)
147     Byte 4: Bit7~Bit0 => Don't Care
148
149 Absolute position for STL3888-Ax
150 ================================
151
152 ::
153
154     Packet 1 (ABSOLUTE POSITION)
155     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
156     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
157       1   |0|1|V|A|1|L|0|1|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |x|x|y|y|X|X|Y|Y|
158           |---------------|     |---------------|    |---------------|    |---------------|
159
160     Byte 1: Bit7~Bit6 => 00, Normal data packet
161                     => 01, Absolute coordination packet
162                     => 10, Notify packet
163                     => 11, Normal data packet with on-pad click
164             Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up.
165                     When both fingers are up, the last two reports have zero valid
166                     bit.
167             Bit4 => arc
168             Bit3 => 1
169             Bit2 => Left Button, 1 is pressed, 0 is released.
170             Bit1 => 0
171             Bit0 => 1
172     Byte 2: X coordinate (xpos[9:2])
173     Byte 3: Y coordinate (ypos[9:2])
174     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
175             Bit3~Bit2 => X coordinate (ypos[1:0])
176             Bit5~Bit4 => y1_g
177             Bit7~Bit6 => x1_g
178
179     Packet 2 (ABSOLUTE POSITION)
180     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
181     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
182       1   |0|1|V|A|1|R|1|0|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |x|x|y|y|X|X|Y|Y|
183           |---------------|     |---------------|    |---------------|    |---------------|
184
185     Byte 1: Bit7~Bit6 => 00, Normal data packet
186                     => 01, Absolute coordinates packet
187                     => 10, Notify packet
188                     => 11, Normal data packet with on-pad click
189             Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up.
190                     When both fingers are up, the last two reports have zero valid
191                     bit.
192             Bit4 => arc
193             Bit3 => 1
194             Bit2 => Right Button, 1 is pressed, 0 is released.
195             Bit1 => 1
196             Bit0 => 0
197     Byte 2: X coordinate (xpos[9:2])
198     Byte 3: Y coordinate (ypos[9:2])
199     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
200             Bit3~Bit2 => X coordinate (ypos[1:0])
201             Bit5~Bit4 => y2_g
202             Bit7~Bit6 => x2_g
203
204     Notify Packet for STL3888-Ax
205     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
206     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
207       1   |1|0|1|P|1|M|R|L|  2  |C|C|C|C|C|C|C|C|  3 |0|0|F|F|0|0|0|i|  4 |r|l|d|u|0|0|0|0|
208           |---------------|     |---------------|    |---------------|    |---------------|
209
210     Byte 1: Bit7~Bit6 => 00, Normal data packet
211                     => 01, Absolute coordinates packet
212                     => 10, Notify packet
213                     => 11, Normal data packet with on-pad click
214             Bit5 => 1
215             Bit4 => when in absolute coordinates mode (valid when EN_PKT_GO is 1):
216                     0: left button is generated by the on-pad command
217                     1: left button is generated by the external button
218             Bit3 => 1
219             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
220             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
221             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
222     Byte 2: Message Type => 0xB7 (Multi Finger, Multi Coordinate mode)
223     Byte 3: Bit7~Bit6 => Don't care
224             Bit5~Bit4 => Number of fingers
225             Bit3~Bit1 => Reserved
226             Bit0 => 1: enter gesture mode; 0: leaving gesture mode
227     Byte 4: Bit7 => scroll right button
228             Bit6 => scroll left button
229             Bit5 => scroll down button
230             Bit4 => scroll up button
231                 * Note that if gesture and additional button (Bit4~Bit7)
232                 happen at the same time, the button information will not
233                 be sent.
234             Bit3~Bit0 => Reserved
235
236 Sample sequence of Multi-finger, Multi-coordinate mode:
237
238         notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1,
239         abs pkt 2, ..., notify packet (valid bit == 0)
240
241 Absolute position for STL3888-B0
242 ================================
243
244 ::
245
246     Packet 1(ABSOLUTE POSITION)
247     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
248     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
249       1   |0|1|V|F|1|0|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |r|l|u|d|X|X|Y|Y|
250           |---------------|     |---------------|    |---------------|    |---------------|
251
252     Byte 1: Bit7~Bit6 => 00, Normal data packet
253                     => 01, Absolute coordinates packet
254                     => 10, Notify packet
255                     => 11, Normal data packet with on-pad click
256             Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up.
257                     When both fingers are up, the last two reports have zero valid
258                     bit.
259             Bit4 => finger up/down information. 1: finger down, 0: finger up.
260             Bit3 => 1
261             Bit2 => finger index, 0 is the first finger, 1 is the second finger.
262             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
263             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
264     Byte 2: X coordinate (xpos[9:2])
265     Byte 3: Y coordinate (ypos[9:2])
266     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
267             Bit3~Bit2 => X coordinate (ypos[1:0])
268             Bit4 => scroll down button
269             Bit5 => scroll up button
270             Bit6 => scroll left button
271             Bit7 => scroll right button
272
273     Packet 2 (ABSOLUTE POSITION)
274     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
275     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
276       1   |0|1|V|F|1|1|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |r|l|u|d|X|X|Y|Y|
277           |---------------|     |---------------|    |---------------|    |---------------|
278
279     Byte 1: Bit7~Bit6 => 00, Normal data packet
280                     => 01, Absolute coordination packet
281                     => 10, Notify packet
282                     => 11, Normal data packet with on-pad click
283             Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up.
284                     When both fingers are up, the last two reports have zero valid
285                     bit.
286             Bit4 => finger up/down information. 1: finger down, 0: finger up.
287             Bit3 => 1
288             Bit2 => finger index, 0 is the first finger, 1 is the second finger.
289             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
290             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
291     Byte 2: X coordinate (xpos[9:2])
292     Byte 3: Y coordinate (ypos[9:2])
293     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
294             Bit3~Bit2 => X coordinate (ypos[1:0])
295             Bit4 => scroll down button
296             Bit5 => scroll up button
297             Bit6 => scroll left button
298             Bit7 => scroll right button
299
300 Notify Packet for STL3888-B0::
301
302     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
303     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
304       1   |1|0|1|P|1|M|R|L|  2  |C|C|C|C|C|C|C|C|  3 |0|0|F|F|0|0|0|i|  4 |r|l|u|d|0|0|0|0|
305           |---------------|     |---------------|    |---------------|    |---------------|
306
307     Byte 1: Bit7~Bit6 => 00, Normal data packet
308                     => 01, Absolute coordination packet
309                     => 10, Notify packet
310                     => 11, Normal data packet with on-pad click
311             Bit5 => 1
312             Bit4 => when in absolute coordinates mode (valid when EN_PKT_GO is 1):
313                     0: left button is generated by the on-pad command
314                     1: left button is generated by the external button
315             Bit3 => 1
316             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
317             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
318             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
319     Byte 2: Message Type => 0xB7 (Multi Finger, Multi Coordinate mode)
320     Byte 3: Bit7~Bit6 => Don't care
321             Bit5~Bit4 => Number of fingers
322             Bit3~Bit1 => Reserved
323             Bit0 => 1: enter gesture mode; 0: leaving gesture mode
324     Byte 4: Bit7 => scroll right button
325             Bit6 => scroll left button
326             Bit5 => scroll up button
327             Bit4 => scroll down button
328                 * Note that if gesture and additional button(Bit4~Bit7)
329                 happen at the same time, the button information will not
330                 be sent.
331             Bit3~Bit0 => Reserved
332
333 Sample sequence of Multi-finger, Multi-coordinate mode:
334
335         notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1,
336         abs pkt 2, ..., notify packet (valid bit == 0)
337
338 Absolute position for STL3888-Cx and STL3888-Dx
339 ===============================================
340
341 ::
342
343     Single Finger, Absolute Coordinate Mode (SFAC)
344     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
345     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
346       1   |0|1|0|P|1|M|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |r|l|B|F|X|X|Y|Y|
347           |---------------|     |---------------|    |---------------|    |---------------|
348
349     Byte 1: Bit7~Bit6 => 00, Normal data packet
350                     => 01, Absolute coordinates packet
351                     => 10, Notify packet
352             Bit5 => Coordinate mode(always 0 in SFAC mode):
353                     0: single-finger absolute coordinates (SFAC) mode
354                     1: multi-finger, multiple coordinates (MFMC) mode
355             Bit4 => 0: The LEFT button is generated by on-pad command (OPC)
356                     1: The LEFT button is generated by external button
357                     Default is 1 even if the LEFT button is not pressed.
358             Bit3 => Always 1, as specified by PS/2 protocol.
359             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
360             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
361             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
362     Byte 2: X coordinate (xpos[9:2])
363     Byte 3: Y coordinate (ypos[9:2])
364     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
365             Bit3~Bit2 => X coordinate (ypos[1:0])
366             Bit4 => 4th mouse button(forward one page)
367             Bit5 => 5th mouse button(backward one page)
368             Bit6 => scroll left button
369             Bit7 => scroll right button
370
371     Multi Finger, Multiple Coordinates Mode (MFMC):
372     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
373     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
374       1   |0|1|1|P|1|F|R|L|  2  |X|X|X|X|X|X|X|X|  3 |Y|Y|Y|Y|Y|Y|Y|Y|  4 |r|l|B|F|X|X|Y|Y|
375           |---------------|     |---------------|    |---------------|    |---------------|
376
377     Byte 1: Bit7~Bit6 => 00, Normal data packet
378                     => 01, Absolute coordination packet
379                     => 10, Notify packet
380             Bit5 => Coordinate mode (always 1 in MFMC mode):
381                     0: single-finger absolute coordinates (SFAC) mode
382                     1: multi-finger, multiple coordinates (MFMC) mode
383             Bit4 => 0: The LEFT button is generated by on-pad command (OPC)
384                     1: The LEFT button is generated by external button
385                     Default is 1 even if the LEFT button is not pressed.
386             Bit3 => Always 1, as specified by PS/2 protocol.
387             Bit2 => Finger index, 0 is the first finger, 1 is the second finger.
388                     If bit 1 and 0 are all 1 and bit 4 is 0, the middle external
389                     button is pressed.
390             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
391             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
392     Byte 2: X coordinate (xpos[9:2])
393     Byte 3: Y coordinate (ypos[9:2])
394     Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0])
395             Bit3~Bit2 => X coordinate (ypos[1:0])
396             Bit4 => 4th mouse button(forward one page)
397             Bit5 => 5th mouse button(backward one page)
398             Bit6 => scroll left button
399             Bit7 => scroll right button
400
401 When one of the two fingers is up, the device will output four consecutive
402 MFMC#0 report packets with zero X and Y to represent 1st finger is up or
403 four consecutive MFMC#1 report packets with zero X and Y to represent that
404 the 2nd finger is up.  On the other hand, if both fingers are up, the device
405 will output four consecutive single-finger, absolute coordinate(SFAC) packets
406 with zero X and Y.
407
408 Notify Packet for STL3888-Cx/Dx::
409
410     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
411     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
412       1   |1|0|0|P|1|M|R|L|  2  |C|C|C|C|C|C|C|C|  3 |0|0|F|F|0|0|0|i|  4 |r|l|u|d|0|0|0|0|
413           |---------------|     |---------------|    |---------------|    |---------------|
414
415     Byte 1: Bit7~Bit6 => 00, Normal data packet
416                     => 01, Absolute coordinates packet
417                     => 10, Notify packet
418             Bit5 => Always 0
419             Bit4 => 0: The LEFT button is generated by on-pad command(OPC)
420                     1: The LEFT button is generated by external button
421                     Default is 1 even if the LEFT button is not pressed.
422             Bit3 => 1
423             Bit2 => Middle Button, 1 is pressed, 0 is not pressed.
424             Bit1 => Right Button, 1 is pressed, 0 is not pressed.
425             Bit0 => Left Button, 1 is pressed, 0 is not pressed.
426     Byte 2: Message type:
427             0xba => gesture information
428             0xc0 => one finger hold-rotating gesture
429     Byte 3: The first parameter for the received message:
430             0xba => gesture ID (refer to the 'Gesture ID' section)
431             0xc0 => region ID
432     Byte 4: The second parameter for the received message:
433             0xba => N/A
434             0xc0 => finger up/down information
435
436 Sample sequence of Multi-finger, Multi-coordinates mode:
437
438         notify packet (valid bit == 1), MFMC packet 1 (byte 1, bit 2 == 0),
439         MFMC packet 2 (byte 1, bit 2 == 1), MFMC packet 1, MFMC packet 2,
440         ..., notify packet (valid bit == 0)
441
442         That is, when the device is in MFMC mode, the host will receive
443         interleaved absolute coordinate packets for each finger.
444
445 FSP Enable/Disable packet
446 =========================
447
448 ::
449
450     Bit 7 6 5 4 3 2 1 0       7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0      7 6 5 4 3 2 1 0
451     BYTE  |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------|
452       1   |Y|X|0|0|1|M|R|L|  2  |0|1|0|1|1|0|1|E|  3 | | | | | | | | |  4 | | | | | | | | |
453           |---------------|     |---------------|    |---------------|    |---------------|
454
455     FSP will send out enable/disable packet when FSP receive PS/2 enable/disable
456     command. Host will receive the packet which Middle, Right, Left button will
457     be set. The packet only use byte 0 and byte 1 as a pattern of original packet.
458     Ignore the other bytes of the packet.
459
460     Byte 1: Bit7 => 0, Y overflow
461             Bit6 => 0, X overflow
462             Bit5 => 0, Y sign bit
463             Bit4 => 0, X sign bit
464             Bit3 => 1
465             Bit2 => 1, Middle Button
466             Bit1 => 1, Right Button
467             Bit0 => 1, Left Button
468     Byte 2: Bit7~1 => (0101101b)
469             Bit0 => 1 = Enable
470                     0 = Disable
471     Byte 3: Don't care
472     Byte 4: Don't care (MOUSE ID 3, 4)
473     Byte 5~8: Don't care (Absolute packet)
474
475 PS/2 Command Set
476 ================
477
478 FSP supports basic PS/2 commanding set and modes, refer to following URL for
479 details about PS/2 commands:
480
481 http://www.computer-engineering.org/ps2mouse/
482
483 Programming Sequence for Determining Packet Parsing Flow
484 ========================================================
485
486 1. Identify FSP by reading device ID(0x00) and version(0x01) register
487
488 2. For FSP version < STL3888 Cx, determine number of buttons by reading
489    the 'test mode status' (0x20) register::
490
491         buttons = reg[0x20] & 0x30
492
493         if buttons == 0x30 or buttons == 0x20:
494                 # two/four buttons
495                 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse'
496                 section A for packet parsing detail(ignore byte 4, bit ~ 7)
497         elif buttons == 0x10:
498                 # 6 buttons
499                 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse'
500                 section B for packet parsing detail
501         elif buttons == 0x00:
502                 # 6 buttons
503                 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse'
504                 section A for packet parsing detail
505
506 3. For FSP version >= STL3888 Cx:
507         Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse'
508         section A for packet parsing detail (ignore byte 4, bit ~ 7)
509
510 Programming Sequence for Register Reading/Writing
511 =================================================
512
513 Register inversion requirement:
514
515 Following values needed to be inverted(the '~' operator in C) before being
516 sent to FSP::
517
518         0xe8, 0xe9, 0xee, 0xf2, 0xf3 and 0xff.
519
520 Register swapping requirement:
521
522 Following values needed to have their higher 4 bits and lower 4 bits being
523 swapped before being sent to FSP::
524
525         10, 20, 40, 60, 80, 100 and 200.
526
527 Register reading sequence:
528
529         1. send 0xf3 PS/2 command to FSP;
530
531         2. send 0x66 PS/2 command to FSP;
532
533         3. send 0x88 PS/2 command to FSP;
534
535         4. send 0xf3 PS/2 command to FSP;
536
537         5. if the register address being to read is not required to be
538         inverted(refer to the 'Register inversion requirement' section),
539         goto step 6
540
541           a. send 0x68 PS/2 command to FSP;
542
543           b. send the inverted register address to FSP and goto step 8;
544
545         6. if the register address being to read is not required to be
546         swapped(refer to the 'Register swapping requirement' section),
547         goto step 7
548
549           a. send 0xcc PS/2 command to FSP;
550
551           b. send the swapped register address to FSP and goto step 8;
552
553         7. send 0x66 PS/2 command to FSP;
554
555           a. send the original register address to FSP and goto step 8;
556
557         8. send 0xe9(status request) PS/2 command to FSP;
558
559         9. the 4th byte of the response read from FSP should be the
560         requested register value(?? indicates don't care byte)::
561
562                 host: 0xe9
563                 3888: 0xfa (??) (??) (val)
564
565         * Note that since the Cx release, the hardware will return 1's
566           complement of the register value at the 3rd byte of status request
567           result::
568
569                 host: 0xe9
570                 3888: 0xfa (??) (~val) (val)
571
572 Register writing sequence:
573
574         1. send 0xf3 PS/2 command to FSP;
575
576         2. if the register address being to write is not required to be
577         inverted(refer to the 'Register inversion requirement' section),
578         goto step 3
579
580           a. send 0x74 PS/2 command to FSP;
581
582           b. send the inverted register address to FSP and goto step 5;
583
584         3. if the register address being to write is not required to be
585         swapped(refer to the 'Register swapping requirement' section),
586         goto step 4
587
588           a. send 0x77 PS/2 command to FSP;
589
590           b. send the swapped register address to FSP and goto step 5;
591
592         4. send 0x55 PS/2 command to FSP;
593
594           a. send the register address to FSP and goto step 5;
595
596         5. send 0xf3 PS/2 command to FSP;
597
598         6. if the register value being to write is not required to be
599         inverted(refer to the 'Register inversion requirement' section),
600         goto step 7
601
602           a. send 0x47 PS/2 command to FSP;
603
604           b. send the inverted register value to FSP and goto step 9;
605
606         7. if the register value being to write is not required to be
607         swapped(refer to the 'Register swapping requirement' section),
608         goto step 8
609
610           a. send 0x44 PS/2 command to FSP;
611
612           b. send the swapped register value to FSP and goto step 9;
613
614         8. send 0x33 PS/2 command to FSP;
615
616           a. send the register value to FSP;
617
618         9. the register writing sequence is completed.
619
620         * Since the Cx release, the hardware will return 1's
621           complement of the register value at the 3rd byte of status request
622           result. Host can optionally send another 0xe9 (status request) PS/2
623           command to FSP at the end of register writing to verify that the
624           register writing operation is successful (?? indicates don't care
625           byte)::
626
627                 host: 0xe9
628                 3888: 0xfa (??) (~val) (val)
629
630 Programming Sequence for Page Register Reading/Writing
631 ======================================================
632
633 In order to overcome the limitation of maximum number of registers
634 supported, the hardware separates register into different groups called
635 'pages.' Each page is able to include up to 255 registers.
636
637 The default page after power up is 0x82; therefore, if one has to get
638 access to register 0x8301, one has to use following sequence to switch
639 to page 0x83, then start reading/writing from/to offset 0x01 by using
640 the register read/write sequence described in previous section.
641
642 Page register reading sequence:
643
644         1. send 0xf3 PS/2 command to FSP;
645
646         2. send 0x66 PS/2 command to FSP;
647
648         3. send 0x88 PS/2 command to FSP;
649
650         4. send 0xf3 PS/2 command to FSP;
651
652         5. send 0x83 PS/2 command to FSP;
653
654         6. send 0x88 PS/2 command to FSP;
655
656         7. send 0xe9(status request) PS/2 command to FSP;
657
658         8. the response read from FSP should be the requested page value.
659
660
661 Page register writing sequence:
662
663         1. send 0xf3 PS/2 command to FSP;
664
665         2. send 0x38 PS/2 command to FSP;
666
667         3. send 0x88 PS/2 command to FSP;
668
669         4. send 0xf3 PS/2 command to FSP;
670
671         5. if the page address being written is not required to be
672         inverted(refer to the 'Register inversion requirement' section),
673         goto step 6
674
675           a. send 0x47 PS/2 command to FSP;
676
677           b. send the inverted page address to FSP and goto step 9;
678
679         6. if the page address being written is not required to be
680         swapped(refer to the 'Register swapping requirement' section),
681         goto step 7
682
683           a. send 0x44 PS/2 command to FSP;
684
685           b. send the swapped page address to FSP and goto step 9;
686
687         7. send 0x33 PS/2 command to FSP;
688
689         8. send the page address to FSP;
690
691         9. the page register writing sequence is completed.
692
693 Gesture ID
694 ==========
695
696 Unlike other devices which sends multiple fingers' coordinates to host,
697 FSP processes multiple fingers' coordinates internally and convert them
698 into a 8 bits integer, namely 'Gesture ID.'  Following is a list of
699 supported gesture IDs:
700
701         ======= ==================================
702         ID      Description
703         ======= ==================================
704         0x86    2 finger straight up
705         0x82    2 finger straight down
706         0x80    2 finger straight right
707         0x84    2 finger straight left
708         0x8f    2 finger zoom in
709         0x8b    2 finger zoom out
710         0xc0    2 finger curve, counter clockwise
711         0xc4    2 finger curve, clockwise
712         0x2e    3 finger straight up
713         0x2a    3 finger straight down
714         0x28    3 finger straight right
715         0x2c    3 finger straight left
716         0x38    palm
717         ======= ==================================
718
719 Register Listing
720 ================
721
722 Registers are represented in 16 bits values. The higher 8 bits represent
723 the page address and the lower 8 bits represent the relative offset within
724 that particular page.  Refer to the 'Programming Sequence for Page Register
725 Reading/Writing' section for instructions on how to change current page
726 address::
727
728  offset width           default r/w     name
729  0x8200 bit7~bit0       0x01    RO      device ID
730
731  0x8201 bit7~bit0               RW      version ID
732                                         0xc1: STL3888 Ax
733                                         0xd0 ~ 0xd2: STL3888 Bx
734                                         0xe0 ~ 0xe1: STL3888 Cx
735                                         0xe2 ~ 0xe3: STL3888 Dx
736
737  0x8202 bit7~bit0       0x01    RO      vendor ID
738
739  0x8203 bit7~bit0       0x01    RO      product ID
740
741  0x8204 bit3~bit0       0x01    RW      revision ID
742
743  0x820b                                 test mode status 1
744         bit3            1       RO      0: rotate 180 degree
745                                         1: no rotation
746                                         *only supported by H/W prior to Cx
747
748  0x820f                                 register file page control
749         bit2            0       RW      1: rotate 180 degree
750                                         0: no rotation
751                                         *supported since Cx
752
753         bit0            0       RW      1 to enable page 1 register files
754                                         *only supported by H/W prior to Cx
755
756  0x8210                         RW      system control 1
757         bit0            1       RW      Reserved, must be 1
758         bit1            0       RW      Reserved, must be 0
759         bit4            0       RW      Reserved, must be 0
760         bit5            1       RW      register clock gating enable
761                                         0: read only, 1: read/write enable
762         (Note that following registers does not require clock gating being
763         enabled prior to write: 05 06 07 08 09 0c 0f 10 11 12 16 17 18 23 2e
764         40 41 42 43.  In addition to that, this bit must be 1 when gesture
765         mode is enabled)
766
767  0x8220                                 test mode status
768         bit5~bit4               RO      number of buttons
769                                         11 => 2, lbtn/rbtn
770                                         10 => 4, lbtn/rbtn/scru/scrd
771                                         01 => 6, lbtn/rbtn/scru/scrd/scrl/scrr
772                                         00 => 6, lbtn/rbtn/scru/scrd/fbtn/bbtn
773                                         *only supported by H/W prior to Cx
774
775  0x8231                         RW      on-pad command detection
776         bit7            0       RW      on-pad command left button down tag
777                                         enable
778                                         0: disable, 1: enable
779                                         *only supported by H/W prior to Cx
780
781  0x8234                         RW      on-pad command control 5
782         bit4~bit0       0x05    RW      XLO in 0s/4/1, so 03h = 0010.1b = 2.5
783         (Note that position unit is in 0.5 scanline)
784                                         *only supported by H/W prior to Cx
785
786         bit7            0       RW      on-pad tap zone enable
787                                         0: disable, 1: enable
788                                         *only supported by H/W prior to Cx
789
790  0x8235                         RW      on-pad command control 6
791         bit4~bit0       0x1d    RW      XHI in 0s/4/1, so 19h = 1100.1b = 12.5
792         (Note that position unit is in 0.5 scanline)
793                                         *only supported by H/W prior to Cx
794
795  0x8236                         RW      on-pad command control 7
796         bit4~bit0       0x04    RW      YLO in 0s/4/1, so 03h = 0010.1b = 2.5
797         (Note that position unit is in 0.5 scanline)
798                                         *only supported by H/W prior to Cx
799
800  0x8237                         RW      on-pad command control 8
801         bit4~bit0       0x13    RW      YHI in 0s/4/1, so 11h = 1000.1b = 8.5
802         (Note that position unit is in 0.5 scanline)
803                                         *only supported by H/W prior to Cx
804
805  0x8240                         RW      system control 5
806         bit1            0       RW      FSP Intellimouse mode enable
807                                         0: disable, 1: enable
808                                         *only supported by H/W prior to Cx
809
810         bit2            0       RW      movement + abs. coordinate mode enable
811                                         0: disable, 1: enable
812         (Note that this function has the functionality of bit 1 even when
813         bit 1 is not set. However, the format is different from that of bit 1.
814         In addition, when bit 1 and bit 2 are set at the same time, bit 2 will
815         override bit 1.)
816                                         *only supported by H/W prior to Cx
817
818         bit3            0       RW      abs. coordinate only mode enable
819                                         0: disable, 1: enable
820         (Note that this function has the functionality of bit 1 even when
821         bit 1 is not set. However, the format is different from that of bit 1.
822         In addition, when bit 1, bit 2 and bit 3 are set at the same time,
823         bit 3 will override bit 1 and 2.)
824                                         *only supported by H/W prior to Cx
825
826         bit5            0       RW      auto switch enable
827                                         0: disable, 1: enable
828                                         *only supported by H/W prior to Cx
829
830         bit6            0       RW      G0 abs. + notify packet format enable
831                                         0: disable, 1: enable
832         (Note that the absolute/relative coordinate output still depends on
833         bit 2 and 3.  That is, if any of those bit is 1, host will receive
834         absolute coordinates; otherwise, host only receives packets with
835         relative coordinate.)
836                                         *only supported by H/W prior to Cx
837
838         bit7            0       RW      EN_PS2_F2: PS/2 gesture mode 2nd
839                                         finger packet enable
840                                         0: disable, 1: enable
841                                         *only supported by H/W prior to Cx
842
843  0x8243                         RW      on-pad control
844         bit0            0       RW      on-pad control enable
845                                         0: disable, 1: enable
846         (Note that if this bit is cleared, bit 3/5 will be ineffective)
847                                         *only supported by H/W prior to Cx
848
849         bit3            0       RW      on-pad fix vertical scrolling enable
850                                         0: disable, 1: enable
851                                         *only supported by H/W prior to Cx
852
853         bit5            0       RW      on-pad fix horizontal scrolling enable
854                                         0: disable, 1: enable
855                                         *only supported by H/W prior to Cx
856
857  0x8290                         RW      software control register 1
858         bit0            0       RW      absolute coordination mode
859                                         0: disable, 1: enable
860                                         *supported since Cx
861
862         bit1            0       RW      gesture ID output
863                                         0: disable, 1: enable
864                                         *supported since Cx
865
866         bit2            0       RW      two fingers' coordinates output
867                                         0: disable, 1: enable
868                                         *supported since Cx
869
870         bit3            0       RW      finger up one packet output
871                                         0: disable, 1: enable
872                                         *supported since Cx
873
874         bit4            0       RW      absolute coordination continuous mode
875                                         0: disable, 1: enable
876                                         *supported since Cx
877
878         bit6~bit5       00      RW      gesture group selection
879                                         00: basic
880                                         01: suite
881                                         10: suite pro
882                                         11: advanced
883                                         *supported since Cx
884
885         bit7            0       RW      Bx packet output compatible mode
886                                         0: disable, 1: enable
887                                         *supported since Cx
888                                         *supported since Cx
889
890
891  0x833d                         RW      on-pad command control 1
892         bit7            1       RW      on-pad command detection enable
893                                         0: disable, 1: enable
894                                         *supported since Cx
895
896  0x833e                         RW      on-pad command detection
897         bit7            0       RW      on-pad command left button down tag
898                                         enable. Works only in H/W based PS/2
899                                         data packet mode.
900                                         0: disable, 1: enable
901                                         *supported since Cx