构建推动因素

本文档演示了如何构建驱动程序,并重点介绍了定义软件包、组件和驱动程序的最佳实践。

概念

驱动程序是一种组件,因此在继续操作之前,请务必先了解如何构建组件

驱动程序软件包 GN 模板

驱动程序作者应使用特定于驱动程序的 GN 模板。Fuchsia 定义了以下 GN 模板,以定义驱动程序组件和驱动程序软件包:

下面是一个假设的软件包,其中包含一个驱动程序组件:

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


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

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

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

fuchsia_driver_package("my_package") {
  deps = [ ":component" ]
}

请注意以下详细信息: * fuchsia_driver_component() 模板声明了组件。 它依赖于驱动程序共享库 (fuchsia_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 中包含您的驱动程序。

为了在 build 中包含您的驱动程序,需要将其放入两个特殊位置。

第一个是 //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_driver() 目标。

在设备上添加驱动程序

如果要在实际设备上包含您的驱动程序,有两种方法可供选择:您可以在 bootfs 中添加驱动程序,或以基本软件包的形式包含驱动程序。

在 bootfs 中添加驱动程序

您可以将驱动程序添加到 bootfs 中,具体取决于产品、开发板或者只是您的本地环境。您需要将 fuchsia_driver_component 目标的路径添加到以下三个位置之一:

  • 商品://products 内相关 .gni 文件中的 product_bootfs_labels
  • board://boards 内相关 .gni 文件中的 board_bootfs_labels
  • 本地:board_bootfs_labelsfx args

将驱动程序包含在基础软件包中

您可以将驱动程序添加到基础软件包中,具体取决于产品、开发板或者仅根据您的本地环境。您需要将 fuchsia_package 目标的路径添加到以下三个位置之一:

  • 商品://products 内相关 .gni 文件中的 product_driver_package_labels
  • board://boards 内相关 .gni 文件中的 board_driver_package_labels
  • 本地:base_driver_package_labelsfx args