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 设备完全适合定义明确的输入设备组,并且能够用通用术语轻松描述。为了脱离 HID 协议并使客户端能够轻松使用“典型”设备,必须使用 fuchsia.input.report 等 API 层。

设计决策

客户端和典型用法

图:系统中 fuchsia.input.report 的常规用法

fuchsia.input.report 表示输入堆栈的最低层级。此 API 应由输入堆栈的下一阶段使用,并且应将这些报告的修改版本传递给更高层级的客户端。这些报告的客户端应是负责输入堆栈其余部分(例如 RootPresenterSessionFramework)的程序。

这类报告不适合由系统中的通用应用直接使用。通用应用应使用完整输入堆栈,该堆栈提供具有完整上下文并具有有效访问权限控制的 InputEvent。

一些较低级别的系统程序需要访问 fuchsia.input.report 以读取传感器和其他简化的输入。这些是受系统信任且需要访问此级别输入的程序。系统终端 Virtcon 需要对键盘进行低级访问权限。“屏幕亮度”程序需要访问亮度传感器。这些程序类型应直接使用 fuchsia.input.reportprint-input-report 二进制文件可用作使用低级别输入的示例程序。

无状态报告

fuchsia.input.report 应尽可能忠实于实体设备发送的硬件报告。这意味着,fuchsia.input.report API 不应添加硬件设备中不存在的其他状态。这意味着某些报告缺少系统其余部分的上下文和状态。例如,鼠标报告给出了 X 和 Y 的相对移动,但不会跟踪屏幕上的全局位置。触摸报告会提供手指 ID,但会直接提供“悬停”“按下”和“释放”事件。键盘报告没有键盘布局的概念。此信息需要由输入堆栈的较高级别填充。

特定于 Fuchsia 的枚举

InputReport API 明确不会使用 HID 枚举进行说明(例如:LED 枚举、键盘按键枚举)。它将使用 Fuchsia 专用枚举。这为 API 提供了额外的灵活性,以便声明其他用途并移除我们选择不支持的使用。(例如,HID 没有我们需要支持的恢复出厂设置 (FDR) 按钮枚举。)

通过显式不使用 HID 枚举实现一致性比保持一致性,以及在某些情况下使用 HID 枚举,但在其他情况下添加其他值会更容易保持一致。