treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / Documentation / input / devices / sentelic.rst
blobd7ad603dd77e26ad78ee0bff5d2261c97e3bcc42
1 .. include:: <isonum.txt>
3 =================
4 Sentelic Touchpad
5 =================
8 :Copyright: |copy| 2002-2011 Sentelic Corporation.
10 :Last update: Dec-07-2011
12 Finger Sensing Pad Intellimouse Mode (scrolling wheel, 4th and 5th buttons)
13 ============================================================================
15 A) MSID 4: Scrolling wheel mode plus Forward page(4th button) and Backward
16    page (5th button)
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.
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           |---------------|     |---------------|    |---------------|    |---------------|
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.
49 B) MSID 6: Horizontal and Vertical scrolling
51 - Set bit 1 in register 0x40 to 1
53 FSP replaces scrolling wheel's movement as 4 bits to show horizontal and
54 vertical scrolling.
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           |---------------|     |---------------|    |---------------|    |---------------|
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.
83 C) MSID 7
85 FSP uses 2 packets (8 Bytes) to represent Absolute Position.
86 so we have PACKET NUMBER to identify packets.
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.
92 MSID6 special packet will be enable at the same time when enable MSID 7.
94 Absolute position for STL3886-G0
95 ================================
97 1. Set bit 2 or 3 in register 0x40 to 1
98 2. Set bit 6 in register 0x40 to 1
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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           |---------------|     |---------------|    |---------------|    |---------------|
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
149 Absolute position for STL3888-Ax
150 ================================
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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           |---------------|     |---------------|    |---------------|    |---------------|
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
236 Sample sequence of Multi-finger, Multi-coordinate mode:
238         notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1,
239         abs pkt 2, ..., notify packet (valid bit == 0)
241 Absolute position for STL3888-B0
242 ================================
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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           |---------------|     |---------------|    |---------------|    |---------------|
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
300 Notify Packet for STL3888-B0::
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           |---------------|     |---------------|    |---------------|    |---------------|
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
333 Sample sequence of Multi-finger, Multi-coordinate mode:
335         notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1,
336         abs pkt 2, ..., notify packet (valid bit == 0)
338 Absolute position for STL3888-Cx and STL3888-Dx
339 ===============================================
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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           |---------------|     |---------------|    |---------------|    |---------------|
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
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.
408 Notify Packet for STL3888-Cx/Dx::
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           |---------------|     |---------------|    |---------------|    |---------------|
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
436 Sample sequence of Multi-finger, Multi-coordinates mode:
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)
442         That is, when the device is in MFMC mode, the host will receive
443         interleaved absolute coordinate packets for each finger.
445 FSP Enable/Disable packet
446 =========================
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           |---------------|     |---------------|    |---------------|    |---------------|
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.
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)
475 PS/2 Command Set
476 ================
478 FSP supports basic PS/2 commanding set and modes, refer to following URL for
479 details about PS/2 commands:
481 http://www.computer-engineering.org/ps2mouse/
483 Programming Sequence for Determining Packet Parsing Flow
484 ========================================================
486 1. Identify FSP by reading device ID(0x00) and version(0x01) register
488 2. For FSP version < STL3888 Cx, determine number of buttons by reading
489    the 'test mode status' (0x20) register::
491         buttons = reg[0x20] & 0x30
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
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)
510 Programming Sequence for Register Reading/Writing
511 =================================================
513 Register inversion requirement:
515 Following values needed to be inverted(the '~' operator in C) before being
516 sent to FSP::
518         0xe8, 0xe9, 0xee, 0xf2, 0xf3 and 0xff.
520 Register swapping requirement:
522 Following values needed to have their higher 4 bits and lower 4 bits being
523 swapped before being sent to FSP::
525         10, 20, 40, 60, 80, 100 and 200.
527 Register reading sequence:
529         1. send 0xf3 PS/2 command to FSP;
531         2. send 0x66 PS/2 command to FSP;
533         3. send 0x88 PS/2 command to FSP;
535         4. send 0xf3 PS/2 command to FSP;
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
541           a. send 0x68 PS/2 command to FSP;
543           b. send the inverted register address to FSP and goto step 8;
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
549           a. send 0xcc PS/2 command to FSP;
551           b. send the swapped register address to FSP and goto step 8;
553         7. send 0x66 PS/2 command to FSP;
555           a. send the original register address to FSP and goto step 8;
557         8. send 0xe9(status request) PS/2 command to FSP;
559         9. the 4th byte of the response read from FSP should be the
560         requested register value(?? indicates don't care byte)::
562                 host: 0xe9
563                 3888: 0xfa (??) (??) (val)
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::
569                 host: 0xe9
570                 3888: 0xfa (??) (~val) (val)
572 Register writing sequence:
574         1. send 0xf3 PS/2 command to FSP;
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
580           a. send 0x74 PS/2 command to FSP;
582           b. send the inverted register address to FSP and goto step 5;
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
588           a. send 0x77 PS/2 command to FSP;
590           b. send the swapped register address to FSP and goto step 5;
592         4. send 0x55 PS/2 command to FSP;
594           a. send the register address to FSP and goto step 5;
596         5. send 0xf3 PS/2 command to FSP;
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
602           a. send 0x47 PS/2 command to FSP;
604           b. send the inverted register value to FSP and goto step 9;
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
610           a. send 0x44 PS/2 command to FSP;
612           b. send the swapped register value to FSP and goto step 9;
614         8. send 0x33 PS/2 command to FSP;
616           a. send the register value to FSP;
618         9. the register writing sequence is completed.
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)::
627                 host: 0xe9
628                 3888: 0xfa (??) (~val) (val)
630 Programming Sequence for Page Register Reading/Writing
631 ======================================================
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.
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.
642 Page register reading sequence:
644         1. send 0xf3 PS/2 command to FSP;
646         2. send 0x66 PS/2 command to FSP;
648         3. send 0x88 PS/2 command to FSP;
650         4. send 0xf3 PS/2 command to FSP;
652         5. send 0x83 PS/2 command to FSP;
654         6. send 0x88 PS/2 command to FSP;
656         7. send 0xe9(status request) PS/2 command to FSP;
658         8. the response read from FSP should be the requested page value.
661 Page register writing sequence:
663         1. send 0xf3 PS/2 command to FSP;
665         2. send 0x38 PS/2 command to FSP;
667         3. send 0x88 PS/2 command to FSP;
669         4. send 0xf3 PS/2 command to FSP;
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
675           a. send 0x47 PS/2 command to FSP;
677           b. send the inverted page address to FSP and goto step 9;
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
683           a. send 0x44 PS/2 command to FSP;
685           b. send the swapped page address to FSP and goto step 9;
687         7. send 0x33 PS/2 command to FSP;
689         8. send the page address to FSP;
691         9. the page register writing sequence is completed.
693 Gesture ID
694 ==========
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:
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         ======= ==================================
719 Register Listing
720 ================
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::
728  offset width           default r/w     name
729  0x8200 bit7~bit0       0x01    RO      device ID
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
737  0x8202 bit7~bit0       0x01    RO      vendor ID
739  0x8203 bit7~bit0       0x01    RO      product ID
741  0x8204 bit3~bit0       0x01    RW      revision ID
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
748  0x820f                                 register file page control
749         bit2            0       RW      1: rotate 180 degree
750                                         0: no rotation
751                                         *supported since Cx
753         bit0            0       RW      1 to enable page 1 register files
754                                         *only supported by H/W prior to Cx
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)
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
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
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
786         bit7            0       RW      on-pad tap zone enable
787                                         0: disable, 1: enable
788                                         *only supported by H/W prior to Cx
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
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
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
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
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
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
826         bit5            0       RW      auto switch enable
827                                         0: disable, 1: enable
828                                         *only supported by H/W prior to Cx
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
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
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
849         bit3            0       RW      on-pad fix vertical scrolling enable
850                                         0: disable, 1: enable
851                                         *only supported by H/W prior to Cx
853         bit5            0       RW      on-pad fix horizontal scrolling enable
854                                         0: disable, 1: enable
855                                         *only supported by H/W prior to Cx
857  0x8290                         RW      software control register 1
858         bit0            0       RW      absolute coordination mode
859                                         0: disable, 1: enable
860                                         *supported since Cx
862         bit1            0       RW      gesture ID output
863                                         0: disable, 1: enable
864                                         *supported since Cx
866         bit2            0       RW      two fingers' coordinates output
867                                         0: disable, 1: enable
868                                         *supported since Cx
870         bit3            0       RW      finger up one packet output
871                                         0: disable, 1: enable
872                                         *supported since Cx
874         bit4            0       RW      absolute coordination continuous mode
875                                         0: disable, 1: enable
876                                         *supported since Cx
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
885         bit7            0       RW      Bx packet output compatible mode
886                                         0: disable, 1: enable
887                                         *supported since Cx
888                                         *supported since Cx
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
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