目标和动机
驱动程序框架管理硬件设备与客户端之间的连接。历史上,此连接支持三种 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 运行 CL,以尝试查找其他错误。
依赖于多路复用的组件必须先有权访问相关的 devfs 路径。在 CML 文件中搜索 dev
、dev-class
或 dev-class-{name}
是查找相关组件的好方法。
修复了 fuchsia.io/Node
如果移除此多路复用,则使用设备作为文件描述符 (fd
) 的代码将会中断。
如下所示的代码非常可疑:
fbl::unique_fd fd;
zx_status_t status = fdio_open3(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 协议仍在依赖于多路复用。
赞助商
如有疑问或需要了解最新状态,请与我们联系: