目标和动力
驱动程序框架管理硬件设备和
客户端。过去,此连接提供三种 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 文件中搜索 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 协议是什么 仍然依赖于多路复用。
赞助商
如有疑问或需要更新状态,欢迎与我们联系: