Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Un réveil surprise est une transition inattendue vers D0. Une fois qu'un appareil entre dans l’état D3cold, il peut se réveiller de manière inattendue par conséquence secondaire lorsque le pilote d'un autre appareil sur le même rail d'alimentation demande une transition de D3cold à D0. Le pilote du premier appareil doit recevoir la notification du réveil surprise pour empêcher l’appareil de rester dans un état D0 non initialisé.
Lorsqu’un appareil passe de D3hot à D3cold, il le fait probablement parce que la source d’alimentation qu’il partage avec un certain nombre d’autres appareils a été désactivée. Un certain temps après que ces appareils entrent dans D3cold, le pilote de l’un des appareils peut demander une transition vers D0. En réponse à cette demande, le pilote de bus parent ou le pilote de filtre ACPI active la source d’alimentation, et tous les appareils qui partagent la source d’alimentation entrent leurs états matériels par défaut.
Le seul pilote de périphérique qui s’attend à ce changement d’état d’alimentation est le pilote qui a demandé la modification. Les pilotes des autres appareils doivent recevoir une notification de cette modification afin qu’ils puissent initialiser correctement leurs appareils pour fonctionner dans D0. Seul un pilote pouvant recevoir cette notification doit permettre à son appareil d’entrer D3cold. Sinon, le pilote ne sait pas quand l’appareil entre dans D0.
Lorsqu’un appareil est activé, il entre dans un état matériel non initialisé par défaut. Par exemple, la spécification PCI Express Base 3.0 définit un état D0 non initialisé qu’un appareil entre lors de sa première réception de l’alimentation. La définition de cet état est spécifique aux appareils PCI et PCI Express, mais les appareils qui se connectent à d’autres bus sont conçus pour entrer dans des états matériels similaires lorsqu’ils sont activés.
Dans le cas d’un appareil PCI ou PCI Express qui implémente plusieurs fonctions, ces fonctions d’appareil partagent probablement le même rail d’alimentation. Toutefois, chaque fonction peut avoir un pilote distinct et les pilotes pour ces fonctions sont peu susceptibles de communiquer directement entre elles. Lorsque le pilote de l’une de ces fonctions demande un changement d’état d’alimentation de D3cold à D0, les pilotes des autres fonctions ne s’attendent pas à ce changement. Lorsque ces autres fonctions reçoivent de l’énergie, leurs pilotes doivent être avertis afin qu’ils puissent configurer les fonctions pour fonctionner correctement dans D0.
Un pilote de bus détecte quand l’alimentation d’un appareil enfant est activée. Si le pilote de fonction de cet appareil n’a pas demandé de transition vers D0, le pilote de bus invite le pilote de périphérique à s’envoyer un IRP d’alimentation D0 (une demande IRP_MN_SET_POWER avec l’état cible = PowerDeviceD0) pour initialiser l’appareil à fonctionner en D0. À partir de cet état D0 initialisé, le pilote de périphérique peut ensuite lancer la transition de l’appareil vers D3hot. Les pilotes de périphérique peuvent recevoir des notifications de transitions surprises vers D0 à partir de pilotes de bus de la manière suivante :
- Les pilotes de périphérique qui s’inscrivent directement ou indirectement en tant que clients de l’infrastructure de gestion de l’alimentation au moment de l’exécution (PoFx) reçoivent des rappels de notification.
- Les pilotes des appareils qui configurent leurs dispositifs pour le réveil ont leurs demandes IRP_MN_WAIT_WAKE en attente traitées par les pilotes de bus.
À compter de Windows 8, le pilote de fonction d’un appareil, agissant comme propriétaire de la stratégie d’alimentation, peut s’inscrire en tant que client de PoFx. Lorsque le pilote de bus avertit PoFx que l’appareil a connu une transition surprise vers D0, PoFx aide l’appareil à passer à un état D0 initialisé, puis à D3hot. Tout d’abord, PoFx appelle la routine DevicePowerRequiredCallback du pilote pour inviter le pilote de périphérique à envoyer un IRP d’alimentation D0 vers le bas de la pile d’appareils. Ensuite, PoFx appelle la routine DevicePowerNotRequiredCallback du pilote pour informer le pilote de périphérique que l’appareil n’est pas requis pour rester dans l’état D0.
À compter de Kernel-Mode Driver Framework (KMDF) version 1.11, le pilote KMDF pour un appareil à composant unique peut s’inscrire indirectement auprès de PoFx en appelant la méthode WdfDeviceWdmAssignPowerFrameworkSettings . Dans cet appel, le pilote fournit des pointeurs vers des fonctions de rappel qui informent le pilote des transitions inattendues vers D0. Pour plus d’informations, consultez Prise en charge des états fonctionnels.
Un pilote qui n’enregistre pas son appareil auprès de PoFx peut toujours être averti d’une transition inattendue vers D0 si l’appareil est prêt pour le réveil. Lorsque les pilotes de bus activent l’alimentation sur l’appareil, ils terminent la demande de IRP_MN_WAIT_WAKE du pilote. En réponse, le pilote initialise son appareil pour fonctionner en D0. L’appareil est susceptible d’être inactif, auquel cas le pilote, après un certain temps, déplacera cet appareil vers D3hot.
Un pilote fonctionnel qui ne s’inscrit pas auprès de PoFx et qui n’arme pas son appareil pour le réveil ne reçoit aucune notification d’une transition étonnante de D3cold à D0. L’appareil peut passer de grandes quantités de temps dans un état D0 non initialisé. Dans cet état, tous les composants de l’appareil sont généralement activés. Pour réduire la consommation d’alimentation par les appareils inactifs, les pilotes doivent activer l’entrée à D3cold uniquement s’ils peuvent recevoir des notifications de transitions surprises vers D0.