在 DFv2 驅動程式庫中設定 devf

本指南說明如何在 DFv2 中設定 devfs 驅動程式庫,讓其他 Fuchsia 能夠發現驅動程式庫的服務 整個系統中的元件本指南使用 DFv2 驅動程式範例 ,瞭解 devfs 設定程序。

步驟如下:

  1. 識別目標 FIDL 通訊協定
  2. 新增 ServerBindingGroup 物件
  3. 建立回呼函式
  4. 初始化 devfs 連接器
  5. 將開發人員連接器繫結至調度器
  6. 將 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)