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 旨在成为输入堆栈的最低级别。此 API 应由输入堆栈的下一阶段使用,并且这些报告的修改版本应传递给更高级别的客户端。这些报告的客户端应为负责其余输入堆栈的程序(例如:RootPresenter、SessionFramework)。
这些报告不适合供系统中的通用应用直接使用。通用应用应使用完整的输入堆栈,该堆栈可提供具有完整上下文和有效访问权限控制的 InputEvent。
某些较低级别的系统程序需要访问 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 枚举(即在某些情况下使用 HID 枚举,但在其他情况下添加其他值)更容易保持一致。