目标与动力
驱动程序框架用于管理硬件设备与客户端之间的连接。一直以来,此连接提供三种 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 文件中搜索 dev
、dev-class
或 dev-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 协议仍在依赖多路复用。
赞助商
如有疑问或了解最新状态,请与我们联系: