Back to home page

OSCL-LXR

 
 

    


0001 ----------------------
0002 ALPS Touchpad Protocol
0003 ----------------------
0004 
0005 Introduction
0006 ------------
0007 Currently the ALPS touchpad driver supports seven protocol versions in use by
0008 ALPS touchpads, called versions 1, 2, 3, 4, 5, 6, 7 and 8.
0009 
0010 Since roughly mid-2010 several new ALPS touchpads have been released and
0011 integrated into a variety of laptops and netbooks.  These new touchpads
0012 have enough behavior differences that the alps_model_data definition
0013 table, describing the properties of the different versions, is no longer
0014 adequate.  The design choices were to re-define the alps_model_data
0015 table, with the risk of regression testing existing devices, or isolate
0016 the new devices outside of the alps_model_data table.  The latter design
0017 choice was made.  The new touchpad signatures are named: "Rushmore",
0018 "Pinnacle", and "Dolphin", which you will see in the alps.c code.
0019 For the purposes of this document, this group of ALPS touchpads will
0020 generically be called "new ALPS touchpads".
0021 
0022 We experimented with probing the ACPI interface _HID (Hardware ID)/_CID
0023 (Compatibility ID) definition as a way to uniquely identify the
0024 different ALPS variants but there did not appear to be a 1:1 mapping.
0025 In fact, it appeared to be an m:n mapping between the _HID and actual
0026 hardware type.
0027 
0028 Detection
0029 ---------
0030 
0031 All ALPS touchpads should respond to the "E6 report" command sequence:
0032 E8-E6-E6-E6-E9. An ALPS touchpad should respond with either 00-00-0A or
0033 00-00-64 if no buttons are pressed. The bits 0-2 of the first byte will be 1s
0034 if some buttons are pressed.
0035 
0036 If the E6 report is successful, the touchpad model is identified using the "E7
0037 report" sequence: E8-E7-E7-E7-E9. The response is the model signature and is
0038 matched against known models in the alps_model_data_array.
0039 
0040 For older touchpads supporting protocol versions 3 and 4, the E7 report
0041 model signature is always 73-02-64. To differentiate between these
0042 versions, the response from the "Enter Command Mode" sequence must be
0043 inspected as described below.
0044 
0045 The new ALPS touchpads have an E7 signature of 73-03-50 or 73-03-0A but
0046 seem to be better differentiated by the EC Command Mode response.
0047 
0048 Command Mode
0049 ------------
0050 
0051 Protocol versions 3 and 4 have a command mode that is used to read and write
0052 one-byte device registers in a 16-bit address space. The command sequence
0053 EC-EC-EC-E9 places the device in command mode, and the device will respond
0054 with 88-07 followed by a third byte. This third byte can be used to determine
0055 whether the devices uses the version 3 or 4 protocol.
0056 
0057 To exit command mode, PSMOUSE_CMD_SETSTREAM (EA) is sent to the touchpad.
0058 
0059 While in command mode, register addresses can be set by first sending a
0060 specific command, either EC for v3 devices or F5 for v4 devices. Then the
0061 address is sent one nibble at a time, where each nibble is encoded as a
0062 command with optional data. This encoding differs slightly between the v3 and
0063 v4 protocols.
0064 
0065 Once an address has been set, the addressed register can be read by sending
0066 PSMOUSE_CMD_GETINFO (E9). The first two bytes of the response contains the
0067 address of the register being read, and the third contains the value of the
0068 register. Registers are written by writing the value one nibble at a time
0069 using the same encoding used for addresses.
0070 
0071 For the new ALPS touchpads, the EC command is used to enter command
0072 mode. The response in the new ALPS touchpads is significantly different,
0073 and more important in determining the behavior.  This code has been
0074 separated from the original alps_model_data table and put in the
0075 alps_identify function.  For example, there seem to be two hardware init
0076 sequences for the "Dolphin" touchpads as determined by the second byte
0077 of the EC response.
0078 
0079 Packet Format
0080 -------------
0081 
0082 In the following tables, the following notation is used::
0083 
0084  CAPITALS = stick, miniscules = touchpad
0085 
0086 ?'s can have different meanings on different models, such as wheel rotation,
0087 extra buttons, stick buttons on a dualpoint, etc.
0088 
0089 PS/2 packet format
0090 ------------------
0091 
0092 ::
0093 
0094  byte 0:  0    0 YSGN XSGN    1    M    R    L
0095  byte 1: X7   X6   X5   X4   X3   X2   X1   X0
0096  byte 2: Y7   Y6   Y5   Y4   Y3   Y2   Y1   Y0
0097 
0098 Note that the device never signals overflow condition.
0099 
0100 For protocol version 2 devices when the trackpoint is used, and no fingers
0101 are on the touchpad, the M R L bits signal the combined status of both the
0102 pointingstick and touchpad buttons.
0103 
0104 ALPS Absolute Mode - Protocol Version 1
0105 ---------------------------------------
0106 
0107 ::
0108 
0109  byte 0:  1    0    0    0    1   x9   x8   x7
0110  byte 1:  0   x6   x5   x4   x3   x2   x1   x0
0111  byte 2:  0    ?    ?    l    r    ?  fin  ges
0112  byte 3:  0    ?    ?    ?    ?   y9   y8   y7
0113  byte 4:  0   y6   y5   y4   y3   y2   y1   y0
0114  byte 5:  0   z6   z5   z4   z3   z2   z1   z0
0115 
0116 ALPS Absolute Mode - Protocol Version 2
0117 ---------------------------------------
0118 
0119 ::
0120 
0121  byte 0:  1    ?    ?    ?    1  PSM  PSR  PSL
0122  byte 1:  0   x6   x5   x4   x3   x2   x1   x0
0123  byte 2:  0  x10   x9   x8   x7    ?  fin  ges
0124  byte 3:  0   y9   y8   y7    1    M    R    L
0125  byte 4:  0   y6   y5   y4   y3   y2   y1   y0
0126  byte 5:  0   z6   z5   z4   z3   z2   z1   z0
0127 
0128 Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
0129 the DualPoint Stick. The M, R and L bits signal the combined status of both
0130 the pointingstick and touchpad buttons, except for Dell dualpoint devices
0131 where the pointingstick buttons get reported separately in the PSM, PSR
0132 and PSL bits.
0133 
0134 Dualpoint device -- interleaved packet format
0135 ---------------------------------------------
0136 
0137 ::
0138 
0139  byte 0:    1    1    0    0    1    1    1    1
0140  byte 1:    0   x6   x5   x4   x3   x2   x1   x0
0141  byte 2:    0  x10   x9   x8   x7    0  fin  ges
0142  byte 3:    0    0 YSGN XSGN    1    1    1    1
0143  byte 4:   X7   X6   X5   X4   X3   X2   X1   X0
0144  byte 5:   Y7   Y6   Y5   Y4   Y3   Y2   Y1   Y0
0145  byte 6:    0   y9   y8   y7    1    m    r    l
0146  byte 7:    0   y6   y5   y4   y3   y2   y1   y0
0147  byte 8:    0   z6   z5   z4   z3   z2   z1   z0
0148 
0149 Devices which use the interleaving format normally send standard PS/2 mouse
0150 packets for the DualPoint Stick + ALPS Absolute Mode packets for the
0151 touchpad, switching to the interleaved packet format when both the stick and
0152 the touchpad are used at the same time.
0153 
0154 ALPS Absolute Mode - Protocol Version 3
0155 ---------------------------------------
0156 
0157 ALPS protocol version 3 has three different packet formats. The first two are
0158 associated with touchpad events, and the third is associated with trackstick
0159 events.
0160 
0161 The first type is the touchpad position packet::
0162 
0163  byte 0:    1    ?   x1   x0    1    1    1    1
0164  byte 1:    0  x10   x9   x8   x7   x6   x5   x4
0165  byte 2:    0  y10   y9   y8   y7   y6   y5   y4
0166  byte 3:    0    M    R    L    1    m    r    l
0167  byte 4:    0   mt   x3   x2   y3   y2   y1   y0
0168  byte 5:    0   z6   z5   z4   z3   z2   z1   z0
0169 
0170 Note that for some devices the trackstick buttons are reported in this packet,
0171 and on others it is reported in the trackstick packets.
0172 
0173 The second packet type contains bitmaps representing the x and y axes. In the
0174 bitmaps a given bit is set if there is a finger covering that position on the
0175 given axis. Thus the bitmap packet can be used for low-resolution multi-touch
0176 data, although finger tracking is not possible.  This packet also encodes the
0177 number of contacts (f1 and f0 in the table below)::
0178 
0179  byte 0:    1    1   x1   x0    1    1    1    1
0180  byte 1:    0   x8   x7   x6   x5   x4   x3   x2
0181  byte 2:    0   y7   y6   y5   y4   y3   y2   y1
0182  byte 3:    0  y10   y9   y8    1    1    1    1
0183  byte 4:    0  x14  x13  x12  x11  x10   x9   y0
0184  byte 5:    0    1    ?    ?    ?    ?   f1   f0
0185 
0186 This packet only appears after a position packet with the mt bit set, and
0187 usually only appears when there are two or more contacts (although
0188 occasionally it's seen with only a single contact).
0189 
0190 The final v3 packet type is the trackstick packet::
0191 
0192  byte 0:    1    1   x7   y7    1    1    1    1
0193  byte 1:    0   x6   x5   x4   x3   x2   x1   x0
0194  byte 2:    0   y6   y5   y4   y3   y2   y1   y0
0195  byte 3:    0    1   TP   SW    1    M    R    L
0196  byte 4:    0   z6   z5   z4   z3   z2   z1   z0
0197  byte 5:    0    0    1    1    1    1    1    1
0198 
0199 TP means Tap SW status when tap processing is enabled or Press status when press
0200 processing is enabled. SW means scroll up when 4 buttons are available.
0201 
0202 ALPS Absolute Mode - Protocol Version 4
0203 ---------------------------------------
0204 
0205 Protocol version 4 has an 8-byte packet format::
0206 
0207  byte 0:    1    ?   x1   x0    1    1    1    1
0208  byte 1:    0  x10   x9   x8   x7   x6   x5   x4
0209  byte 2:    0  y10   y9   y8   y7   y6   y5   y4
0210  byte 3:    0    1   x3   x2   y3   y2   y1   y0
0211  byte 4:    0    ?    ?    ?    1    ?    r    l
0212  byte 5:    0   z6   z5   z4   z3   z2   z1   z0
0213  byte 6:    bitmap data (described below)
0214  byte 7:    bitmap data (described below)
0215 
0216 The last two bytes represent a partial bitmap packet, with 3 full packets
0217 required to construct a complete bitmap packet.  Once assembled, the 6-byte
0218 bitmap packet has the following format::
0219 
0220  byte 0:    0    1   x7   x6   x5   x4   x3   x2
0221  byte 1:    0   x1   x0   y4   y3   y2   y1   y0
0222  byte 2:    0    0    ?  x14  x13  x12  x11  x10
0223  byte 3:    0   x9   x8   y9   y8   y7   y6   y5
0224  byte 4:    0    0    0    0    0    0    0    0
0225  byte 5:    0    0    0    0    0    0    0  y10
0226 
0227 There are several things worth noting here.
0228 
0229  1) In the bitmap data, bit 6 of byte 0 serves as a sync byte to
0230     identify the first fragment of a bitmap packet.
0231 
0232  2) The bitmaps represent the same data as in the v3 bitmap packets, although
0233     the packet layout is different.
0234 
0235  3) There doesn't seem to be a count of the contact points anywhere in the v4
0236     protocol packets. Deriving a count of contact points must be done by
0237     analyzing the bitmaps.
0238 
0239  4) There is a 3 to 1 ratio of position packets to bitmap packets. Therefore
0240     MT position can only be updated for every third ST position update, and
0241     the count of contact points can only be updated every third packet as
0242     well.
0243 
0244 So far no v4 devices with tracksticks have been encountered.
0245 
0246 ALPS Absolute Mode - Protocol Version 5
0247 ---------------------------------------
0248 This is basically Protocol Version 3 but with different logic for packet
0249 decode.  It uses the same alps_process_touchpad_packet_v3 call with a
0250 specialized decode_fields function pointer to correctly interpret the
0251 packets.  This appears to only be used by the Dolphin devices.
0252 
0253 For single-touch, the 6-byte packet format is::
0254 
0255  byte 0:    1    1    0    0    1    0    0    0
0256  byte 1:    0   x6   x5   x4   x3   x2   x1   x0
0257  byte 2:    0   y6   y5   y4   y3   y2   y1   y0
0258  byte 3:    0    M    R    L    1    m    r    l
0259  byte 4:   y10  y9   y8   y7  x10   x9   x8   x7
0260  byte 5:    0   z6   z5   z4   z3   z2   z1   z0
0261 
0262 For mt, the format is::
0263 
0264  byte 0:    1    1    1    n3   1   n2   n1   x24
0265  byte 1:    1   y7   y6    y5  y4   y3   y2    y1
0266  byte 2:    ?   x2   x1   y12 y11  y10   y9    y8
0267  byte 3:    0  x23  x22   x21 x20  x19  x18   x17
0268  byte 4:    0   x9   x8    x7  x6   x5   x4    x3
0269  byte 5:    0  x16  x15   x14 x13  x12  x11   x10
0270 
0271 ALPS Absolute Mode - Protocol Version 6
0272 ---------------------------------------
0273 
0274 For trackstick packet, the format is::
0275 
0276  byte 0:    1    1    1    1    1    1    1    1
0277  byte 1:    0   X6   X5   X4   X3   X2   X1   X0
0278  byte 2:    0   Y6   Y5   Y4   Y3   Y2   Y1   Y0
0279  byte 3:    ?   Y7   X7    ?    ?    M    R    L
0280  byte 4:   Z7   Z6   Z5   Z4   Z3   Z2   Z1   Z0
0281  byte 5:    0    1    1    1    1    1    1    1
0282 
0283 For touchpad packet, the format is::
0284 
0285  byte 0:    1    1    1    1    1    1    1    1
0286  byte 1:    0    0    0    0   x3   x2   x1   x0
0287  byte 2:    0    0    0    0   y3   y2   y1   y0
0288  byte 3:    ?   x7   x6   x5   x4    ?    r    l
0289  byte 4:    ?   y7   y6   y5   y4    ?    ?    ?
0290  byte 5:   z7   z6   z5   z4   z3   z2   z1   z0
0291 
0292 (v6 touchpad does not have middle button)
0293 
0294 ALPS Absolute Mode - Protocol Version 7
0295 ---------------------------------------
0296 
0297 For trackstick packet, the format is::
0298 
0299  byte 0:    0    1    0    0    1    0    0    0
0300  byte 1:    1    1    *    *    1    M    R    L
0301  byte 2:   X7    1   X5   X4   X3   X2   X1   X0
0302  byte 3:   Z6    1   Y6   X6    1   Y2   Y1   Y0
0303  byte 4:   Y7    0   Y5   Y4   Y3    1    1    0
0304  byte 5:  T&P    0   Z5   Z4   Z3   Z2   Z1   Z0
0305 
0306 For touchpad packet, the format is::
0307 
0308          packet-fmt     b7     b6     b5     b4     b3     b2     b1     b0
0309  byte 0: TWO & MULTI     L      1      R      M      1   Y0-2   Y0-1   Y0-0
0310  byte 0: NEW             L      1   X1-5      1      1   Y0-2   Y0-1   Y0-0
0311  byte 1:             Y0-10   Y0-9   Y0-8   Y0-7   Y0-6   Y0-5   Y0-4   Y0-3
0312  byte 2:             X0-11      1  X0-10   X0-9   X0-8   X0-7   X0-6   X0-5
0313  byte 3:             X1-11      1   X0-4   X0-3      1   X0-2   X0-1   X0-0
0314  byte 4: TWO         X1-10    TWO   X1-9   X1-8   X1-7   X1-6   X1-5   X1-4
0315  byte 4: MULTI       X1-10    TWO   X1-9   X1-8   X1-7   X1-6   Y1-5      1
0316  byte 4: NEW         X1-10    TWO   X1-9   X1-8   X1-7   X1-6      0      0
0317  byte 5: TWO & NEW   Y1-10      0   Y1-9   Y1-8   Y1-7   Y1-6   Y1-5   Y1-4
0318  byte 5: MULTI       Y1-10      0   Y1-9   Y1-8   Y1-7   Y1-6    F-1    F-0
0319 
0320  L:         Left button
0321  R / M:     Non-clickpads: Right / Middle button
0322             Clickpads: When > 2 fingers are down, and some fingers
0323             are in the button area, then the 2 coordinates reported
0324             are for fingers outside the button area and these report
0325             extra fingers being present in the right / left button
0326             area. Note these fingers are not added to the F field!
0327             so if a TWO packet is received and R = 1 then there are
0328             3 fingers down, etc.
0329  TWO:       1: Two touches present, byte 0/4/5 are in TWO fmt
0330             0: If byte 4 bit 0 is 1, then byte 0/4/5 are in MULTI fmt
0331                otherwise byte 0 bit 4 must be set and byte 0/4/5 are
0332                in NEW fmt
0333  F:         Number of fingers - 3, 0 means 3 fingers, 1 means 4 ...
0334 
0335 
0336 ALPS Absolute Mode - Protocol Version 8
0337 ---------------------------------------
0338 
0339 Spoken by SS4 (73 03 14) and SS5 (73 03 28) hardware.
0340 
0341 The packet type is given by the APD field, bits 4-5 of byte 3.
0342 
0343 Touchpad packet (APD = 0x2)::
0344 
0345            b7   b6   b5   b4   b3   b2   b1   b0
0346  byte 0:  SWM  SWR  SWL    1    1    0    0   X7
0347  byte 1:    0   X6   X5   X4   X3   X2   X1   X0
0348  byte 2:    0   Y6   Y5   Y4   Y3   Y2   Y1   Y0
0349  byte 3:    0  T&P    1    0    1    0    0   Y7
0350  byte 4:    0   Z6   Z5   Z4   Z3   Z2   Z1   Z0
0351  byte 5:    0    0    0    0    0    0    0    0
0352 
0353 SWM, SWR, SWL: Middle, Right, and Left button states
0354 
0355 Touchpad 1 Finger packet (APD = 0x0)::
0356 
0357            b7   b6   b5   b4   b3   b2   b1   b0
0358  byte 0:  SWM  SWR  SWL    1    1   X2   X1   X0
0359  byte 1:   X9   X8   X7    1   X6   X5   X4   X3
0360  byte 2:    0  X11  X10  LFB   Y3   Y2   Y1   Y0
0361  byte 3:   Y5   Y4    0    0    1 TAPF2 TAPF1 TAPF0
0362  byte 4:  Zv7  Y11  Y10    1   Y9   Y8   Y7   Y6
0363  byte 5:  Zv6  Zv5  Zv4    0  Zv3  Zv2  Zv1  Zv0
0364 
0365 TAPF: ???
0366 LFB:  ???
0367 
0368 Touchpad 2 Finger packet (APD = 0x1)::
0369 
0370            b7   b6   b5   b4   b3   b2   b1   b0
0371  byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
0372  byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
0373  byte 2: AY11 AY10  AY9  CONT AY8  AY7  AY6  AY5
0374  byte 3:    0    0    0    1    1  BX6  BX5  BX4
0375  byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
0376  byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5
0377 
0378 CONT: A 3-or-4 Finger packet is to follow
0379 
0380 Touchpad 3-or-4 Finger packet (APD = 0x3)::
0381 
0382            b7   b6   b5   b4   b3   b2   b1   b0
0383  byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
0384  byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
0385  byte 2: AY11 AY10  AY9  OVF  AY8  AY7  AY6  AY5
0386  byte 3:    0    0    1    1    1  BX6  BX5  BX4
0387  byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
0388  byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5
0389 
0390 OVF: 5th finger detected