Démarrage rapide à partir d’un état Low-Power
Pour obtenir un démarrage rapide à partir d’un état de faible consommation, un pilote pour un périphérique à nœud feuille doit gérer un IRP d’alimentation S0 (autrement dit, un IRP IRP_MN_SET_POWER pour l’état d’alimentation du système S0). Les appareils qui sont des nœuds feuilles dans la hiérarchie des appareils n’ont pas d’appareils enfants. Étant donné qu’un appareil à nœud feuille n’a pas de dépendances sur les appareils enfants, le pilote fonctionnel de l’appareil peut réinitialiser l’appareil en tant que tâche en arrière-plan afin d’éviter de provoquer des retards inutiles au système d’exploitation ou à d’autres pilotes. En revanche, les pilotes de bus ont des dépendances qui nécessitent une logique de synchronisation supplémentaire pour coordonner les séquences d’alimentation avec leurs appareils enfants.
Utilisez les étapes suivantes pour obtenir un démarrage rapide d’un appareil à nœud feuille à partir d’un état de faible consommation :
Définissez une routine d’achèvement pour l’IRP d’alimentation S0.
Envoyez l’IRP d’alimentation S0 vers le bas de la pile de l’appareil.
Effectuez immédiatement l’IRP d’alimentation S0 au lieu d’attendre que l’IRP d’alimentation D0 soit terminée. Lorsque la routine d’achèvement de l’IRP de puissance S0 s’exécute, procédez comme suit :
Demandez un IRP d’alimentation D0 ( c’est-à-dire un IRP IRP_MN_SET_POWER pour l’état d’alimentation de l’appareil D0).
Retournez STATUS_SUCCESS à la routine d’achèvement de l’IRP d’alimentation S0.
Le pilote doit mettre en file d’attente toutes les demandes d’E/S qu’il reçoit, mais différer la gestion de l’une de ces demandes jusqu’à ce qu’il termine le traitement de l’IRP d’alimentation D0.
Lorsque la routine d’achèvement de l’IRP d’alimentation D0 s’exécute, initialisez l’appareil, mais limitez cette routine à ce qui est nécessaire pour rendre l’appareil prêt à être utilisé.
Une fois les étapes précédentes terminées, votre pilote peut commencer à gérer les demandes d’E/S, y compris toutes les demandes d’E/S qui peuvent déjà être mises en file d’attente.
Note Les étapes précédentes ne s’appliquent pas à la gestion des IRPs d’alimentation pour tout état d’alimentation autre que PowerSystemWorking (S0). Ces étapes s’appliquent spécifiquement à la gestion des IRP d’alimentation pour les transitions d’un état de faible puissance à l’état de mise sous tension (S0).
Un démarrage du système est terminé une fois que tous les appareils ont terminé leur irps d’alimentation S0. Ces appareils ne sont pas obligés, à la fin du démarrage du système, d’avoir terminé leurs IRP d’alimentation D0 ou de fonctionner pleinement. Le gestionnaire d’alimentation du noyau a un ensemble limité de files d’attente de répartition IRP et doit utiliser ces files d’attente pour notifier tous les appareils du système du retour à l’état S0. Les pilotes qui ne parviennent pas à terminer rapidement leurs IRP d’alimentation S0 empêchent les pilotes d’autres appareils de recevoir leurs IRPs d’alimentation S0. Par conséquent, les pilotes mal conçus nuisent aux performances globales du démarrage du système en provoquant des opérations de pilote qui doivent être effectuées simultanément en série.
Une fois qu’un pilote a terminé son IRP d’alimentation S0, il peut recevoir des demandes d’E/S d’applications qui ont ouvert des handles sur l’appareil. Les pilotes ne doivent jamais échouer à ces demandes d’E/S, car cela peut entraîner l’arrêt de la réponse des applications et la production de messages d’erreur d’expiration. Au lieu de cela, les pilotes doivent mettre en file d’attente les demandes d’E/S jusqu’à ce que l’appareil soit prêt à les traiter.
Un pilote de bus peut obtenir un démarrage rapide à partir d’un état de faible consommation en utilisant une technique similaire à celle qui vient d’être décrite pour le pilote d’un périphérique à nœud feuille. Un pilote de bus doit répondre à une exigence supplémentaire, qui consiste à s’assurer que toutes les demandes d’appareils enfants d’entrée à l’état D0 sont marquées comme étant en attente et ne sont pas terminées par le pilote de bus tant que le périphérique de bus n’est pas entré dans l’état D0.
Par exemple, lorsque le pilote de bus d’un hub USB reçoit un IRP d’alimentation S0, le pilote demande un IRP d’alimentation D0 et termine l’IRP d’alimentation S0 après avoir reçu l’IRP d’alimentation D0 demandé. Toutefois, une fois l’IRP d’alimentation S0 terminée, les appareils enfants du hub sont susceptibles de commencer à recevoir leurs IRP d’alimentation S0 et à demander des IRP d’alimentation D0. Le pilote de bus doit empêcher les appareils enfants d’entrer D0 jusqu’à ce que l’appareil hub entre D0. Par conséquent, le pilote de bus doit marquer tous les IRP d’alimentation D0 des appareils enfants comme étant en attente et attendre que le pilote de bus termine la gestion de l’IRP d’alimentation D0 pour le hub et que l’appareil hub soit entièrement initialisé.
Pour plus d’informations sur les IRPs d’alimentation, consultez les rubriques suivantes :
Gestion des IRP_MN_SET_POWER pour les états d’alimentation du système
Gestion des IRP_MN_SET_POWER pour les états d’alimentation des appareils