1. ALPS 触摸板协议

1.1. 简介

目前,ALPS 触摸板驱动程序支持 ALPS 触摸板使用的七个协议版本,称为版本 1、2、3、4、5、6、7 和 8。

自 2010 年中期左右以来,发布了几款新的 ALPS 触摸板并集成到各种笔记本电脑和上网本中。 这些新的触摸板具有足够的行为差异,以至于描述不同版本属性的 alps_model_data 定义表不再足够。设计选择是重新定义 alps_model_data 表,存在回归测试现有设备的风险,或者将新设备隔离在 alps_model_data 表之外。 选择了后一种设计选择。 新的触摸板签名命名为:“Rushmore”、“Pinnacle”和“Dolphin”,您将在 alps.c 代码中看到它们。 就本文档而言,这组 ALPS 触摸板将统称为“新的 ALPS 触摸板”。

我们尝试探测 ACPI 接口 _HID (硬件 ID) /_CID (兼容性 ID) 定义作为唯一标识不同 ALPS 变体的方法,但似乎不存在 1:1 的映射。 实际上,_HID 和实际硬件类型之间似乎存在 m:n 的映射。

1.2. 检测

所有 ALPS 触摸板都应响应 “E6 报告” 命令序列:E8-E6-E6-E6-E9。如果未按下任何按钮,则 ALPS 触摸板应以 00-00-0A 或 00-00-64 响应。 如果按下了一些按钮,则第一个字节的位 0-2 将为 1。

如果 E6 报告成功,则使用 “E7 报告” 序列:E8-E7-E7-E7-E9 来识别触摸板型号。 响应是型号签名,并与 alps_model_data_array 中的已知型号进行匹配。

对于支持协议版本 3 和 4 的较旧触摸板,E7 报告型号签名始终为 73-02-64。 为了区分这些版本,必须检查来自 “进入命令模式” 序列的响应,如下所述。

新的 ALPS 触摸板的 E7 签名为 73-03-50 或 73-03-0A,但似乎可以通过 EC 命令模式响应更好地进行区分。

1.3. 命令模式

协议版本 3 和 4 具有命令模式,用于在 16 位地址空间中读取和写入单字节设备寄存器。 命令序列 EC-EC-EC-E9 将设备置于命令模式,设备将以 88-07 开头,后跟第三个字节进行响应。 第三个字节可用于确定设备是否使用版本 3 或 4 协议。

要退出命令模式,请将 PSMOUSE_CMD_SETSTREAM (EA) 发送到触摸板。

在命令模式下,可以通过先发送特定命令来设置寄存器地址,v3 设备为 EC,v4 设备为 F5。 然后,一次发送一个半字节的地址,其中每个半字节都编码为带有可选数据的命令。 v3 和 v4 协议之间的此编码略有不同。

设置地址后,可以通过发送 PSMOUSE_CMD_GETINFO (E9) 来读取寻址的寄存器。 响应的前两个字节包含正在读取的寄存器的地址,第三个字节包含寄存器的值。 通过使用与地址相同的编码,一次写入一个半字节的值来写入寄存器。

对于新的 ALPS 触摸板,EC 命令用于进入命令模式。 新的 ALPS 触摸板中的响应明显不同,并且在确定行为方面更重要。 此代码已从原始 alps_model_data 表中分离出来,并放入 alps_identify 函数中。 例如,似乎有用于 “Dolphin” 触摸板的两个硬件初始化序列,这由 EC 响应的第二个字节确定。

1.4. 数据包格式

在下表中,使用了以下符号

CAPITALS = stick, miniscules = touchpad

?’ 在不同的型号上可能具有不同的含义,例如滚轮旋转、额外按钮、双点上的摇杆按钮等。

1.5. PS/2 数据包格式

byte 0:  0    0 YSGN XSGN    1    M    R    L
byte 1: X7   X6   X5   X4   X3   X2   X1   X0
byte 2: Y7   Y6   Y5   Y4   Y3   Y2   Y1   Y0

请注意,设备永远不会发出溢出情况的信号。

对于使用轨迹点的协议版本 2 设备,并且触摸板上没有手指时,M R L 位表示轨迹点和触摸板按钮的组合状态。

1.6. ALPS 绝对模式 - 协议版本 1

byte 0:  1    0    0    0    1   x9   x8   x7
byte 1:  0   x6   x5   x4   x3   x2   x1   x0
byte 2:  0    ?    ?    l    r    ?  fin  ges
byte 3:  0    ?    ?    ?    ?   y9   y8   y7
byte 4:  0   y6   y5   y4   y3   y2   y1   y0
byte 5:  0   z6   z5   z4   z3   z2   z1   z0

1.7. ALPS 绝对模式 - 协议版本 2

byte 0:  1    ?    ?    ?    1  PSM  PSR  PSL
byte 1:  0   x6   x5   x4   x3   x2   x1   x0
byte 2:  0  x10   x9   x8   x7    ?  fin  ges
byte 3:  0   y9   y8   y7    1    M    R    L
byte 4:  0   y6   y5   y4   y3   y2   y1   y0
byte 5:  0   z6   z5   z4   z3   z2   z1   z0

协议版本 2 双点设备为双点摇杆发送标准 PS/2 鼠标数据包。M、R 和 L 位表示轨迹点和触摸板按钮的组合状态,但 Dell 双点设备除外,其中轨迹点按钮在 PSM、PSR 和 PSL 位中单独报告。

1.8. 双点设备 - 交错数据包格式

byte 0:    1    1    0    0    1    1    1    1
byte 1:    0   x6   x5   x4   x3   x2   x1   x0
byte 2:    0  x10   x9   x8   x7    0  fin  ges
byte 3:    0    0 YSGN XSGN    1    1    1    1
byte 4:   X7   X6   X5   X4   X3   X2   X1   X0
byte 5:   Y7   Y6   Y5   Y4   Y3   Y2   Y1   Y0
byte 6:    0   y9   y8   y7    1    m    r    l
byte 7:    0   y6   y5   y4   y3   y2   y1   y0
byte 8:    0   z6   z5   z4   z3   z2   z1   z0

使用交错格式的设备通常会为双点摇杆发送标准 PS/2 鼠标数据包 + 为触摸板发送 ALPS 绝对模式数据包,当摇杆和触摸板同时使用时,切换到交错数据包格式。

1.9. ALPS 绝对模式 - 协议版本 3

ALPS 协议版本 3 有三种不同的数据包格式。 前两种与触摸板事件相关联,第三种与轨迹棒事件相关联。

第一种类型是触摸板位置数据包

byte 0:    1    ?   x1   x0    1    1    1    1
byte 1:    0  x10   x9   x8   x7   x6   x5   x4
byte 2:    0  y10   y9   y8   y7   y6   y5   y4
byte 3:    0    M    R    L    1    m    r    l
byte 4:    0   mt   x3   x2   y3   y2   y1   y0
byte 5:    0   z6   z5   z4   z3   z2   z1   z0

请注意,对于某些设备,轨迹棒按钮在此数据包中报告,而在其他设备上,则在轨迹棒数据包中报告。

第二种数据包类型包含表示 x 和 y 轴的位图。 在位图中,如果某个手指覆盖了给定轴上的该位置,则会设置给定的位。 因此,位图数据包可用于低分辨率多点触控数据,但无法进行手指跟踪。 此数据包还对触点数量进行编码(下表中的 f1 和 f0)

byte 0:    1    1   x1   x0    1    1    1    1
byte 1:    0   x8   x7   x6   x5   x4   x3   x2
byte 2:    0   y7   y6   y5   y4   y3   y2   y1
byte 3:    0  y10   y9   y8    1    1    1    1
byte 4:    0  x14  x13  x12  x11  x10   x9   y0
byte 5:    0    1    ?    ?    ?    ?   f1   f0

此数据包仅在设置了 mt 位的的位置数据包之后出现,并且通常仅在存在两个或更多触点时出现(尽管偶尔也会出现只有一个触点的情况)。

最终的 v3 数据包类型是轨迹棒数据包

byte 0:    1    1   x7   y7    1    1    1    1
byte 1:    0   x6   x5   x4   x3   x2   x1   x0
byte 2:    0   y6   y5   y4   y3   y2   y1   y0
byte 3:    0    1   TP   SW    1    M    R    L
byte 4:    0   z6   z5   z4   z3   z2   z1   z0
byte 5:    0    0    1    1    1    1    1    1

TP 表示启用点击处理时的点击 SW 状态,或启用按下处理时的按下状态。 当有 4 个按钮可用时,SW 表示向上滚动。

1.10. ALPS 绝对模式 - 协议版本 4

协议版本 4 具有 8 字节的数据包格式

byte 0:    1    ?   x1   x0    1    1    1    1
byte 1:    0  x10   x9   x8   x7   x6   x5   x4
byte 2:    0  y10   y9   y8   y7   y6   y5   y4
byte 3:    0    1   x3   x2   y3   y2   y1   y0
byte 4:    0    ?    ?    ?    1    ?    r    l
byte 5:    0   z6   z5   z4   z3   z2   z1   z0
byte 6:    bitmap data (described below)
byte 7:    bitmap data (described below)

最后两个字节表示部分位图数据包,需要 3 个完整的数据包才能构建完整的位图数据包。 组装完成后,6 字节的位图数据包具有以下格式

byte 0:    0    1   x7   x6   x5   x4   x3   x2
byte 1:    0   x1   x0   y4   y3   y2   y1   y0
byte 2:    0    0    ?  x14  x13  x12  x11  x10
byte 3:    0   x9   x8   y9   y8   y7   y6   y5
byte 4:    0    0    0    0    0    0    0    0
byte 5:    0    0    0    0    0    0    0  y10

这里有几件事值得注意。

  1. 在位图数据中,字节 0 的位 6 用作同步字节,以标识位图数据包的第一个片段。

  2. 位图表示与 v3 位图数据包中相同的数据,尽管数据包布局不同。

  3. 在 v4 协议数据包中,似乎没有任何地方可以找到触点数量。必须通过分析位图来得出触点数量。

  4. 位置数据包与位图数据包的比例为 3 比 1。 因此,只能每三个 ST 位置更新更新 MT 位置,并且触点数量也只能每三个数据包更新一次。

到目前为止,还没有遇到带有轨迹棒的 v4 设备。

1.11. ALPS 绝对模式 - 协议版本 5

这基本上是协议版本 3,但数据包解码逻辑不同。 它使用相同的 alps_process_touchpad_packet_v3 调用,并使用专门的 decode_fields 函数指针来正确解释数据包。 这似乎仅由 Dolphin 设备使用。

对于单点触控,6 字节的数据包格式为

byte 0:    1    1    0    0    1    0    0    0
byte 1:    0   x6   x5   x4   x3   x2   x1   x0
byte 2:    0   y6   y5   y4   y3   y2   y1   y0
byte 3:    0    M    R    L    1    m    r    l
byte 4:   y10  y9   y8   y7  x10   x9   x8   x7
byte 5:    0   z6   z5   z4   z3   z2   z1   z0

对于 mt,格式为

byte 0:    1    1    1    n3   1   n2   n1   x24
byte 1:    1   y7   y6    y5  y4   y3   y2    y1
byte 2:    ?   x2   x1   y12 y11  y10   y9    y8
byte 3:    0  x23  x22   x21 x20  x19  x18   x17
byte 4:    0   x9   x8    x7  x6   x5   x4    x3
byte 5:    0  x16  x15   x14 x13  x12  x11   x10

1.12. ALPS 绝对模式 - 协议版本 6

对于轨迹棒数据包,格式为

byte 0:    1    1    1    1    1    1    1    1
byte 1:    0   X6   X5   X4   X3   X2   X1   X0
byte 2:    0   Y6   Y5   Y4   Y3   Y2   Y1   Y0
byte 3:    ?   Y7   X7    ?    ?    M    R    L
byte 4:   Z7   Z6   Z5   Z4   Z3   Z2   Z1   Z0
byte 5:    0    1    1    1    1    1    1    1

对于触摸板数据包,格式为

byte 0:    1    1    1    1    1    1    1    1
byte 1:    0    0    0    0   x3   x2   x1   x0
byte 2:    0    0    0    0   y3   y2   y1   y0
byte 3:    ?   x7   x6   x5   x4    ?    r    l
byte 4:    ?   y7   y6   y5   y4    ?    ?    ?
byte 5:   z7   z6   z5   z4   z3   z2   z1   z0

(v6 触摸板没有中间按钮)

1.13. ALPS 绝对模式 - 协议版本 7

对于轨迹棒数据包,格式为

byte 0:    0    1    0    0    1    0    0    0
byte 1:    1    1    *    *    1    M    R    L
byte 2:   X7    1   X5   X4   X3   X2   X1   X0
byte 3:   Z6    1   Y6   X6    1   Y2   Y1   Y0
byte 4:   Y7    0   Y5   Y4   Y3    1    1    0
byte 5:  T&P    0   Z5   Z4   Z3   Z2   Z1   Z0

对于触摸板数据包,格式为

        packet-fmt     b7     b6     b5     b4     b3     b2     b1     b0
byte 0: TWO & MULTI     L      1      R      M      1   Y0-2   Y0-1   Y0-0
byte 0: NEW             L      1   X1-5      1      1   Y0-2   Y0-1   Y0-0
byte 1:             Y0-10   Y0-9   Y0-8   Y0-7   Y0-6   Y0-5   Y0-4   Y0-3
byte 2:             X0-11      1  X0-10   X0-9   X0-8   X0-7   X0-6   X0-5
byte 3:             X1-11      1   X0-4   X0-3      1   X0-2   X0-1   X0-0
byte 4: TWO         X1-10    TWO   X1-9   X1-8   X1-7   X1-6   X1-5   X1-4
byte 4: MULTI       X1-10    TWO   X1-9   X1-8   X1-7   X1-6   Y1-5      1
byte 4: NEW         X1-10    TWO   X1-9   X1-8   X1-7   X1-6      0      0
byte 5: TWO & NEW   Y1-10      0   Y1-9   Y1-8   Y1-7   Y1-6   Y1-5   Y1-4
byte 5: MULTI       Y1-10      0   Y1-9   Y1-8   Y1-7   Y1-6    F-1    F-0

L:         Left button
R / M:     Non-clickpads: Right / Middle button
           Clickpads: When > 2 fingers are down, and some fingers
           are in the button area, then the 2 coordinates reported
           are for fingers outside the button area and these report
           extra fingers being present in the right / left button
           area. Note these fingers are not added to the F field!
           so if a TWO packet is received and R = 1 then there are
           3 fingers down, etc.
TWO:       1: Two touches present, byte 0/4/5 are in TWO fmt
           0: If byte 4 bit 0 is 1, then byte 0/4/5 are in MULTI fmt
              otherwise byte 0 bit 4 must be set and byte 0/4/5 are
              in NEW fmt
F:         Number of fingers - 3, 0 means 3 fingers, 1 means 4 ...

1.14. ALPS 绝对模式 - 协议版本 8

由 SS4 (73 03 14) 和 SS5 (73 03 28) 硬件发送。

数据包类型由 APD 字段给出,即第 3 字节的第 4-5 位。

触摸板数据包 (APD = 0x2)

          b7   b6   b5   b4   b3   b2   b1   b0
byte 0:  SWM  SWR  SWL    1    1    0    0   X7
byte 1:    0   X6   X5   X4   X3   X2   X1   X0
byte 2:    0   Y6   Y5   Y4   Y3   Y2   Y1   Y0
byte 3:    0  T&P    1    0    1    0    0   Y7
byte 4:    0   Z6   Z5   Z4   Z3   Z2   Z1   Z0
byte 5:    0    0    0    0    0    0    0    0

SWM、SWR、SWL:中间、右侧和左侧按钮状态

触摸板 1 指数据包 (APD = 0x0)

          b7   b6   b5   b4   b3   b2   b1   b0
byte 0:  SWM  SWR  SWL    1    1   X2   X1   X0
byte 1:   X9   X8   X7    1   X6   X5   X4   X3
byte 2:    0  X11  X10  LFB   Y3   Y2   Y1   Y0
byte 3:   Y5   Y4    0    0    1 TAPF2 TAPF1 TAPF0
byte 4:  Zv7  Y11  Y10    1   Y9   Y8   Y7   Y6
byte 5:  Zv6  Zv5  Zv4    0  Zv3  Zv2  Zv1  Zv0

TAPF:??? LFB:???

触摸板 2 指数据包 (APD = 0x1)

          b7   b6   b5   b4   b3   b2   b1   b0
byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
byte 2: AY11 AY10  AY9  CONT AY8  AY7  AY6  AY5
byte 3:    0    0    0    1    1  BX6  BX5  BX4
byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5

CONT:后续将发送 3 或 4 指数据包

触摸板 3 或 4 指数据包 (APD = 0x3)

          b7   b6   b5   b4   b3   b2   b1   b0
byte 0:  SWM  SWR  SWL    1    1  AX6  AX5  AX4
byte 1: AX11 AX10  AX9  AX8  AX7  AZ1  AY4  AZ0
byte 2: AY11 AY10  AY9  OVF  AY8  AY7  AY6  AY5
byte 3:    0    0    1    1    1  BX6  BX5  BX4
byte 4: BX11 BX10  BX9  BX8  BX7  BZ1  BY4  BZ0
byte 5: BY11 BY10  BY9    0  BY8  BY7  BY5  BY5

OVF:检测到第 5 个手指