本文件將說明如何建構驅動程式庫,並強調定義套件、元件和驅動程式的最佳做法。
概念
驅動程式是一種元件,因此在深入瞭解前,請務必先瞭解如何建構元件。
驅動程式套件 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");
}
最後,如果電路板應包含此驅動程式庫,請將 fuchsia::my_driver
新增至其 board_input_bundle
的 provided_features
部分。可在 //boards/${board_name}/BUILD.bazel
下方找到。
透過委員會輸入組合納入
一般來說,要直接納入板卡輸入內容的驅動程式應使用 Bazel 建構規則,而非 GN。因此,本指南不會提供完成此工作的操作說明。在這種情況下,建議您將驅動程式庫移植為使用 Bazel。