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