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,提供輸入法編輯器支援、存取權控管和狀態。這些 API 也會由無法或不願意屬於輸入堆疊的受信任系統程式使用。

背景

人臉介面裝置或 HID 標準是輸入裝置的硬體通訊協定,經過 USB、I2C 和藍牙標準化。這款裝置支援多種輸入裝置,例如滑鼠、鍵盤、觸控螢幕、觸控筆、感應器、LED 燈、遊戲控制器等。本質上,HID 標準能夠為從輸入裝置傳送至主機電腦的二進位報告指派意義。

HID 描述的裝置具有無限彈性,但這會使 API 難以使用。95% 的 HID 裝置完全貼合於定義明確的輸入裝置群組,且能以一般字詞輕鬆描述。如要抽離 HID 通訊協定,並允許用戶端輕鬆使用「一般」裝置,就需要 fuchsia.input.report 等 API 層。

設計決策

用戶端與一般用途

圖:系統中 fuchsia.input.report 的一般使用情形

fuchsia.input.report 是輸入堆疊的最低層級。這個 API 應由輸入堆疊的下一階段使用,而這些報表的修改版本應傳送至較高層級的用戶端。這些報表的用戶端應該是負責其他輸入堆疊的程式 (例如 RootPresenterSessionFramework)。

這些報表不適合供系統中一般應用程式的直接使用。一般應用程式應使用完整的輸入堆疊,這類堆疊可提供完整背景資訊並具備有效存取權控管的 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 列舉,但會新增其他值。