建造司機

本文說明如何建構驅動程式庫,並重點介紹定義套件、元件和驅動程式的最佳做法。

概念

驅動程式是一種元件,因此在深入瞭解之前,請務必先瞭解如何建構元件

驅動程式套件 GN 範本

驅動程式作者應使用驅動程式庫專屬的 GN 範本。 Fuchsia 定義下列 GN 範本,用於定義驅動程式庫元件和驅動程式庫套件:

以下是包含一個驅動程式庫元件的假設套件:

import("//build/drivers.gni")


driver_bind_rules("bind") {
    rules = "meta/driver.bind"
    bind_output = "my-driver.bindbc"
}

fuchsia_cc_driver("driver") {
  output_name = "my-driver"
  sources = [ "my_driver.cc" ]
}

fuchsia_driver_component("component") {
  component_name = "my-driver"
  deps = [
      ":driver",
      ":bind",
  ]
}

fuchsia_driver_package("package") {
  package_name = "my-driver"
  deps = [ ":component" ]
}

請注意下列詳細資料: * fuchsia_driver_component() 範本會宣告元件。 這取決於驅動程式庫共用程式庫 (fuchsia_cc_driver()) 和驅動程式庫程式的繫結規則 (driver_bind_rules())。 * fuchsia_driver_component() 會自動為驅動程式庫產生元件資訊清單。我們會在後續章節中說明。* 元件和套件名稱皆衍生自目標名稱。 在上述範例中,這些名稱會合併形成啟動元件的網址:fuchsia-pkg://fuchsia.com/my_package#meta/my_driver.cm

自動生成的元件資訊清單是什麼樣子?

使用 fuchsia_driver_component 範本時,系統會自動產生驅動程式庫的元件資訊清單。以上述範例來說,結果會如下所示

{
    program: {
        runner: 'driver',
        binary: driver/my_driver.so,
        bind: meta/bind/my_driver_bind.bindbc
    }
}

請注意下列詳細資料: * binary 欄位指向驅動程式庫共用程式庫。 * bind 欄位會指向驅動程式庫繫結規則檔案。

我可以加入自己的元件資訊清單嗎?

好的!如要編寫自己的元件資訊清單,只要將其以檔案形式新增至專案,然後更新 fuchsia_driver_component 即可指向該檔案:

fuchsia_driver_component("component") {
  component_name = "my-driver"
  manifest = "meta/my-own-manifest.cml
  deps = [
      ":driver",
      ":bind",
      ]
}

在建構作業中加入驅動程式。

如要在建構作業中加入驅動程式,必須將驅動程式放入兩個特殊位置。

第一個是 //build/drivers/all_drivers_list.txt。 如果沒有這麼做,系統會顯示建構錯誤,提醒您這項問題。 all_drivers_list.txt 檔案應包含 Fuchsia 存放區中的所有驅動程式庫標籤。這份清單會持續更新,確保所有驅動程式都能獲得支援和更新。

如果驅動程式只能建構 x64,請將其新增至:

//build/drivers/all_drivers_lists_x64.txt

如果驅動程式只能建構 arm64,請將其新增至:

//build/drivers/all_drivers_lists_arm64.txt

第二個位置是: //bundles:drivers-build-only。 如果忘記在這裡新增驅動程式,也會發生建構錯誤。 如要將項目新增至這個清單,請務必將驅動程式庫元件新增至來源位置的本機驅動程式庫群組。

舉例來說,如要在 //src/ui/input/drivers 下方新增驅動程式庫,請在 //src/ui/input/drivers 中新增項目。

針對 drivers-build-only 目標,請務必納入 fuchsia_driver_components() 目標的路徑,而非直接指向 fuchsia_cc_driver() 目標。

在圖片中加入駕駛人

如要在要刷入裝置的映像檔中加入驅動程式,有兩種做法:

1) 透過組裝輸入套件 (AIB) 納入驅動程式 2) 透過主機板輸入套件 (BIB) 納入驅動程式

在這兩種情況下,您都可以將驅動程式庫放在啟動套件或基本套件中。

包括透過組件輸入套件提供的驅動程式

如果驅動程式庫是平台的一部分,這是正確的做法。在 //bundles/assembly/BUILD.gn 中新增 assembly_input_bundle 目標。 範例如下:

assembly_input_bundle("my_driver") {
  boot_driver_packages = [
    {
      package_target = "//path/to/my/driver:package"
      driver_components = [ "meta/my_driver.cm" ]
    },
  ]
}

如要將驅動程式納入基本套件而非開機套件,請將程式碼片段中的 boot_driver_packages 替換為 base_driver_packages

接著,在 //src/lib/assembly/platform_configuration/src/subsystems/ 下的相關子系統檔案中新增一些邏輯,以便只在必要時納入 AIB。

if context.board_info.provides_feature("fuchsia::my_driver") {
    builder.platform_bundle("my_driver");
}

最後,對於應包含此驅動程式庫的開發板,請在開發板的 board_input_bundle 中,將 fuchsia::my_driver 新增至 provided_features 區段。你可以在 //boards/${board_name}/BUILD.bazel 下方找到。

包括透過「開發板輸入組合」

一般來說,直接納入主機板輸入內容的驅動程式應使用 Bazel 建構規則,而非 GN。因此本指南不會提供完成這項工作的操作說明。在這種情況下,建議您改用 Bazel 移植驅動程式庫。