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
这里有几件事值得注意。
在位图数据中,字节 0 的位 6 用作同步字节,以标识位图数据包的第一个片段。
位图表示与 v3 位图数据包中相同的数据,尽管数据包布局不同。
在 v4 协议数据包中,似乎没有任何地方可以找到触点数量。必须通过分析位图来得出触点数量。
位置数据包与位图数据包的比例为 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 个手指