本指南介绍了如何在 DFv2 中设置 devfs
驱动程序,使其他 Fuchsia 能够发现驾驶员的服务
组件。本指南使用的是示例 DFv2 驱动程序
了解 devfs
的设置流程。
具体步骤如下:
1. 确定目标 FIDL 协议
在 DFv2 驱动程序的源代码中,确定目标 FIDL 协议(可以
对于此devfs
,沿用自 fidl::Server<>
或 fidl::WireServer<>
)
设置,例如:
class RetrieverDriver final : public fdf::DriverBase,
public fidl::Server<fuchsia_examples_metadata::Retriever> {
...
// fuchsia.hardware.test/Child implementation.
void GetMetadata(GetMetadataCompleter::Sync& completer) override {
...
}
};
(来源:retriever-driver.cc
)
本指南中的示例使用 Retriever
协议,
fuchsia.examples.metadata.fidl
。
2. 添加 ServerBindingGroup 对象
将 ServerBindingGroup
对象添加到驱动程序类,以绑定 FIDL
协议,例如:
class RetrieverDriver final : public fdf::DriverBase,
public fidl::Server<fuchsia_examples_metadata::Retriever> {
...
fidl::ServerBindingGroup<fuchsia_examples_metadata::Retriever> bindings_;
(来源:retriever-driver.cc
)
3. 创建回调函数
创建一个回调函数,当客户端尝试
连接到驱动程序。在此回调函数中,添加
将 ServerBindingGroup<>
对象设置为 ServerEnd
对象,例如:
class RetrieverDriver final : public fdf::DriverBase,
public fidl::Server<fuchsia_examples_metadata::Retriever> {
...
void Serve(fidl::ServerEnd<fuchsia_examples_metadata::Retriever> request) {
bindings_.AddBinding(dispatcher(), std::move(request), this, fidl::kIgnoreBindingClosure);
}
(来源:retriever-driver.cc
)
4. 初始化 devfs 连接器
通过传递目标 FIDL 协议初始化 devfs
连接器对象
回调函数
在第 3 步中创建的地址,例如:
driver_devfs::Connector<fuchsia_examples_metadata::Retriever> devfs_connector_{
fit::bind_member<&RetrieverDriver::Serve>(this)};
(来源:retriever-driver.cc
)
5. 将 devfs 连接器绑定到调度程序
将 devfs
连接器绑定到驱动程序的调度程序,例如:
zx::result connector = devfs_connector_.Bind(dispatcher());
if (connector.is_error()) {
FDF_SLOG(ERROR, "Failed to bind devfs connector.", KV("status", connector.status_string()));
return connector.status_value();
}
(来源:retriever-driver.cc
)
6. 将 devfs 连接器添加到子节点
添加子节点时,将绑定的 devfs
连接器从
第 5 步添加到节点的
NodeAddArgs
对象。为此,请创建一个 DevfsAddArgs
对象,
在fuchsia.driver.framework/topology.fidl
中定义,而
将 connector
字段设置为 devfs
连接器,例如:
fuchsia_driver_framework::DevfsAddArgs devfs_args{
{.connector = std::move(connector.value())}
};
zx::result owned_child = AddOwnedChild("retriever", devfs_args);
if (owned_child.is_error()) {
FDF_SLOG(ERROR, "Failed to add owned child.", KV("status", owned_child.status_string()));
return owned_child.error_value();
}
(来源:retriever-driver.cc
)