本文档演示了如何构建驱动程序,并重点介绍了定义软件包、组件和驱动程序的最佳实践。
概念
驱动程序是一种组件,因此在继续操作之前,请务必先了解如何构建组件。
驱动程序软件包 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_labels
(fx args
)
将驱动程序包含在基础软件包中
您可以将驱动程序添加到基础软件包中,具体取决于产品、开发板或者仅根据您的本地环境。您需要将 fuchsia_package
目标的路径添加到以下三个位置之一:
- 商品:
//products
内相关.gni
文件中的product_driver_package_labels
- board:
//boards
内相关.gni
文件中的board_driver_package_labels
- 本地:
base_driver_package_labels
(fx args
)