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