Devicetree 概览

设备树是一种用于描述硬件的数据结构。在 Fuchsia 中,开发板驱动程序使用设备树在驱动程序框架中创建节点,并设置初始化开发板所需的配置。Devicetree 包含以下两个部分,由板级驱动程序用于构建设备树解析器:

  • 设备树管理器库此库负责解析设备树 blob (DTB) 并创建可供设备树访问者访问的运行时节点结构。

  • 设备树访问者访问者是指板驱动程序在 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,以便板级驱动程序绑定到该设备。然后,板级驱动程序会调用设备树管理器,解析设备树,并创建其他子节点。典型的测试是枚举创建的节点。