SPB 外围设备驱动程序概述

SPB 外围设备驱动程序控制连接到简单外设总线 (SPB) 的外围设备。 此设备的硬件寄存器只能通过 SPB 使用。 若要从设备读取数据或向其写入数据,驱动程序必须将 I/O 请求发送到 SPB 控制器。 只有该控制器可以通过 SPB 启动将数据传输到设备或从设备传输数据的过程。

从 Windows 8 开始,Windows 在简单外围总线 (SPB) 上为外围设备提供驱动程序支持。 SPB(如 I2C 和 SPI)通常用于连接到低速传感器设备,例如加速计、GPS 设备和电池电量监测器。 本概述介绍了 SPB 外围设备驱动程序如何与其他系统组件协同控制 SPB 连接的外围设备。

SPB 外围设备驱动程序可以构建为使用用户模式驱动程序框架 (UMDF) 或内核模式驱动程序架构 (KMDF)。 有关开发 UMDF 驱动程序的详细信息,请参阅 UMDF 入门。 有关开发 KMDF 驱动程序的详细信息,请参阅内核模式驱动程序框架入门

设备配置信息

SPB 连接的外围设备的硬件寄存器未映射内存。 该设备只能通过 SPB 控制器访问,SPB 控制器通过 SPB 与设备串行传输数据。 若要执行 I/O 操作,SPB 外围设备驱动程序将 I/O 请求发送到设备,SPB 控制器执行完成这些请求所需的数据传输。 有关可发送到 SPB 上的外围设备的 I/O 请求的详细信息,请参阅使用 SPB I/O 请求接口

下图显示了一个示例硬件配置,其中 SPB(在本例中为 I2C 总线)将两个外围设备连接到片上系统 (SoC) 模块。 外围设备位于 SoC 模块的外部,并连接到模块上的四个引脚。 SoC 模块包含主处理器(未显示),外加一个 I2C 控制器和一个常规用途 I/O (GPIO) 控制器。 处理器使用 I2C 控制器与两个外围设备串行传输数据。 来自这些设备的中断请求线连接到配置为中断输入的两个 GPIO 引脚。 当设备发出中断请求信号时,GPIO 控制器将中断中继到处理器。

spb 外围设备的连接。

由于此示例中的 GPIO 控制器和 I2C 控制器已集成到 SoC 模块中,因此其硬件寄存器是内存映射的,可以由处理器直接访问。 但是,处理器只能通过 I2C 控制器间接访问两个外围设备的硬件寄存器。

SPB 不是即插即用 (PnP) 总线,因此不能用于自动检测和配置插入总线的新设备。 SPB 连接设备的总线和中断连接通常是永久性的。 即使设备可以从插槽中拔出,此插槽通常也专用于设备。 此外,SPB 不提供带内硬件路径,用于将中断请求从总线上的外围设备中继到总线控制器。 相反,中断的硬件路径与总线控制器是分开的。

硬件平台的供应商将 SPB 连接的外围设备的配置信息存储在平台的 ACPI 固件中。 在系统启动期间,ACPI 驱动程序为 PnP 管理器枚举总线上的设备。 对于每个枚举设备,ACPI 提供有关设备的总线和中断连接的信息。 PnP 管理器将此信息存储在名为资源中心的数据存储中。

设备启动时,PnP 管理器会向设备驱动程序提供一组硬件资源,用于封装资源中心为设备存储的配置信息。 这些资源包括连接 ID 和中断号。 连接 ID 封装总线连接信息,例如 SPB 控制器、总线地址和总线时钟频率。 在向设备发送 I/O 请求之前,驱动程序必须首先使用连接 ID 打开与设备的逻辑连接。 中断号是 Windows 中断资源,驱动程序可以将其中断服务例程 (ISR) 连接到该中断资源。 驱动程序可以很容易地从一个硬件平台移植到另一个平台,因为连接 ID 和中断号是高级抽象,隐藏了有关物理总线和中断连接的平台特定信息。

软件层和硬件层

以下方块图显示了将 SPB 上的外围设备连接到使用该设备的应用程序程序的软件层和硬件层。 此示例中的 SPB 外围设备驱动程序是 UMDF 驱动程序。 外围设备(在图的底部)是传感器设备(例如,加速计)。 如上图所示,外围设备连接到 I2C 总线,并通过 GPIO 控制器上的引脚发出中断请求的信号。

连接 spb 的传感器设备的软件层和硬件层。

灰色显示的三个块是系统提供的模块。 从 Windows 7 开始,传感器类扩展可用作 UMDF 的特定于传感器的扩展。 从 Windows 8 开始,SPB 框架扩展 (SpbCx) 和 GPIO 框架扩展 (GpioClx) 作为 KMDF 的扩展,它们分别执行特定于 SPB 控制器和 GPIO 控制器的函数。

在上图顶部,应用程序调用传感器 API位置 API 中的方法来与传感器设备通信。 通过这些调用,应用程序可以向设备发送 I/O 请求,并从设备接收事件通知。 有关这些 API 的详细信息,请参阅 Windows 中的传感器和位置平台简介

当应用程序调用需要与 SPB 外围设备驱动程序通信的方法时,传感器 API 或位置 API 将创建 I/O 请求,并将其发送到 SPB 外围设备驱动程序。 传感器类扩展模块可帮助驱动程序处理这些 I/O 请求。 当驱动程序收到新的 I/O 请求时,驱动程序会立即将请求交给传感器类扩展,该扩展会将请求排队,直到驱动程序准备好处理为止。 如果应用程序的 I/O 请求需要将数据传输到外围设备或从外围设备传输数据,SPB 外围设备驱动程序会为此传输创建 I/O 请求,并将请求发送到 I2C 控制器。 此类请求由 SpbCx 和 I2C 控制器驱动程序共同处理。

SpbCx 是一个系统提供的组件,用于管理 SPB 控制器(如本例中的 I2C 控制器)的 I/O 请求队列。 硬件供应商为控制器提供的 I2C 控制器驱动程序管理 I2C 控制器中所有特定于硬件的操作。 例如,控制器驱动程序访问控制器的内存映射硬件寄存器,以通过 I2C 总线启动与外围设备的数据传输。

当发生需要 SPB 外围设备驱动程序或用户模式应用程序注意的硬件事件时,外围设备会发出中断请求。 来自外围设备的中断线连接到 GPIO 引脚,该引脚被配置为接收中断请求。 当设备向 GPIO 引脚发出中断信号时,GPIO 控制器向处理器发出中断信号。 作为对此中断的响应,内核的中断陷阱处理程序调用 GpioClx 的 ISR。 此 ISR 查询 GPIO 控制器驱动程序,然后该驱动程序访问 GPIO 控制器的内存映射硬件寄存器,以识别中断的 GPIO 引脚。 若要使中断保持静音,GPIO 控制器驱动程序要么清除(如果中断是边缘触发的),要么屏蔽(如果中断是电平触发的)GPIO 引脚上的中断请求。 必须使中断静音,以防止陷阱处理程序返回时处理器再次接收相同的中断。 对于电平触发的中断,SPB 外围设备驱动程序中的 ISR 必须访问外围设备的硬件寄存器才能清除中断,然后才能取消屏蔽 GPIO 引脚。

在内核的中断陷阱处理程序返回之前,它会将 SPB 外围设备驱动程序中的 ISR 安排为在 IRQL = PASSIVE_LEVEL 运行。 从 Windows 8 开始,UMDF 驱动程序可以将其 ISR 连接到驱动程序作为抽象 Windows 中断资源接收的中断;有关详细信息,请参阅处理中断。 为了确定调用哪个 ISR,操作系统会查找分配给中断 GPIO 引脚的虚拟中断,并找到连接到中断的 ISR。 在前面的图中,此虚拟中断被标记为辅助中断。 相比之下,GPIO 控制器的硬件中断被标记为主要中断。

由于 SPB 外围设备驱动程序中的 ISR 在被动级别运行,因此 ISR 可以使用同步 I/O 请求访问外围设备中的硬件寄存器。 ISR 可以阻止,直到这些请求完成。 以相对较高的优先级运行的 ISR 应尽快返回,并将中断的所有后台处理推迟到以较低优先级运行的工作例程。

为了响应辅助中断,SPB 外围设备驱动程序在传感器类扩展中发布事件,该扩展通过传感器 API 或定位 API 通知用户模式应用程序该事件。