来自 SPB 连接的外围设备的中断

与 PCI 等总线不同, (SPB) 的 简单外围总线 (如 I2C 或 SPI)不提供标准化的总线特定方式来将中断请求从外围设备传送到处理器。 与之相反,通过 SPB 连接的外围设备通过单独的硬件路径来指示某个中断,该路径位于 SPB 和 SPB 控制器外部。 此中断路径的详细信息往往因硬件平台而异,但 Windows 在连接到 SPB 的外围设备的驱动程序中隐藏这些详细信息,以使驱动程序能够在各种硬件平台上工作。

通常,来自 SPB 连接的外围设备的中断请求行连接到常规用途 I/O (GPIO) 控制器上的引脚,GPIO 控制器将中断从设备中继到处理器。 有关详细信息,请参阅 GPIO 中断

外围设备驱动程序 (CmResourceTypeInterrupt) 获取此 GPIO 中断作为抽象 Windows 中断资源,并将中断连接到驱动程序的中断服务例程 (ISR) 。 中断资源抽象从驱动程序中隐藏特定于平台的中断详细信息。 例如,驱动程序可以忽略详细信息,例如中断是从 GPIO 引脚还是从其他源接收的。 为了保持这种抽象,内核的中断陷阱处理程序(在 DIRQL 中运行)可能需要通过清除或暂时屏蔽 GPIO 引脚上的中断来使活动中断请求静音。 GPIO 控制器的硬件寄存器通常是内存映射的,可通过 DIRQL 访问。

相比之下,SPB 连接的外围设备不是内存映射的,此设备的 ISR 通常必须在 IRQL = PASSIVE_LEVEL 运行。 为了访问设备中的硬件寄存器,ISR 发送 I/O 请求以通过 SPB 执行串行传输。 此类传输速度相对较慢,无法在以 DIRQL 运行的 ISR 中执行。 但是,被动级别 ISR 可以同步发送 I/O 请求,然后阻止该请求,直到请求完成。

对于边缘触发的中断,内核的陷阱处理程序会自动清除 GPIO 引脚上的中断请求,然后将设备的 ISR 安排为在被动级别运行。 陷阱处理程序必须清除中断,以防止在陷阱处理程序返回后再次发生相同的中断。

对于级别触发的中断,内核的中断陷阱处理程序会自动屏蔽 GPIO 引脚上的中断请求,然后将设备的 ISR 安排为在被动级别运行。 ISR 必须从设备中清除中断请求。 ISR 返回后,内核会在 GPIO 引脚上取消屏蔽中断请求。

设备的被动级别 ISR 应仅执行中断的初始服务,然后返回以避免延迟其他设备的被动级别 ISR。 通常,驱动程序应将其他与中断相关的处理推迟到中断工作线程,该线程以低于 ISR 的优先级运行。

从 Windows 8 开始,用户模式驱动程序框架 (UMDF) 支持 UMDF 驱动程序的 ISR。 SPB 外围设备的 UMDF 驱动程序调用 IWDFDevice3::CreateInterrupt 方法,将 ISR 连接到设备的中断。 当设备发出中断请求信号时,内核的陷阱处理程序会将 ISR 计划为在被动级别运行。 有关详细信息,请参阅 访问硬件和处理中断

从 Windows 8 开始,内核模式驱动程序框架 (KMDF) 支持被动级别 ISR。 SPB 外围设备的 KMDF 驱动程序调用 WdfInterruptCreate 方法,将被动级别 ISR 连接到设备的中断。 此方法的输入参数之一是指向包含中断配置信息的 WDF_INTERRUPT_CONFIG 结构的指针。 若要将 ISR 配置为在被动级别运行,请将此结构的 PassiveHandling 成员设置为 TRUE。 有关详细信息,请参阅 支持 Passive-Level 中断