1Copyright (C) 2002-2008 Sentelic Corporation. 2Last update: Oct-31-2008 3 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|---------------| 47 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|l|r|u|d| 48 |---------------| |---------------| |---------------| |---------------| 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. 62 Bit2 => the Vertical scrolling movement rightward. 63 Bit3 => the Vertical scrolling movement leftward. 64 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: 70# FSP uses 2 packets(8 Bytes) data to represent Absolute Position 71 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============================================================================== 132* Absolute position for STL3888-A0. 133============================================================================== 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 143 Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up. 144 When both fingers are up, the last two reports have zero valid 145 bit. 146 Bit4 => arc 147 Bit3 => 1 148 Bit2 => Left Button, 1 is pressed, 0 is released. 149 Bit1 => 0 150 Bit0 => 1 151Byte 2: X coordinate (xpos[9:2]) 152Byte 3: Y coordinate (ypos[9:2]) 153Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0]) 154 Bit3~Bit2 => X coordinate (ypos[1:0]) 155 Bit5~Bit4 => y1_g 156 Bit7~Bit6 => x1_g 157 158Packet 2 (ABSOLUTE POSITION) 159 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 160BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| 161 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| 162 |---------------| |---------------| |---------------| |---------------| 163 164Byte 1: Bit7~Bit6 => 00, Normal data packet 165 => 01, Absolute coordinates packet 166 => 10, Notify packet 167 Bit5 => Valid bit, 0 means that the coordinate is invalid or finger up. 168 When both fingers are up, the last two reports have zero valid 169 bit. 170 Bit4 => arc 171 Bit3 => 1 172 Bit2 => Right Button, 1 is pressed, 0 is released. 173 Bit1 => 1 174 Bit0 => 0 175Byte 2: X coordinate (xpos[9:2]) 176Byte 3: Y coordinate (ypos[9:2]) 177Byte 4: Bit1~Bit0 => Y coordinate (xpos[1:0]) 178 Bit3~Bit2 => X coordinate (ypos[1:0]) 179 Bit5~Bit4 => y2_g 180 Bit7~Bit6 => x2_g 181 182Notify Packet for STL3888-A0 183 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 184BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| 185 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| 186 |---------------| |---------------| |---------------| |---------------| 187 188Byte 1: Bit7~Bit6 => 00, Normal data packet 189 => 01, Absolute coordination packet 190 => 10, Notify packet 191 Bit5 => 1 192 Bit4 => when in absolute coordinates mode (valid when EN_PKT_GO is 1): 193 0: left button is generated by the on-pad command 194 1: left button is generated by the external button 195 Bit3 => 1 196 Bit2 => Middle Button, 1 is pressed, 0 is not pressed. 197 Bit1 => Right Button, 1 is pressed, 0 is not pressed. 198 Bit0 => Left Button, 1 is pressed, 0 is not pressed. 199Byte 2: Message Type => 0xB7 (Multi Finger, Multi Coordinate mode) 200Byte 3: Bit7~Bit6 => Don't care 201 Bit5~Bit4 => Number of fingers 202 Bit3~Bit1 => Reserved 203 Bit0 => 1: enter gesture mode; 0: leaving gesture mode 204Byte 4: Bit7 => scroll right button 205 Bit6 => scroll left button 206 Bit5 => scroll down button 207 Bit4 => scroll up button 208 * Note that if gesture and additional button (Bit4~Bit7) 209 happen at the same time, the button information will not 210 be sent. 211 Bit3~Bit0 => Reserved 212 213Sample sequence of Multi-finger, Multi-coordinate mode: 214 215 notify packet (valid bit == 1), abs pkt 1, abs pkt 2, abs pkt 1, 216 abs pkt 2, ..., notify packet(valid bit == 0) 217 218============================================================================== 219* FSP Enable/Disable packet 220============================================================================== 221 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 222BYTE |---------------|BYTE |---------------|BYTE|---------------|BYTE|---------------| 223 1 |Y|X|0|0|1|M|R|L| 2 |0|1|0|1|1|0|1|E| 3 | | | | | | | | | 4 | | | | | | | | | 224 |---------------| |---------------| |---------------| |---------------| 225 226FSP will send out enable/disable packet when FSP receive PS/2 enable/disable 227command. Host will receive the packet which Middle, Right, Left button will 228be set. The packet only use byte 0 and byte 1 as a pattern of original packet. 229Ignore the other bytes of the packet. 230 231Byte 1: Bit7 => 0, Y overflow 232 Bit6 => 0, X overflow 233 Bit5 => 0, Y sign bit 234 Bit4 => 0, X sign bit 235 Bit3 => 1 236 Bit2 => 1, Middle Button 237 Bit1 => 1, Right Button 238 Bit0 => 1, Left Button 239Byte 2: Bit7~1 => (0101101b) 240 Bit0 => 1 = Enable 241 0 = Disable 242Byte 3: Don't care 243Byte 4: Don't care (MOUSE ID 3, 4) 244Byte 5~8: Don't care (Absolute packet) 245 246============================================================================== 247* PS/2 Command Set 248============================================================================== 249 250FSP supports basic PS/2 commanding set and modes, refer to following URL for 251details about PS/2 commands: 252 253http://www.computer-engineering.org/index.php?title=PS/2_Mouse_Interface 254 255============================================================================== 256* Programming Sequence for Determining Packet Parsing Flow 257============================================================================== 2581. Identify FSP by reading device ID(0x00) and version(0x01) register 259 2602. Determine number of buttons by reading status2 (0x0b) register 261 262 buttons = reg[0x0b] & 0x30 263 264 if buttons == 0x30 or buttons == 0x20: 265 # two/four buttons 266 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse' 267 section A for packet parsing detail(ignore byte 4, bit ~ 7) 268 elif buttons == 0x10: 269 # 6 buttons 270 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse' 271 section B for packet parsing detail 272 elif buttons == 0x00: 273 # 6 buttons 274 Refer to 'Finger Sensing Pad PS/2 Mouse Intellimouse' 275 section A for packet parsing detail 276 277============================================================================== 278* Programming Sequence for Register Reading/Writing 279============================================================================== 280 281Register inversion requirement: 282 283 Following values needed to be inverted(the '~' operator in C) before being 284sent to FSP: 285 286 0xe9, 0xee, 0xf2 and 0xff. 287 288Register swapping requirement: 289 290 Following values needed to have their higher 4 bits and lower 4 bits being 291swapped before being sent to FSP: 292 293 10, 20, 40, 60, 80, 100 and 200. 294 295Register reading sequence: 296 297 1. send 0xf3 PS/2 command to FSP; 298 299 2. send 0x66 PS/2 command to FSP; 300 301 3. send 0x88 PS/2 command to FSP; 302 303 4. send 0xf3 PS/2 command to FSP; 304 305 5. if the register address being to read is not required to be 306 inverted(refer to the 'Register inversion requirement' section), 307 goto step 6 308 309 5a. send 0x68 PS/2 command to FSP; 310 311 5b. send the inverted register address to FSP and goto step 8; 312 313 6. if the register address being to read is not required to be 314 swapped(refer to the 'Register swapping requirement' section), 315 goto step 7 316 317 6a. send 0xcc PS/2 command to FSP; 318 319 6b. send the swapped register address to FSP and goto step 8; 320 321 7. send 0x66 PS/2 command to FSP; 322 323 7a. send the original register address to FSP and goto step 8; 324 325 8. send 0xe9(status request) PS/2 command to FSP; 326 327 9. the response read from FSP should be the requested register value. 328 329Register writing sequence: 330 331 1. send 0xf3 PS/2 command to FSP; 332 333 2. if the register address being to write is not required to be 334 inverted(refer to the 'Register inversion requirement' section), 335 goto step 3 336 337 2a. send 0x74 PS/2 command to FSP; 338 339 2b. send the inverted register address to FSP and goto step 5; 340 341 3. if the register address being to write is not required to be 342 swapped(refer to the 'Register swapping requirement' section), 343 goto step 4 344 345 3a. send 0x77 PS/2 command to FSP; 346 347 3b. send the swapped register address to FSP and goto step 5; 348 349 4. send 0x55 PS/2 command to FSP; 350 351 4a. send the register address to FSP and goto step 5; 352 353 5. send 0xf3 PS/2 command to FSP; 354 355 6. if the register value being to write is not required to be 356 inverted(refer to the 'Register inversion requirement' section), 357 goto step 7 358 359 6a. send 0x47 PS/2 command to FSP; 360 361 6b. send the inverted register value to FSP and goto step 9; 362 363 7. if the register value being to write is not required to be 364 swapped(refer to the 'Register swapping requirement' section), 365 goto step 8 366 367 7a. send 0x44 PS/2 command to FSP; 368 369 7b. send the swapped register value to FSP and goto step 9; 370 371 8. send 0x33 PS/2 command to FSP; 372 373 8a. send the register value to FSP; 374 375 9. the register writing sequence is completed. 376 377============================================================================== 378* Register Listing 379============================================================================== 380 381offset width default r/w name 3820x00 bit7~bit0 0x01 RO device ID 383 3840x01 bit7~bit0 0xc0 RW version ID 385 3860x02 bit7~bit0 0x01 RO vendor ID 387 3880x03 bit7~bit0 0x01 RO product ID 389 3900x04 bit3~bit0 0x01 RW revision ID 391 3920x0b RO test mode status 1 393 bit3 1 RO 0: rotate 180 degree, 1: no rotation 394 395 bit5~bit4 RO number of buttons 396 11 => 2, lbtn/rbtn 397 10 => 4, lbtn/rbtn/scru/scrd 398 01 => 6, lbtn/rbtn/scru/scrd/scrl/scrr 399 00 => 6, lbtn/rbtn/scru/scrd/fbtn/bbtn 400 4010x0f RW register file page control 402 bit0 0 RW 1 to enable page 1 register files 403 4040x10 RW system control 1 405 bit0 1 RW Reserved, must be 1 406 bit1 0 RW Reserved, must be 0 407 bit4 1 RW Reserved, must be 0 408 bit5 0 RW register clock gating enable 409 0: read only, 1: read/write enable 410 (Note that following registers does not require clock gating being 411 enabled prior to write: 05 06 07 08 09 0c 0f 10 11 12 16 17 18 23 2e 412 40 41 42 43.) 413 4140x31 RW on-pad command detection 415 bit7 0 RW on-pad command left button down tag 416 enable 417 0: disable, 1: enable 418 4190x34 RW on-pad command control 5 420 bit4~bit0 0x05 RW XLO in 0s/4/1, so 03h = 0010.1b = 2.5 421 (Note that position unit is in 0.5 scanline) 422 423 bit7 0 RW on-pad tap zone enable 424 0: disable, 1: enable 425 4260x35 RW on-pad command control 6 427 bit4~bit0 0x1d RW XHI in 0s/4/1, so 19h = 1100.1b = 12.5 428 (Note that position unit is in 0.5 scanline) 429 4300x36 RW on-pad command control 7 431 bit4~bit0 0x04 RW YLO in 0s/4/1, so 03h = 0010.1b = 2.5 432 (Note that position unit is in 0.5 scanline) 433 4340x37 RW on-pad command control 8 435 bit4~bit0 0x13 RW YHI in 0s/4/1, so 11h = 1000.1b = 8.5 436 (Note that position unit is in 0.5 scanline) 437 4380x40 RW system control 5 439 bit1 0 RW FSP Intellimouse mode enable 440 0: disable, 1: enable 441 442 bit2 0 RW movement + abs. coordinate mode enable 443 0: disable, 1: enable 444 (Note that this function has the functionality of bit 1 even when 445 bit 1 is not set. However, the format is different from that of bit 1. 446 In addition, when bit 1 and bit 2 are set at the same time, bit 2 will 447 override bit 1.) 448 449 bit3 0 RW abs. coordinate only mode enable 450 0: disable, 1: enable 451 (Note that this function has the functionality of bit 1 even when 452 bit 1 is not set. However, the format is different from that of bit 1. 453 In addition, when bit 1, bit 2 and bit 3 are set at the same time, 454 bit 3 will override bit 1 and 2.) 455 456 bit5 0 RW auto switch enable 457 0: disable, 1: enable 458 459 bit6 0 RW G0 abs. + notify packet format enable 460 0: disable, 1: enable 461 (Note that the absolute/relative coordinate output still depends on 462 bit 2 and 3. That is, if any of those bit is 1, host will receive 463 absolute coordinates; otherwise, host only receives packets with 464 relative coordinate.) 465 4660x43 RW on-pad control 467 bit0 0 RW on-pad control enable 468 0: disable, 1: enable 469 (Note that if this bit is cleared, bit 3/5 will be ineffective) 470 471 bit3 0 RW on-pad fix vertical scrolling enable 472 0: disable, 1: enable 473 474 bit5 0 RW on-pad fix horizontal scrolling enable 475 0: disable, 1: enable 476

