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 觸控板具有 73-03-50 或 73-03-0A 的 E7 簽名,但似乎可以透過 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 函式中。 例如,對於由 EC 響應的第二個位元組確定的“Dolphin”觸控板,似乎有兩個硬體初始化序列。

1.4. 資料包格式

在下表中,使用以下符號

CAPITALS = stick, miniscules = touchpad

?'s 在不同的模型上可以具有不同的含義,例如滾輪旋轉、額外的按鈕、雙指點杆上的杆按鈕等。

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 DualPoint 裝置為 DualPoint Stick 傳送標準 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

使用交錯格式的裝置通常為 DualPoint Stick 傳送標準 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 位設定為 1 的位置資料包之後出現,並且通常僅在有兩個或更多接觸點時出現(儘管偶爾僅在單個接觸點時看到)。

最終的 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 表示 Tap SW 狀態,當啟用按下處理時,TP 表示 Press 狀態。 當有 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 根手指