ACX 电源管理
本主题讨论 ACX 电源管理。 有关 ACX 设备枚举、启动和关闭以及设备重新平衡的信息,请参阅 ACX 设备枚举。 有关 ACX 的一般概述,请参阅 ACX 音频类扩展概述。
ACX 利用 WDF KMDF PnP 电源行为。 有关 KMDF 电源管理序列的详细信息,请参阅 PnP 和电源管理回调序列。
建议 ACX 驱动程序完全实施 WDF 电源管理,例如,通过实施 WDF_PNPPOWER_EVENT_CALLBACKS 结构。 有关详细信息,请参阅在驱动程序中支持 PnP 和电源管理。
ACX 设备意外删除
WDF 框架可以随时调用 EvtDeviceSurpriseRemoval,即未使用电源关闭序列序列化此回调。 WDF 驱动程序不应在接收此回调时执行任何操作,但请注意设备已被意外删除。
电源关闭意外删除回调序列与电源关闭 Dx 和删除情况相同,WDF 不会在意外删除路径上调用以下回调:
- EvtDeviceArmWakeFrom*,如 EvtDeviceArmWakeFromS0
- EvtIoStop(清除电源管理的队列)EvtWdfIoQueueIoStop
- EvtDeviceSelfManagedIoFlush(刷新 I/O 缓冲区)
有关详细信息,请参阅 PnP 和电源管理回调序列和使用电源托管 I/O 队列。
ACX 线路电源开启和启动
可以随时添加“dynamic”AcxCircuit。 驱动程序将创建新的子 PDO 设备,并在处理此 PDO 设备的 WDF PrepareHardware 回调时关联新的 AcxCircuit。 “动态”线路的生存期未绑定到 FDO 的生存期。
只有在驱动程序处理其 FDO 设备的 WDF PrepareHardware 回调时,才能添加“静态”AcxCircuit。 “静态”线路的生存期绑定到 FDO 的生存期。
ACX 驱动程序还可以使用 AcxFactoryCircuitCreate 函数在电源开启序列期间创建 AcxFactoryCircuit 对象(线路提供程序)。 AcxFactoryCircuit 对象使用动态线路创建,以便在 ACX 请求时添加 ACXCIRCUITS。 生成复合终结点(即由两个或多个 ACXCIRCUIT 链接在一起的音频终结点)时,此功能非常有用。
ACX 线路定义在 AcxCircuit/音频终结点初始化期间调用的以下回调:
EvtAcxCircuitPrepareHardware:ACX 会在 WDF 传送其 WDF 准备硬件回调后立即调用此回调。 它使驱动程序有机会执行特定于线路的任何“准备硬件”。 此调用由 ACX 序列化。 调用此调用时,设备不在 D0 中。
EvtAcxCircuitPowerUp:ACX 会在从 Dx 返回后立即调用此回调。 此调用由 ACX 序列化。 设备在 D0 中。
对于复合终结点,AcxCircuits 可以选择注册这些回调:
EvtAcxCircuitCompositeCircuitInitialize,ACX 首次检测到此 ACXCIRCUIT 可见时调用,即关联的设备进入 D0,并使此线路对自身堆栈外部的实体可见。 线路的音频接口仍处于 OFF 状态。
EvtAcxCircuitCompositeInitialize,每次 ACX 完成复合终结点的初始化时都会调用。 在此回调后,ACX 将打开此线路的音频接口。
EvtAcxCircuitCompositeDeinitialize,每次 ACX 在拆解复合终结点时调用。 如果驱动程序自己的堆栈已被意外删除或无法处理 I/O,则驱动程序可能无法收到此回调。
如果存在,会将流实例还原到其预电源关闭状态。
ACX 线路电源关闭和删除
通过使与线路关联的设备对象失效并将其删除,可以随时删除“动态”AcxCircuit。 当驱动程序处理此 PDO 设备的 WDF PrepareHardware/ReleaseHardware 回调时,可以删除/从已删除的设备分离关联的线路。 如前所述,“动态”线路的生存期未绑定到 FDO 的生存期。
仅当驱动程序处理其 FDO 设备的 WDF PrepareHardware/ReleaseHardware 回调时,才能删除“静态”AcxCircuit。 “静态”线路的生存期绑定到 FDO 的生存期。
驱动程序可以在其 WDF PrepareHardware/ReleaseHardware 回调中删除 AcxFactoryCircuit(线路提供程序)。 删除 AcxFactoryCircuit 会影响删除其所有关联的“动态”AcxCircuit。 ACX 管理器指示线路工厂删除特定线路时,或者 ACX 管理器关闭其 AcxFactoryCircuit 句柄时,也可以删除 AcxCircuit,在此方案中 ACX 会关闭与该句柄关联的所有线路。
ACX_CIRCUIT_PNPPOWER_CALLBACKS 结构描述了 ACX 驱动程序可以使用的以下回调。
EvtAcxCircuitPowerDown:在进入 Sx/Dx/Stop/Remove/SurpriseRemoval 之前,以及在驱动程序删除线路时,ACX 会调用此回调。 此调用由 ACX 序列化。 设备处于 D0 中,但请记住,随时可能会意外删除设备(这意味着关联的硬件已消失)。
EvtAcxCircuitReleaseHardware:ACX 会在 WDF 提供其 WDF 释放硬件回调之前调用此回调。 这将让驱动程序有机会在线路仍处理活动状态时执行任何清理。 此调用由 ACX 序列化。 调用此调用时,设备不在 D0 中。
EvtWdfObjectContextCleanup:WDF 会在删除 WDF/ACX 对象时调用此回调。 此调用与删除 WDF 对象调用同步。 调用此调用时,设备可能不在 D0 中。 回调正在被动级别运行。
EvtWdfObjectContextDestory:WDF 会在此对象上最后一个引用消失后调用此回调。 此调用与删除 WDF 对象调用异步。 调用此调用时,设备可能不在 D0 中。 仅当对象上的最后一个引用消失后,才会调用此回调。 回调正在 <= DPC 级别运行。 确切的 IRQL 取决于释放最后一个引用的线程的 IRQL。
ACX 设备空闲管理
ACX 利用 WDF 空闲管理基础结构。 ACX 驱动程序使用以下 WDF DDI 来启用空闲管理:
WdfDeviceAssignS0IdleSettings:此调用指定空闲超时和空闲管理的类型。 ACX 驱动程序可以自由为其设备使用适当的设置。
WdfDeviceStopIdle:此调用可防止设备进入空闲状态。 请注意,其调用不会阻止 Sx 请求。 也就是说,当系统进入较低功率状态时,设备独立于主动功率引用的数量而进入 Dx。
WdfDeviceResumeIdle:此调用允许设备重启其空闲超时。
在多栈/线路方案中,不同的堆栈可能具有不同的空闲超时。 这是因为每个堆栈的功率设置/要求不同,因此适合不同的空闲超时。 有关多栈的一般信息,请参阅 ACX 多栈跨驱动程序通信。
ACX 驱动程序和电源托管队列
WDF 支持电源托管 I/O 队列。 这种类型的队列与 WDF 电源管理完全集成。 WDF 会在电源开启/电源关闭 WDF 序列的各个步骤中调用队列的回调。 有关详细信息,请参阅使用电源托管 I/O 队列。
仅当驱动程序不使用具有多状态 (Fx) 功能的单组件/多组件时,ACX 驱动程序才能使用这种类型的队列。
ACX 驱动程序和 D3Hot / D3Cold (D3) 状态
音频驱动程序根据 ACX_DX_EXIT_LATENCY 枚举中提供的信息了解何时进入 D3Hot 或 D3Cold。
typedef enum _ACX_DX_EXIT_LATENCY {
AcxDxExitLatencyInstant = 0,
AcxDxExitLatencyFast,
AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;
AcxDxExitLatencyFast 对应于 D3Hot(DSP 打开),而 AcxDxExitLatencyResponsive 对应于 D3Cold(DSP 关闭)。
音频驱动程序可以调用 AcxDeviceGetCurrentDxExitLatency 函数来获取 ACX_DX_EXIT_LATENCY 值。
WDF 通过 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 的 ExcludeD3Cold 字段了解驱动程序的 D3Cold 功能。 驱动程序将此结构作为输入传递给 WdfDeviceAssignS0IdleSettings。
WDF 驱动程序可以多次调用 WdfDeviceAssignS0IdleSettings,根据系统环境(即响应 ACX)打开或关闭 D3Cold。 有关详细信息,请参阅 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构。
电源管理框架 (PoFx) 和驱动程序管理的空闲超时
组件级电源管理
请注意,WDF 不直接支持 Fx 设备/组件状态。 若要使用这些状态,驱动程序必须使用驱动程序管理的空闲超时。 有关使用 Fx 设备组件状态和驱动程序管理的空闲超时的详细信息,请参阅以下主题。
电源管理框架 (PoFx)
Windows 提供运行时电源管理框架 (PoFx),增加了对组件级别电源管理的支持。 组件(或子设备)是设备中的一个功能硬件单元,可独立于同一设备中的其他组件打开或切换到低功率状态。 有关详细信息,请参阅电源管理框架概述。