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

目标和动力

驱动程序框架管理硬件设备和 客户端。过去,此连接提供三种 FIDL 协议: - fuchsia.io/Node - fuchsia.device/Controller - 设备的实际 FIDL 协议

这种多路复用要求驱动程序框架拥有相应通道, 可以手动处理节点和控制器协议这样可以防止 底层驱动程序拥有渠道,这会限制驱动程序的能力 以及阻止驱动程序使用标准的 FIDL 有线服务器对象, 模式。

这种隐式多路复用技术也 组合的 FIDL 设计原则。 FIDL 设计原则规定,一个协议可以是多个 composed, 协议。不过,驱动程序框架 构成的 FIDL 协议,并且不知道 设备。

许多与 devfs 交互的客户端将从一个 FIDL 投射其频道 避免类型安全,通常让代码更具针对性, 很难理解。

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

此项目完成后,驾驶员将能够拥有 对自身及其客户的影响。

技术背景

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

如何提供帮助

选择任务

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

有一个针对 fuchsia.io/Node 的许可名单和一个针对 fuchsia.device/Controller

执行任务

遗憾的是,这种多路复用是隐式的, 并预先找出哪些代码依赖于它我们有最好的工具是 从许可名单中添加一行,然后查看哪些内容会中断。

查找组件的最简单方法是首先确保 QEMU 已启动。如果 无法启动,请检查并修正所有错误。QEMU 启动后,你可以运行以下命令: 通过 CQ 来尝试查找其他错误。

依赖于多路复用的组件首先必须有权访问 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 协议是什么 仍然依赖于多路复用。

赞助商

如有疑问或需要更新状态,欢迎与我们联系: