SPB 外围设备驱动程序概述

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

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

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

设备配置信息

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

下图显示了一个示例硬件配置,其中 SPB(在本例中为 I2C 总线)将两个外围设备连接到芯片 (SoC) 模块上的系统。 外围设备位于 SoC 模块外部,并连接到模块上的四个引脚。 SoC 模块包含main处理器 (未) 显示,外加 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 控制器的 I/O 请求队列,例如此示例中的 I2C 控制器。 由硬件供应商为控制器提供的 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 通知用户模式应用程序。