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
這裡有幾點值得注意。
在點陣圖資料中,位元組 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 根手指