cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sentelic.rst (32443B)


      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