处理设备硬件中断的 Windows 驱动程序框架(WDF)驱动程序必须为每个设备可以支持的每个中断创建框架中断对象。 在 Windows 8 或更高版本的操作系统上运行的框架版本 1.11 及更高版本中,“Kernel-Mode Driver Framework”(KMDF)和“User-Mode Driver Framework”(UMDF)驱动程序可以创建需要被动级别处理的中断对象。 但是,除非你在芯片(SoC)平台上为系统编写驱动程序,否则驱动程序应使用 DIRQL 中断对象。
驱动程序通常在其 EvtDriverDeviceAdd 回调函数中创建框架中断对象。 驱动程序还可以从其 EvtDevicePrepareHardware 回调函数创建中断对象。
框架在即插即用(PnP)管理器将系统资源(如中断向量)分配给设备之前调用驱动程序的 EvtDriverDeviceAdd 回调函数。 在 PnP 管理器分配资源后,框架会将中断资源存储在设备的中断对象中。 ( 不支持即插即用 的驱动程序无法使用中断对象。
若要创建框架中断对象,驱动程序必须初始化 WDF_INTERRUPT_CONFIG 结构并将其传递给 WdfInterruptCreate 方法。
UMDF 支持以下类型的中断:
- 级别触发(共享或独占)
- 边缘触发(仅限专用)
- MSI(按定义独有)
注意 UMDF 不支持 共享的边沿触发中断。
从 UMDF 版本 2.15 开始,UMDF 支持简单设备的中断,例如硬件按下按钮(通常由 GPIO 引脚提供支持),无法使用硬件寄存器显式启用或禁用。 支持这种设备时,UMDF 驱动程序必须使用独占的边缘触发中断。
从 KMDF 版本 1.15 开始,KMDF 对此类设备的中断功能提供支持,而不需采用处理 Active-Both 中断中所述的解决方法。
此外 ,在WDF_INTERRUPT_CONFIG中,驱动程序还提供指向以下驱动程序提供的事件回调函数的指针:
EvtInterruptEnable
启用硬件中断。
EvtInterruptDisable
禁用硬件中断。
EvtInterruptIsr
中断服务例程(ISR)用于中断。
EvtInterruptDpc
中断的延迟过程调用 (DPC)。
EvtInterruptWorkItem
工作项用于处理被动级中断。
对于在 Windows 8 或更高版本的操作系统上使用框架版本 1.11 或更高版本的驱动程序,驱动程序可以将框架中断对象的父级(DIRQL 或被动)显式设置为框架设备对象或框架队列对象。 如果驱动程序指定父级,驱动程序必须将中断对象的WDF_INTERRUPT_CONFIG结构的 AutomaticSerialization 成员设置为 TRUE。 (回想一下,如果 AutomaticSerialization 为 TRUE,框架会将中断对象的 EvtInterruptDpc 或 EvtInterruptWorkItem 回调函数的执行与中断父对象下的其他对象的回调函数同步执行。
例如,驱动程序可以将队列指定为中断的父级,以便将队列的回调与中断的 EvtInterruptDpc 或 EvtInterruptWorkItem 回调同步。 在此配置中,框架在删除设备对象时删除队列对象。
调用 WdfInterruptCreate 后,驱动程序可以选择调用 WdfInterruptSetPolicy 或 WdfInterruptSetExtendedPolicy 来指定其他中断参数。 通常,驱动程序从其 EvtDriverDeviceAdd 回调函数调用这些方法。
框架会在删除中断的父项之前自动删除中断。 (可选)驱动程序可以调用 WdfObjectDelete ,以在早期删除中断。
支持消息信号中断机制
Windows Vista 和更高版本支持消息信号中断(MSIs)。 若要使作系统支持设备的 MSIs,驱动程序的 INF 文件必须在注册表中设置一些值。 有关如何设置这些值的信息,请参阅 注册表中的“启用消息信号中断”。
驱动程序应为设备支持的每个中断向量或 MSI 消息创建框架中断对象。 如果 PnP 管理器未向设备授予设备支持的所有中断资源,驱动程序不会使用额外的中断对象,也不会调用其回调函数。
在 Windows 7 中,操作系统不支持为每个设备功能请求超过 910 条中断请求的资源。 在 Windows 8 中,操作系统不支持每个设备功能超过 2,048 个中断的资源请求。
如果设备驱动程序超出此限制,设备可能无法启动。 若要在包含多个逻辑处理器的计算机中运行,驱动程序不应为每个处理器请求超过一个中断。
驱动程序必须能够在不中断的情况下容忍系统重新平衡的中断资源,其中,即插即用管理器(PnP 管理器)会根据资源需求列表为设备分配任何一组备用中断资源。 例如,设备可能被分配的消息中断数小于驱动程序所请求的数量。 在最坏的情况下,驱动程序必须准备好仅使用一个基于行的中断来操作设备。