Utilisation des routines Power Manager pour la détection d’inactivité
Le gestionnaire d’alimentation prend en charge la détection d’inactivité via les routines PoRegisterDeviceForIdleDetection et PoSetDeviceBusy .
Pour activer la détection d’inactivité pour son appareil, le propriétaire d’une stratégie d’alimentation de l’appareil appelle PoRegisterDeviceForIdleDetection et spécifie :
Valeur de délai d’inactivité à appliquer lorsque le système optimise les performances.
Valeur de délai d’inactivité à appliquer lorsque le système optimise la conservation.
État d’alimentation de l’appareil vers lequel l’appareil doit passer en cas d’inactivité.
PoRegisterDeviceForIdleDetection retourne un pointeur vers un compteur inactif, que le pilote utilisera ultérieurement pour désactiver la détection d’inactivité. Les appelants de PoRegisterDeviceForIdleDetection doivent être en cours d’exécution au DISPATCH_LEVEL IRQL < .
Un pilote peut inscrire son appareil pour la détection d’inactivité à tout moment après le démarrage de l’appareil et qu’il est prêt à gérer les irps d’alimentation de l’appareil. Par exemple, un pilote peut activer la détection d’inactivité dans le cadre de sa routine IoCompletion pour un IRP de périphérique de démarrage PnP.
Les valeurs de délai d’attente d’un appareil donné doivent être proportionnelles à la latence de mise sous tension de l’appareil et basées sur le comportement observé de l’appareil. Pour les appareils de certains types, un pilote peut spécifier des valeurs de délai d’attente de conservation et de performances de -1 pour utiliser les délais d’expiration de la stratégie d’alimentation standard pour la classe d’appareil. Pour plus d’informations, consultez la documentation spécifique à l’appareil.
Lorsque l’appareil est en cours d’utilisation, le pilote doit appeler PoSetDeviceBusy, en passant le pointeur retourné par PoRegisterDeviceForIdleDetection. PoSetDeviceBusy réinitialise le compteur inactif, redémarrant ainsi le compte à rebours inactif de l’appareil. Le pilote doit appeler PoSetDeviceBusy à chaque opération d’E/S.
Pour déterminer si l’appareil est inactif, le gestionnaire d’alimentation compare la valeur du compteur d’inactivité à la valeur du délai d’inactivité spécifié par le pilote pour la stratégie d’alimentation système actuelle (conservation ou performances). Consultez les Microsoft Windows SDK pour les fonctions relatives à la stratégie d’alimentation du système.
Lorsque l’appareil satisfait à la valeur de délai d’attente, le gestionnaire d’alimentation envoie un IRP défini sur l’alimentation du périphérique, en spécifiant l’état d’alimentation du périphérique que le pilote a passé dans son appel à PoRegisterDeviceForIdleDetection. Le gestionnaire d’alimentation n’envoie pas d’IRP de requête avant d’envoyer l’IRP set-power. Les pilotes de la pile gèrent l’IRP de puissance définie comme ils le feraient pour n’importe quel autre. ils doivent le compléter en temps opportun et ils ne peuvent pas l’échouer. (Consultez Gestion des Power-Down IRP des appareils.)
Lorsque le pilote ne nécessite plus de détection d’inactivité ou n’est pas prêt à gérer les irps de mise hors tension de l’appareil, il doit appeler à nouveau PoRegisterDeviceForIdleDetection , en passant zéro pour les deux valeurs de délai d’attente. Le fait de définir les délais d’attente sur zéro désactive la détection d’inactivité pour les stratégies d’alimentation de conservation (batterie) et de performances (CA). Le pilote peut rapidement réactiver la détection d’inactivité ; il appelle simplement PoRegisterDeviceForIdleDetection avec des valeurs de délai d’attente différentes de zéro. Une fois que le pilote a inscrit l’appareil, il peut activer et désactiver la détection d’inactivité en modifiant les valeurs de délai d’attente, même si l’appareil a été mis hors tension et réactivé.