站台总线

简介

术语平台总线 是指特定的 Fuchsia 驱动程序,其源代码位于 //fuchsia/src/devices/bus/drivers/platform/. 但是,该术语也指管理 Fuchsia 中较低级别驱动程序的框架。 在本文档中,平台总线驱动程序是指特定的驱动程序和平台总线 指的是通用框架。

整个平台总线包含以下几种类型的驱动程序:

  • 平台总线驱动程序,用于管理平台总线。这是一个通用驱动程序 不具有特定于硬件的功能平台总线驱动程序会自动启动 由驱动程序管理器管理。

  • 板驱动程序,是平台总线驱动程序加载的第一个驱动程序。 板驱动程序包含平台总线所需的全部平台特定信息 并控制平台总线将加载哪些其他驱动程序。 在 arm64 平台上,平台总线驱动程序使用引导加载程序或启动 shim 中的信息 为运行它的平台绑定正确的板级驱动程序。 在 x86 平台上,平台总线驱动程序始终会加载 x86 板级驱动程序并创建平台 根据 ACPI 信息判断设备是否可用

  • 平台设备驱动程序是 Fuchsia 中更高层级驱动程序的基础。 这些驱动程序对特定功能(如 USB、 eMMC 或 NAND 存储设备等,并基于其加载更高层级的驱动程序。

  • 协议实现驱动程序是提供所需协议的驱动程序 由板驱动程序提供一个常见的例子是 GPIO 驱动程序, 用于引脚多路复用的板级驱动程序。过去,平台总线也用来代理这些司机的 协议到平台设备,但现在我们改用复合设备。 随着时间的推移,我们很可能会逐步停止在平台总线中使用协议实现驱动程序 并将其替换为无需阻塞即可等待驱动程序加载的新方法。

  • 最后,平台代理驱动程序是加载的平台总线驱动程序的配套应用 复制到平台设备驱动程序主机中。此驱动程序支持代理平台设备协议 以及从平台设备驱动程序到平台总线驱动程序的其他资源协议, 协议实现驱动程序。之所以需要这样做,是因为平台设备驱动程序在 驱动程序主机进程与平台总线驱动程序和协议实现驱动程序不同。

Fuchsia 平台总线示意图 来源

平台总线初始化

平台总线驱动程序在启动时由驱动程序管理器自动启动。 由于平台总线驱动程序是一个通用驱动程序,因此不包含有关 平台,则它首先加载负责处理平台专用逻辑的板级驱动程序。 为了确定要加载的板级驱动程序,平台总线驱动程序会读取 ZBI_TYPE_PLATFORM_ID ZBI 数据中的记录 引导加载程序。然后,它会添加采用 ZX_PROTOCOL_PBUS 协议且 将 BIND_PLATFORM_DEV_VIDBIND_PLATFORM_DEV_PID 绑定变量设置为 vid,并 来自平台数据记录正确的板驱动程序将绑定到此设备并继续 平台总线初始化过程。在 x86 平台上,系统会加载 x86 板级驱动程序 。

板驱动程序使用平台总线协议与平台总线驱动程序进行通信。 板级驱动程序完成自己的初始化后,将使用 ProtocolDeviceAdd() 调用平台总线协议来加载协议实现驱动程序。 协议实现驱动程序加载后,必须向平台总线注册其协议 驱动程序 RegisterProtocol() API。 ProtocolDeviceAdd() 将阻塞,直到驱动程序调用 RegisterProtocol(),因此板驱动程序 必须从它自己的某个线程调用 RegisterProtocol(),而不是像下面这样的驱动程序管理器回调 Bind().

添加协议设备后,板级驱动程序将调用 DeviceAdd() 调用 来创建平台设备,这将导致 每个平台设备驱动程序在其各自的驱动程序主机中加载它们。 创建平台设备后,平台总线初始化即告完成。

复合平台设备

平台总线还支持添加平台设备以用作复合中的组件 设备。平台总线 CompositeDeviceAdd() 调用会添加一个复合设备,其中第 0 个 组件是平台设备,由提供的 PBusDev 结构体进行描述。 其余组件的绑定规则由 components 参数提供。 primary_fragment 用于指定托管复合设备的驱动程序 应在哪个文件夹中创建指定 NULL 将为 复合设备,而等于某个 fragment 名称的有效字符串将添加复合 发送到另一个 fragment 的驱动程序主机。传递“pdev”是不允许使用的,因为 不希望将复合设备添加到平台总线驱动程序的驱动程序主机。

复合平台设备的内部结构与非复合型设备略有不同。 驱动程序管理器组件组件代理驱动程序(而非平台代理驱动程序) 改为代理平台设备协议。例如,在上图中,我们有一个复合设备 。 音频驱动程序在新的驱动程序主机中启动,驱动程序管理器组件和组件代理驱动程序 负责将 PDEV 和 I2C 协议代理到音频驱动程序。

平台设备协议

平台设备协议 (ZX_PROTOCOL_PDEV) 是平台总线 平台设备驱动程序。该协议提供对各种资源(如 MMIO 范围、中断、 BTI 和 SMC 范围。它不通过如下方式请求 MMIO 和中断: 物理地址或 IRQ 号码,则由从零开始的索引请求这些资源。 这样,我们就可以获得适用于特定 IP 的平台设备驱动程序,这些驱动程序可跨多个 因为无需了解确切的 MMIO 地址和中断编号 信息。相反,板驱动程序在 通过 AddDevice() 传递的 PbusDev 结构体。

平台设备协议也适用于协议实现驱动程序。 例如,GPIO 驱动程序可能会使用平台设备协议来访问其 MMIO 和中断。 这样就可以在不同的 SOC 变体之间共享协议实现驱动程序, 其中功能可能相同,但 MMIO 地址和中断编号可能是 与众不同。

平台总线协议

平台总线协议 供板级驱动程序和协议实现驱动程序与平台通信 公交车司机。它仅适用于在平台总线的驱动程序主机( 具体而言,平台设备驱动程序无法访问这些数据)。本协议的用途 供板驱动程序加载协议实现驱动程序并启动平台设备 。协议实现驱动程序也使用该标识符将其协议注册到 从而将其协议提供给平台设备驱动程序。