驱动程序 FIDL 多路复用的废弃

目标与动力

驱动程序框架用于管理硬件设备与客户端之间的连接。一直以来,此连接提供三种 FIDL 协议: - fuchsia.io/Node - fuchsia.device/Controller - 设备的实际 FIDL 协议

这种多路复用要求驱动程序框架拥有相应通道,以便手动传送节点和控制器协议。这可以防止底层驱动程序拥有通道,从而限制驱动程序能够执行的操作,并阻止驱动程序使用标准 FIDL 有线服务器对象和模式。

这种隐式多路复用也会违反 FIDL 组合设计原则。FIDL 设计原则表明,一个协议在编译时可以是多个协议的 composed。不过,驱动程序框架会在运行时执行此组合操作,并且不知道设备正在朗读 FIDL 协议。

许多与 devfs 交互的客户端会将其通道从一个 FIDL 协议转换为另一个 FIDL 协议,这就消除了类型安全,通常会导致代码更难以遵循。

此项目旨在从驱动程序框架中移除 FIDL 多路复用。这需要更新与驱动程序交互的客户端。

此项目完成后,司机将能够拥有自己与其客户之间的通道。

技术背景

贡献者应熟悉 FIDL 客户端。 贡献者无需熟悉驱动程序或驱动程序框架。

如何提供帮助

选择任务

许可名单中的每一行代表一项任务。您可以随意选择这些任务。

fuchsia.io/Node 有一个许可名单,fuchsia.device/Controller 有一个许可名单。

执行任务

遗憾的是,这种多路复用是隐式的,因此没有什么好办法预先弄清哪些代码依赖于它。我们能用的最佳工具就是 从许可名单中移除一行,然后查看哪些内容有问题。

查找组件的最简单方法是先确保 QEMU 可启动。如果它无法启动,请检查并修复所有错误。在 QEMU 启动后,您可以通过 CQ 运行 CL 以尝试查找其他错误。

依赖多路复用的组件首先必须有权访问相关 devfs 路径。在 CML 文件中搜索 devdev-classdev-class-{name} 是查找相关组件的好方法。

修复 fuchsia.io/Node

移除此多路复用时,代码会中断将设备用作文件描述符(即 fd)。

像下面这样的代码是非常可疑的代码:fbl::unique_fd fd; zx_status_t status = fdio_open(dev_path, 0, fd.reset_and_get_address());

应将其替换为面向 FIDL 的代码: zx::result client_end = component::Connect<fidl_my_protocol::Protocol>(dev_path);

修复 fuchsia.device/Controller

移除此多路复用功能后,连接到 fuchsia.device/Controller 的代码将会中断。这些位置可能更容易找到,因为您可以在任何损坏的组件中使用 grep 来使用此协议。

像下面这样的代码是可疑的代码:component::ConnectAt<fuchsia_device::Controller>(caller.directory(), device_path);

解决方法是打开设备控制器的路径,该路径始终是设备的路径加上 /device_controller

例如,更新后的代码应如下所示:std::string device_controller_path = device_path + "/device_controller"; component::ConnectAt<fuchsia_device::Controller>(caller.directory(), device_controller_path);

这同时适用于类路径和拓扑路径,例如:/dev/class/input/000/device_controller /dev/sys/platform/usb/usb-hid/device_controller

此外,您还应警惕将频道投射到设备控制器的代码: fidl::WireCall<fuchsia_device::Controller>(channel)->Rebind();

您必须弄清楚代码在何处接收 channel 并进行更新,以连接到设备控制器。

来回投射单个频道的代码需要进行更新,以承载两个频道。

完成任务

CL 通过 CQ 后,应该就很好合并了!感谢您的帮助。

示例

调试

如果您在仍然存在依赖于多路复用的代码的情况下移除某个类,您会看到以下错误消息:

{$TOPOLOGICAL_PATH} ({$PROTOCOL_ID}): Failed to send message with ordinal={$ORDINAL} to device: FIDL endpoint was unbound due to unexpected message, status: ZX_ERR_NOT_SUPPORTED (-2), detail: unknown ordinal
It is possible that this message relied on deprecated FIDL multiplexing.
For more information see https://fuchsia.dev/fuchsia-src/contribute/open_projects/drivers/fidl_multiplexing

拓扑路径和协议 ID 可以很好地指明哪种设备和 FIDL 协议仍在依赖多路复用。

赞助商

如有疑问或了解最新状态,请与我们联系: