Compartir a través de


Sorpresa Wake-Up

Una reactivación sorpresa es una transición inesperada a D0. Una vez que un dispositivo entra en D3cold, podría experimentar una reactivación sorpresa como efecto secundario cuando el controlador para otro dispositivo en el mismo raíl de alimentación solicita una transición de D3cold a D0. El controlador del primer dispositivo debe recibir una notificación de la reactivación sorpresa para evitar que el dispositivo permanezca en un estado D0 sin inicializar.

Cuando un dispositivo pasa de D3hot a D3cold, probablemente lo hace porque la fuente de alimentación que comparte con algún número de otros dispositivos se desactivó. Algún tiempo después de que estos dispositivos escriban D3cold, el controlador de uno de los dispositivos podría solicitar una transición a D0. En respuesta a esta solicitud, el controlador de bus primario o el controlador de filtro ACPI activa la fuente de alimentación y todos los dispositivos que comparten la fuente de alimentación especifican sus estados de hardware de encendido predeterminados.

El único controlador de dispositivo que espera este cambio de estado de energía es el controlador que solicitó el cambio. Los controladores de los otros dispositivos deben recibir la notificación de este cambio para que puedan inicializar correctamente sus dispositivos para que funcionen en D0. Solo un controlador que pueda recibir esta notificación debe permitir que su dispositivo escriba D3cold. De lo contrario, el controlador no sabrá cuándo entra el dispositivo en D0.

Cuando un dispositivo está activado, entra en un estado de hardware predeterminado sin inicializar. Por ejemplo, la especificación PCI Express Base 3.0 define un estado D0 sin inicializar que un dispositivo entra cuando recibe energía por primera vez. La definición de este estado es específica de los dispositivos PCI y PCI Express, pero los dispositivos que se conectan a otros buses están diseñados para entrar en estados de hardware similares cuando están activados.

En el caso de un dispositivo PCI o PCI Express que implementa varias funciones, es probable que estas funciones de dispositivo compartan la misma guía de alimentación. Sin embargo, es probable que cada función tenga un controlador independiente y los controladores de estas funciones no se comuniquen directamente entre sí. Cuando el controlador de una de estas funciones solicita un cambio de estado de energía de D3cold a D0, los controladores de las otras funciones no esperan este cambio. Cuando estas otras funciones reciben energía, sus controladores deben recibir notificaciones para que puedan configurar las funciones para que funcionen correctamente en D0.

Un controlador de bus detecta cuándo se activa la alimentación en un dispositivo secundario. Si el controlador de función de este dispositivo no solicitó una transición a D0, el controlador de bus solicita al controlador de dispositivo que se envíe a sí mismo un IRP de alimentación D0 (una solicitud de IRP_MN_SET_POWER con estado de destino = PowerDeviceD0) para inicializar el dispositivo para que funcione en D0. A partir de este estado D0 inicializado, el controlador del dispositivo puede iniciar la transición del dispositivo a D3hot. Los controladores de dispositivos pueden recibir notificaciones de transiciones sorpresas a D0 desde los controladores de autobús de las siguientes maneras:

A partir de Windows 8, el controlador de funciones de un dispositivo, que actúa como propietario de la directiva de energía, puede registrarse como cliente de PoFx. Cuando el controlador de autobús notifica a PoFx que el dispositivo experimentó una transición sorpresa a D0, PoFx ayuda al dispositivo a pasar a un estado D0 inicializado y, a continuación, a D3hot. En primer lugar, PoFx llama a la rutina DevicePowerRequiredCallback del controlador para pedir al controlador de dispositivo que envíe un IRP de alimentación D0 a la pila del dispositivo. A continuación, PoFx llama a la rutina DevicePowerNotRequiredCallback del controlador para notificar al controlador del dispositivo que el dispositivo no tiene que permanecer en el estado D0.

A partir de Kernel-Mode Driver Framework (KMDF) versión 1.11, el controlador KMDF para un dispositivo de un solo componente puede registrarse indirectamente con PoFx llamando al método WdfDeviceWdmAssignPowerFrameworkSettings . En esta llamada, el controlador proporciona punteros a rutinas de devolución de llamada que notifican al controlador las transiciones sorpresa a D0. Para obtener más información, consulte Compatibilidad con estados de energía funcional.

Un controlador que no registra su dispositivo con PoFx todavía puede recibir una notificación de una transición sorpresa a D0 si el dispositivo está armado para reactivación. Cuando los controladores de autobús encienden la alimentación en el dispositivo, completan la solicitud de IRP_MN_WAIT_WAKE del controlador. En respuesta, el controlador inicializa su dispositivo para funcionar en D0. Es probable que el dispositivo esté inactivo, en cuyo caso el controlador, después de algún tiempo, moverá este dispositivo a D3hot.

Un controlador de función que no se registra con PoFx y que no arma su dispositivo para reactivación no recibe ninguna notificación de una transición sorpresa de D3cold a D0. El dispositivo puede dedicar grandes cantidades de tiempo en un estado D0 sin inicializar. En este estado, todos los componentes del dispositivo normalmente están activados. Para reducir el consumo de energía por parte de los dispositivos inactivos, los controladores deben habilitar la entrada a D3cold solo si pueden recibir notificaciones de transiciones inesperadas a D0.