Fuchsia 輸入驅動程式

Fuchsia 的輸入驅動程式會實作 fuchsia.input.report FIDL API。輸入驅動程式涵蓋各種輸入裝置,例如滑鼠、鍵盤、觸控螢幕、消費者控制項 (媒體按鈕) 和感應器。輸入驅動程式涵蓋多種通訊協定,包括 USB、I2C 和藍牙。

總覽

fuchsia.input.report FIDL API 代表 Fuchsia 系統中最低層級的結構化輸入內容。這個 API 應盡可能貼近基礎輸入硬體。不應將硬體中不存在的額外狀態新增至這個 API。FIDL 資料表可確保日後新增的輸入裝置和功能維持相容性。fuchsia.input.report API 是以人機介面裝置 (HID) 通訊協定為基礎,這項通訊協定是輸入裝置的硬體通訊協定。以 HID 通訊協定為基礎開發這個 API,可確保 API 支援大多數 HID 裝置。

這個 API 會由輸入堆疊的下一層取用,提供 IME 支援、存取權控管和有狀態功能。此外,這項 API 也會由無法或不願成為輸入堆疊一部分的信任系統程式使用。

背景

人機介面裝置或 HID 標準是輸入裝置的硬體通訊協定,已在 USB、I2C 和藍牙中標準化。支援多種輸入裝置,例如滑鼠、鍵盤、觸控螢幕、觸控筆、感應器、LED、遊戲手把等。基本上,HID 標準提供一種方式,可將意義指派給從輸入裝置傳送至主機電腦的二進位報表。

HID 可描述的裝置非常彈性,但這也導致 API 難以使用。95% 的 HID 裝置都屬於定義明確的輸入裝置群組,且可輕鬆以一般用語說明。您必須使用 fuchsia.input.report 等 API 層,才能從 HID 通訊協定中抽象化,讓用戶端輕鬆使用「一般」裝置。

設計決策

用戶端和一般用途

圖:系統中 fuchsia.input.report 的一般用途

fuchsia.input.report 是指輸入堆疊的最低層級。輸入堆疊的下一個階段應使用此 API,並將這些報表的修改版本傳遞至較高層級的用戶端。這些報告的用戶端應為負責其餘輸入堆疊的程式 (例如:RootPresenter、SessionFramework)。

系統中的一般應用程式不適合直接使用這些報表。一般應用程式應使用完整的輸入堆疊,其中提供具有完整內容和有效存取控管的 InputEvents。

部分低階系統程式想要存取 fuchsia.input.report,以便讀取感應器和其他簡化輸入內容。這些是系統信任的程式,需要存取這個層級的輸入內容。系統終端機 Virtcon 需要鍵盤的低層級存取權。「螢幕亮度」程式需要存取亮度感應器。這些類型的程式應直接使用 fuchsia.input.report。print-input-report 二進位檔可用於使用低層級輸入的範例程式。

無狀態報表

fuchsia.input.report 應盡可能忠實呈現實體裝置傳送的硬體報告。也就是說,fuchsia.input.report API 不應新增硬體裝置中沒有的額外狀態。這表示部分報表缺少系統其餘部分的內容和狀態。舉例來說,滑鼠回報的是相對 X 和 Y 移動,但不會追蹤螢幕上的全域位置。觸控報表會提供手指 ID,但會直接提供「懸停」、「按壓」、「放開」事件。鍵盤報表沒有鍵盤配置的概念。這項資訊需要由輸入堆疊的較高層級填入。

Fuchsia 專屬列舉

InputReport API 明確不會使用 HID 列舉來進行說明 (例如:LED 列舉、鍵盤按鍵列舉)。並使用 Fuchsia 特定的列舉。這可讓 API 額外彈性地聲明其他用途,並移除我們選擇不支援的用途。(舉例來說,HID 沒有恢復原廠設定 (FDR) 按鈕列舉,但我們需要支援)。

明確不使用 HID 列舉,比不一致地在某些情況下使用 HID 列舉,但在其他情況下新增額外值更容易保持一致。