1.. include:: <isonum.txt>
2
3=================
4Sentelic Touchpad
5=================
6
7
8:Copyright: |copy| 2002-2011 Sentelic Corporation.
9
10:Last update: Dec-07-2011
11
12Finger Sensing Pad Intellimouse Mode (scrolling wheel, 4th and 5th buttons)
13============================================================================
14
15A) MSID 4: Scrolling wheel mode plus Forward page(4th button) and Backward
16   page (5th button)
17
181. Set sample rate to 200;
192. Set sample rate to 200;
203. Set sample rate to 80;
214. Issuing the "Get device ID" command (0xF2) and waits for the response;
225. 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
49B) MSID 6: Horizontal and Vertical scrolling
50
51- Set bit 1 in register 0x40 to 1
52
53FSP replaces scrolling wheel's movement as 4 bits to show horizontal and
54vertical 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
83C) MSID 7
84
85FSP uses 2 packets (8 Bytes) to represent Absolute Position.
86so 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
92MSID6 special packet will be enable at the same time when enable MSID 7.
93
94Absolute position for STL3886-G0
95================================
96
971. Set bit 2 or 3 in register 0x40 to 1
982. 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
149Absolute 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
236Sample 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
241Absolute 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
300Notify 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
333Sample 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
338Absolute 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
401When one of the two fingers is up, the device will output four consecutive
402MFMC#0 report packets with zero X and Y to represent 1st finger is up or
403four consecutive MFMC#1 report packets with zero X and Y to represent that
404the 2nd finger is up.  On the other hand, if both fingers are up, the device
405will output four consecutive single-finger, absolute coordinate(SFAC) packets
406with zero X and Y.
407
408Notify 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
436Sample 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
445FSP 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
475PS/2 Command Set
476================
477
478FSP supports basic PS/2 commanding set and modes, refer to following URL for
479details about PS/2 commands:
480
481http://www.computer-engineering.org/ps2mouse/
482
483Programming Sequence for Determining Packet Parsing Flow
484========================================================
485
4861. Identify FSP by reading device ID(0x00) and version(0x01) register
487
4882. 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
5063. 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
510Programming Sequence for Register Reading/Writing
511=================================================
512
513Register inversion requirement:
514
515Following values needed to be inverted(the '~' operator in C) before being
516sent to FSP::
517
518	0xe8, 0xe9, 0xee, 0xf2, 0xf3 and 0xff.
519
520Register swapping requirement:
521
522Following values needed to have their higher 4 bits and lower 4 bits being
523swapped before being sent to FSP::
524
525	10, 20, 40, 60, 80, 100 and 200.
526
527Register 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
572Register 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
630Programming Sequence for Page Register Reading/Writing
631======================================================
632
633In order to overcome the limitation of maximum number of registers
634supported, the hardware separates register into different groups called
635'pages.' Each page is able to include up to 255 registers.
636
637The default page after power up is 0x82; therefore, if one has to get
638access to register 0x8301, one has to use following sequence to switch
639to page 0x83, then start reading/writing from/to offset 0x01 by using
640the register read/write sequence described in previous section.
641
642Page 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
661Page 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
693Gesture ID
694==========
695
696Unlike other devices which sends multiple fingers' coordinates to host,
697FSP processes multiple fingers' coordinates internally and convert them
698into a 8 bits integer, namely 'Gesture ID.'  Following is a list of
699supported 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
719Register Listing
720================
721
722Registers are represented in 16 bits values. The higher 8 bits represent
723the page address and the lower 8 bits represent the relative offset within
724that particular page.  Refer to the 'Programming Sequence for Page Register
725Reading/Writing' section for instructions on how to change current page
726address::
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
902