Administración de energía de ACX
En este tema se describe la administración de energía de ACX. Para obtener información sobre la enumeración de dispositivos ACX, el inicio y el apagado y el reequilibrio del dispositivo, consulte Enumeración de dispositivos ACX. Para obtener información general sobre ACX, consulte Introducción a las extensiones de clase de audio ACX.
ACX aprovecha el comportamiento de energía PnP de KMDF de WDF. Para obtener más información sobre las secuencias de administración de energía de KMDF, consulte Secuencias de devolución de llamada de administración de energía y PnP.
Se recomienda que los controladores de ACX implementen completamente la administración de energía de WDF, por ejemplo, mediante la implementación de la estructura WDF_PNPPOWER_EVENT_CALLBACKS. Para obtener más información, consulte Compatibilidad con PnP y administración de energía en el controlador.
Eliminación por sorpresa del dispositivo ACX
El marco WDF puede llamar a EvtDeviceSurpriseRemoval en cualquier momento, es decir, esta devolución de llamada no se serializa con la secuencia de apagado. El controlador WDF no debe realizar ninguna acción al recibir esta devolución de llamada, excepto para tomar nota de que el dispositivo se quitó por sorpresa.
La secuencia de devolución de llamada de eliminación por sorpresa de apagado es idéntica a los casos de apagado Dx y eliminación, WDF no invoca las siguientes devoluciones de llamada en la ruta de eliminación por sorpresa:
- EvtDeviceArmWakeFrom*, como EvtDeviceArmWakeFromS0
- EvtIoStop (purgar colas administradas por energía) EvtWdfIoQueueIoStop
- EvtDeviceSelfManagedIoFlush (vaciar búferes de E/S)
Para obtener más información, consulte Secuencias de devolución de llamada de PnP y administración de energía y Uso de colas de E/S administradas por energía.
Encendido e inicio del circuito ACX
Se puede agregar un AcxCircuit "dinámico" en cualquier momento. El controlador crea un nuevo dispositivo PDO secundario y asocia el nuevo AcxCircuit al controlar la devolución de llamada de WDF PrepareHardware para este dispositivo PDO. La duración de un circuito "dinámico" no está enlazada a la duración del FDO.
Solo se puede agregar un AcxCircuit "estático" cuando el controlador controla la devolución de llamada de WDF PrepareHardware para su dispositivo FDO. La duración de un circuito "estático" no enlazada a la duración del FDO.
Un controlador ACX también puede crear objetos AcxFactoryCircuit (proveedores de circuitos) durante la secuencia de encendido mediante la función AcxFactoryCircuitCreate. Un objeto AcxFactoryCircuit usa la creación de circuitos dinámicos para agregar ACXCIRCUITS cuando ACX lo solicite. Esta característica es muy útil al compilar puntos de conexión compuestos, es decir, un punto de conexión de audio formado por dos o más ACXCIRCUIT vinculados.
El circuito ACX define las siguientes devoluciones de llamada que se invocan durante la inicialización del punto de conexión de audio o AcxCircuit:
EvtAcxCircuitPrepareHardware: ACX invoca esta devolución de llamada justo después de que WDF entregue su devolución de llamada de preparación de hardware de WDF. Permite que el controlador realice cualquier "preparación de hardware" específica del circuito. ACX serializa esta llamada. El dispositivo no está en D0 cuando se invoca esta llamada.
EvtAcxCircuitPowerUp: ACX invoca esta devolución de llamada justo después de volver de Dx. ACX serializa esta llamada. El dispositivo está en D0.
Para los puntos de conexión compuestos, AcxCircuits puede registrarse opcionalmente para estas devoluciones de llamada:
EvtAcxCircuitCompositeCircuitInitialize, se invoca la primera vez que ACX detecta que este ACXCIRCUIT está visible, es decir, el dispositivo asociado se estableció en D0 e hizo que este circuito fuera visible para las entidades externas a su propia pila. Las interfaces de audio del circuito todavía están en estado OFF.
EvtAcxCircuitCompositeInitialize, se invoca cada vez que ACX finaliza la inicialización de un punto de conexión compuesto. Después de esta devolución de llamada, ACX activa las interfaces de audio de este circuito.
EvtAcxCircuitCompositeDeinitialize, se invoca cada vez que ACX desmonta un punto de conexión compuesto. Es posible que los controladores no reciban esta devolución de llamada si se ha quitado su propia pila o no pueden procesar la E/S.
Si está presente, las instancias de flujo se restauran a sus estados de apagado previo.
Apagado y eliminación del circuito ACX
Un AcxCircuit "dinámico" se puede quitar en cualquier momento invalidando y quitando el objeto de dispositivo asociado al circuito. El circuito asociado se puede quitar o desconectar del dispositivo eliminado cuando el controlador controla las devoluciones de llamada PrepareHardware/ReleaseHardware de WDF para este dispositivo PDO. Como se mencionó anteriormente, la duración de un circuito "dinámico" no está enlazada a la duración del FDO.
Un AcxCircuit "estático" solo se puede quitar cuando el controlador controla las devoluciones de llamada PrepareHardware/ReleaseHardware de WDF para su dispositivo FDO. La duración de un circuito "estático" no enlazada a la duración del FDO.
El controlador puede quitar un AcxFactoryCircuit (proveedor de circuitos) en sus devoluciones de llamada PrepareHardware/ReleaseHardware de WDF. Al eliminar un AcxFactoryCircuit se eliminan todos sus AcxCircuit "dinámicos" asociados. Los AcxCircuit también se pueden eliminar cuando el administrador de ACX indica a un generador de circuitos que quite un circuito específico, o cuando el administrador de ACX cierra sus controladores AcxFactoryCircuit: en este escenario, ACX cierra todos los circuitos asociados a ese identificador.
La estructura ACX_CIRCUIT_PNPPOWER_CALLBACKS describe las siguientes devoluciones de llamada que puede usar un controlador ACX.
EvtAcxCircuitPowerDown: ACX invoca esta devolución de llamada justo antes de entrar en Sx/Dx/Stop/Removal/SurpriseRemoval y cuando el controlador quita el circuito. ACX serializa esta llamada. El dispositivo está en D0, aunque tenga en cuenta que el dispositivo se podría quitar por sorpresa en cualquier momento (lo que significa que el hardware asociado ha desaparecido).
EvtAcxCircuitReleaseHardware: ACX invoca esta devolución de llamada justo antes de que WDF entregue su devolución de llamada de hardware de versión WDF. Permite que el conductor realice cualquier limpieza mientras el circuito sigue activo. ACX serializa esta llamada. El dispositivo no está en D0 cuando se invoca esta llamada.
EvtWdfObjectContextCleanup: WDF invoca esta devolución de llamada cuando se elimina el objeto WDF/ACX. Esta llamada es sincrónica con la eliminación de la llamada al objeto WDF. Es posible que el dispositivo no esté en D0 cuando se invoca esta llamada. La devolución de llamada se ejecuta en el nivel pasivo.
EvtWdfObjectContextDestory: WDF invoca esta devolución de llamada después de que la última referencia de este objeto desaparezca. Esta llamada es asincrónica con la eliminación de la llamada al objeto WDF. Es posible que el dispositivo no esté en D0 cuando se invoca esta llamada. Esta devolución de llamada solo se invoca después de que la última referencia del objeto desaparezca. La devolución de llamada se ejecuta en el nivel <= DPC. El IRQL exacto depende del IRQL del subproceso que libera la última referencia.
Administración de inactividad de dispositivos ACX
ACX aprovecha la infraestructura de administración de inactividad de WDF. Los controladores ACX usan las siguientes DDI de WDF para habilitar la administración de inactividad:
WdfDeviceAssignS0IdleSettings: esta llamada especifica el tipo de administración de inactividad y tiempo de espera de inactividad. El controlador ACX puede usar la configuración adecuada para su dispositivo.
WdfDeviceStopIdle: esta llamada evita que el dispositivo quede inactivo. Tenga en cuenta que esta llamada no bloquea las solicitudes Sx. Es decir, el dispositivo entra en Dx independientemente del número de referencias de energía activa cuando el sistema se establece en un estado de energía inferior.
WdfDeviceResumeIdle: esta llamada permite al dispositivo reiniciar su tiempo de espera de inactividad.
En un escenario de varias pilas o circuitos, las distintas pilas pueden tener tiempos de espera de inactividad diferentes. Esto se debe a los diferentes ajustes/requisitos de energía de cada pila, por lo que son apropiados diferentes tiempos de espera de inactividad. Para obtener información general sobre multi-pila, consulte Comunicaciones entre controladores de varias pilas de ACX.
Controlador ACX y colas administradas por energía
WDF admite colas de E/S administradas por energía. Este tipo de cola está totalmente integrado con la administración de energía WDF. WDF invoca las devoluciones de llamada de la cola en varios pasos de la secuencia de WDF de encendido y apagado. Para obtener más información, consulte Uso de colas de E/S administradas por energía.
Los controladores ACX pueden usar este tipo de cola solo si el controlador no usa el componente de uno o varios componentes con la característica de varios estados (Fx).
Estados del controlador ACX y D3Hot / D3Cold (D3)
Los controladores de audio saben cuándo deben establecerse en D3Hot o D3Cold en función de la información disponible en la enumeración ACX_DX_EXIT_LATENCY.
typedef enum _ACX_DX_EXIT_LATENCY {
AcxDxExitLatencyInstant = 0,
AcxDxExitLatencyFast,
AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;
AcxDxExitLatencyFast corresponde a D3Hot (DSP activado) y AcxDxExitLatencyResponsive corresponde a D3Cold (DSP desactivado).
Los controladores de audio pueden obtener el valor de ACX_DX_EXIT_LATENCY llamando a la función AcxDeviceGetCurrentDxExitLatency.
WDF conoce las funcionalidades D3Cold del controlador a través del campo ExcludeD3Cold de WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. El controlador pasa esta estructura como entrada a WdfDeviceAssignS0IdleSettings.
Los controladores WDF pueden invocar WdfDeviceAssignS0IdleSettings varias veces para activar o desactivar D3Cold en función del entorno del sistema, es decir, en respuesta a ACX. Para obtener más información, consulte estructura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS.
Marco de administración de energía (PoFx) y tiempo de espera de inactividad administrado por controladores
Administración de energía de nivel de componente
Tenga en cuenta que WDF no admite directamente los estados del dispositivo o componente fx. Para usar estos estados, el controlador debe usar el tiempo de espera de inactividad administrado por el controlador. Para obtener más información sobre el uso de los estados de componentes del dispositivo Fx y el tiempo de espera de inactividad administrado por controladores, consulte los temas siguientes.
- Administración de energía de nivel de componente
- Compatibilidad con dispositivos de varios componentes con estado de energía funcional único o múltiple
Marco de administración de energía (PoFx)
Windows proporciona un marco de administración de energía en tiempo de ejecución (PoFx) que agrega compatibilidad con la administración de energía de nivel de componente. Un componente, o subdispositivo, es una unidad de hardware funcional en un dispositivo que se puede activar o cambiar a un estado de baja energía independientemente de los demás componentes del mismo dispositivo. Para obtener más información, consulte Información general sobre el marco de trabajo de gestión de potencia.
Consulte también
Enumeración de dispositivos de ACX
Documentación de referencia de la ACX
Información general sobre las extensiones de clase de audio de ACX
Uso de colas de E/S administradas por energía.
Secuencias de devolución de llamada de PnP y administración de energía