1 .. include:: <isonum.txt>
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
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.
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
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.
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
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
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.
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
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])
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
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)
145 Mode Type => 0x00 (Normal)
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
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
169 Bit2 => Left Button, 1 is pressed, 0 is released.
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])
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
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
194 Bit2 => Right Button, 1 is pressed, 0 is released.
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])
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
213 => 11, Normal data packet with on-pad click
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
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
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
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
259 Bit4 => finger up/down information. 1: finger down, 0: finger up.
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
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
286 Bit4 => finger up/down information. 1: finger down, 0: finger up.
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
310 => 11, Normal data packet with on-pad click
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
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
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
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
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
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
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
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.
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)
432 Byte 4: The second parameter for the received message:
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
465 Bit2 => 1, Middle Button
466 Bit1 => 1, Right Button
467 Bit0 => 1, Left Button
468 Byte 2: Bit7~1 => (0101101b)
472 Byte 4: Don't care (MOUSE ID 3, 4)
473 Byte 5~8: Don't care (Absolute packet)
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:
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:
499 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse'
500 section B for packet parsing detail
501 elif buttons == 0x00:
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
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),
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),
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)::
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
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),
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),
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),
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),
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
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),
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),
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.
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 ======= ==================================
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
717 ======= ==================================
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
728 offset width default r/w name
729 0x8200 bit7~bit0 0x01 RO device ID
731 0x8201 bit7~bit0 RW version ID
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
746 *only supported by H/W prior to Cx
748 0x820f register file page control
749 bit2 0 RW 1: rotate 180 degree
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
767 0x8220 test mode status
768 bit5~bit4 RO number of buttons
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
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
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
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
862 bit1 0 RW gesture ID output
863 0: disable, 1: enable
866 bit2 0 RW two fingers' coordinates output
867 0: disable, 1: enable
870 bit3 0 RW finger up one packet output
871 0: disable, 1: enable
874 bit4 0 RW absolute coordination continuous mode
875 0: disable, 1: enable
878 bit6~bit5 00 RW gesture group selection
885 bit7 0 RW Bx packet output compatible mode
886 0: disable, 1: enable
891 0x833d RW on-pad command control 1
892 bit7 1 RW on-pad command detection enable
893 0: disable, 1: enable
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
900 0: disable, 1: enable