本指南說明如何在 DFv2 中設定 devfs
驅動程式庫,讓其他 Fuchsia 能夠發現驅動程式庫的服務
整個系統中的元件本指南使用 DFv2 驅動程式範例
,瞭解 devfs
設定程序。
步驟如下:
1. 識別目標 FIDL 通訊協定
在 DFv2 驅動程式的原始碼中,找出目標 FIDL 通訊協定 (可
從 fidl::Server<>
或 fidl::WireServer<>
繼承而來的devfs
設定,例如:
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
連接器物件初始化
,以及回呼函式在步驟 1 中
建立於步驟 3,例如:
driver_devfs::Connector<fuchsia_examples_metadata::Retriever> devfs_connector_{
fit::bind_member<&RetrieverDriver::Serve>(this)};
(資料來源:retriever-driver.cc
)
5. 將開發工具連接器繫結至調度器
將 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
)