Compartir a través de


Uso de rutinas de Power Manager para la detección de inactividad

El administrador de energía proporciona compatibilidad con la detección inactiva a través de las rutinas PoRegisterDeviceForIdleDetection y PoSetDeviceBusy .

Para habilitar la detección de inactividad para su dispositivo, un propietario de la directiva de energía del dispositivo llama a PoRegisterDeviceForIdleDetection y especifica:

  • Valor de tiempo de espera de inactividad que se va a aplicar cuando el sistema optimiza el rendimiento.

  • Valor de tiempo de espera de inactividad que se va a aplicar cuando el sistema optimiza la conservación.

  • Estado de alimentación del dispositivo al que el dispositivo debe realizar la transición cuando está inactivo.

PoRegisterDeviceForIdleDetection devuelve un puntero a un contador inactivo, que el controlador usa más adelante para deshabilitar la detección de inactividad. Los autores de llamadas de PoRegisterDeviceForIdleDetection deben ejecutarse en irQL < DISPATCH_LEVEL.

Un controlador puede registrar su dispositivo para la detección de inactividad en cualquier momento después de que se haya iniciado el dispositivo y esté listo para controlar los IRP de alimentación del dispositivo. Por ejemplo, un controlador podría habilitar la detección de inactividad como parte de su rutina de IoCompletion para un IRP de inicio de PnP.

Los valores de tiempo de espera de cualquier dispositivo determinado deben ser proporcionales a la latencia de encendido del dispositivo y en función del comportamiento observado del dispositivo. En el caso de los dispositivos de determinados tipos, un controlador puede especificar valores de tiempo de espera de conservación y rendimiento de -1 para usar los tiempos de espera de la directiva de energía estándar para la clase de dispositivo. Consulte la documentación específica del dispositivo para obtener más información.

Cuando el dispositivo está en uso, el controlador debe llamar a PoSetDeviceBusy, pasando el puntero devuelto por PoRegisterDeviceForIdleDetection. PoSetDeviceBusy restablece el contador inactivo, reiniciando así la cuenta atrás inactiva del dispositivo. El controlador debe llamar a PoSetDeviceBusy en cada operación de E/S.

Para determinar si el dispositivo está inactivo, el administrador de energía compara el valor del contador inactivo con el valor de tiempo de espera de inactividad especificado por el controlador para la directiva de energía del sistema actual (conservación o rendimiento). Consulte el Microsoft Windows SDK para conocer las funciones relativas a la directiva de energía del sistema.

Cuando el dispositivo satisface el valor de tiempo de espera, el administrador de energía envía un IRP de alimentación del conjunto de dispositivos, especificando el estado de alimentación del dispositivo que el controlador pasó en su llamada a PoRegisterDeviceForIdleDetection. El administrador de energía no envía una consulta IRP antes de enviar el IRP de set-power. Los controladores de la pila controlan el IRP de set-power como lo harían con cualquier otro; deben completarlo de forma oportuna y no pueden fallar. (Consulte Control del dispositivo Power-Down IRP).

Cuando el controlador ya no requiere detección de inactividad o no está preparado para controlar los IRP de apagado del dispositivo, debe llamar a PoRegisterDeviceForIdleDetection de nuevo, pasando cero para ambos valores de tiempo de espera. Establecer los tiempos de espera en cero deshabilita la detección de inactividad para las directivas de energía de conservación (batería) y rendimiento (CA). El controlador puede volver a habilitar rápidamente la detección de inactividad; simplemente llama a PoRegisterDeviceForIdleDetection con valores de tiempo de espera distintos de cero. Una vez que el controlador ha registrado el dispositivo, puede habilitar y deshabilitar la detección de inactividad cambiando los valores de tiempo de espera, incluso si el dispositivo se ha apagado y vuelto a activar.