设备树是一种用于描述硬件的数据结构。在 Fuchsia 中,开发板驱动程序使用设备树在驱动程序框架中创建节点,并设置初始化开发板所需的配置。Devicetree 包含以下两个部分,由板级驱动程序用于构建设备树解析器:
设备树访问者:访问者是指板驱动程序在
Walk
调用期间向设备树管理器提供的对象。在遍历设备树时,系统会在设备树的所有节点上调用每个访问者的接口。它们负责将设备树数据转换为驱动程序专用元数据和绑定规则。
板级驱动程序集成
板级驱动程序使用传入的命名空间初始化设备树管理器库,以便提供对 fuchsia_hardware_platform_bus::Service::Firmware
协议的连接。管理器使用 fuchsia_hardware_platform_bus::Service::Firmware
协议读取设备树。板级驱动程序可以调用设备树管理器的 Walk
方法来解析设备树 blob 并收集节点属性。在演示调用期间,可以提供多个访问者来解析节点属性并将其转换为 Fuchsia 驱动程序元数据和绑定规则。遍历完成后,开发板驱动程序会调用 PublishDevices
方法,将所有设备节点发布到驱动程序框架。
如需查看参考实现,请参阅 examples
目录。
设备树绑定和访问者
Devicetree 绑定描述了与特定设备或设备类别相关的 devicetree 节点内容的要求。它们使用设备树架构文件进行记录,这些文件是遵循特定元架构的 YAML 文件(例如,请参阅 smc.yaml
)。如需详细了解设备树架构,请参阅 Devicetree 架构工具。
设备树访问者可与设备树管理器搭配使用,以从所有设备或特定设备树节点解析和提取信息。devicetree 规范列出了一系列标准属性,其中一些属性由 visitors/default
文件夹中的默认访问者解析。必须为需要解析的任何新绑定开发新的访问者(如需了解详情,请参阅编写新的访问者)。
默认访问者会被编译到可使用板驱动程序构建的静态库中。所有其他访问者(即驱动程序访问者)均使用 devicetree_visitor
GN 目标构建为共享库。板级驱动程序可以在其软件包的 /pkg/lib/visitors/
下添加必要的访问者收集功能。在运行时,板级驱动程序可以使用 load-visitors
辅助程序库加载所有这些访问者。
传递设备树 blob
通常,引导加载程序会将设备树 blob (DTB) 作为 ZBI_TYPE_DEVICETREE
项向下传递到内核,并通过 fuchsia_hardware_platform_bus::Service::Firmware
协议提供给板级驱动程序。在引导加载程序尚不能够传递 DTB 的开发板中(通常是在开发板启动期间),可以通过开发板配置的 devicetree 字段传入 DTB,之后通过汇编将其附加到 Zircon 启动映像 (ZBI)。
测试设备树
您可以添加板级驱动程序集成测试,以测试设备树库和访问者对节点的解析和创建。board-test-helper
库可用于创建包含驱动程序框架、平台总线和其中运行的开发板驱动程序组件的测试环境。DTB 会作为测试数据资源传递,并通过 board-test-helper
库中实现的虚构 fuchsia_boot::Items
协议提供给板级驱动程序。该测试会创建一个平台总线设备,并为其指定 VID、PID,以便板级驱动程序绑定到该设备。然后,板级驱动程序会调用设备树管理器,解析设备树,并创建其他子节点。典型的测试是枚举创建的节点。