Partager via


Prise en charge des appareils Single-Component avec un ou plusieurs états d’alimentation fonctionnels

Un pilote KMDF pour un appareil à composant unique peut définir un ou plusieurs états d’alimentation fonctionnels pour le composant et inscrire les fonctions de rappel que l’infrastructure de gestion de l’alimentation (PoFx) appelle lorsque l’état Fx du composant change ou que sa condition active/inactive change. À compter d’UMDF version 2.0, un pilote UMDF pour un appareil à composant unique peut définir un seul état d’alimentation fonctionnel (F0).

Pour plus d’informations sur PoFx, consultez Vue d’ensemble de l’infrastructure de gestion de l’alimentation.

Pour implémenter la prise en charge de l’état Fx pour un appareil à composant unique, vous devez effectuer les opérations suivantes dans l’ordre avant ou pendant le premier démarrage d’un appareil.

  1. Cette étape concerne uniquement les pilotes KMDF. Appelez WdfDeviceWdmAssignPowerFrameworkSettings pour spécifier les paramètres d’infrastructure d’alimentation que WDF utilise lors de l’inscription auprès de PoFx. Dans la structure WDF_POWER_FRAMEWORK_SETTINGS que le pilote fournit lorsqu’il appelle WdfDeviceWdmAssignPowerFrameworkSettings, le pilote peut fournir des pointeurs vers plusieurs fonctions de rappel. Si le pilote ne prend en charge qu’un seul état d’alimentation fonctionnel (F0), cette étape est facultative.

  2. Cette étape s’applique aux pilotes KMDF et aux pilotes UMDF. Appelez WdfDeviceAssignS0IdleSettings et définissez le champ IdleTimeoutType de la structure WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS sur SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint. Cela entraîne l’inscription de WDF auprès de PoFx.

    Pour les pilotes KMDF, lors de l’inscription auprès de PoFx, le framework utilise les informations fournies dans WDF_POWER_FRAMEWORK_SETTINGS lorsqu’il a appelé WdfDeviceWdmAssignPowerFrameworkSettings.

Étant donné qu’un appareil peut démarrer plusieurs fois, par exemple en cas de rééquilibrage des ressources, un pilote peut effectuer les étapes précédentes dans la fonction de rappel EvtDeviceSelfManagedIoInit . Si le pilote a inscrit une fonction de rappel EvtDeviceSelfManagedIoInit , l’infrastructure l’appelle une fois pour chaque appareil, une fois que l’infrastructure a appelé la fonction de rappel EvtDeviceD0Entry du pilote pour la première fois.

Le reste des informations contenues dans cette rubrique s’applique uniquement aux pilotes KMDF.

Mise sous tension

Lorsque le pilote appelle WdfDeviceWdmAssignPowerFrameworkSettings, il peut fournir un pointeur vers une fonction de rappel EvtDeviceWdmPostPoFxRegisterDevice .

L’infrastructure appelle la fonction de rappel EvtDeviceWdmPostPoFxRegisterDevice du pilote après l’inscription de l’infrastructure auprès de PoFx. Voici un exemple de séquence de mise sous tension classique :

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. EvtDeviceWdmPostPoFxRegisterDevice // Le handle PoFx est disponible

Le pilote fournit le rappel EvtDeviceWdmPostPoFxRegisterDevice s’il doit effectuer des opérations supplémentaires à l’aide du POHANDLE pour l’inscription de Power Framework. Par exemple, il peut spécifier des exigences de latence, de résidence et de veille. Pour plus d’informations sur les routines qui utilisent POHANDLE, consultez Routines de gestion de l’alimentation des appareils.

Votre pilote peut également utiliser POHANDLE pour échanger des demandes de contrôle d’alimentation avec PoFx :

Mise hors tension

WDF appelle la fonction de rappel EvtDeviceWdmPrePoFxUnregisterDevice avant de supprimer une inscription spécifiée auprès de PoFx.

Le pilote peut fournir un pointeur vers une routine ComponentIdleStateCallback dans la structure WDF_POWER_FRAMEWORK_SETTINGS qu’il fournit à WdfDeviceWdmAssignPowerFrameworkSettings. PoFx appelle cette routine pour informer le pilote d’une modification en attente de l’état d’alimentation Fx du composant spécifié. Dans cette routine de rappel, le pilote peut effectuer des opérations spécifiques au matériel liées au changement d’état fonctionnel.

Par exemple, avant de passer d’un composant à un état Fx de faible consommation, un pilote peut enregistrer l’état du matériel et désactiver les interruptions et DMA. Le pilote appelle WdfInterruptReportInactive pour informer le système que l’interruption n’est plus active. La désactivation des interruptions pendant les transitions d’état F peut réduire la consommation d’énergie globale du système.

Le pilote peut également fournir un pointeur vers une routine ComponentIdleConditionCallback dans sa structure WDF_POWER_FRAMEWORK_SETTINGS . PoFx appelle cette routine pour informer le pilote qu’un composant est devenu inactif. Dans cette routine, le pilote commence le processus d’arrêt de ses files d’attente gérées par l’alimentation et de ses opérations d’E/S auto-managées :

  1. Appelez WdfIoQueueStop une fois pour chacune des files d’attente gérées par l’alimentation de l’appareil. Dans chaque appel à WdfIoQueueStop, fournissez un rappel EvtIoQueueState . En règle générale, le pilote appelle WdfIoQueueStop à partir de ComponentIdleConditionCallback.

  2. Assurez-vous que les demandes envoyées au pilote à partir de chacune des files d’attente gérées par l’alimentation sont effectuées rapidement. Selon le pilote, cela peut impliquer tout ou partie des éléments suivants :

    • Si le pilote ne conserve pas les demandes pendant une période prolongée et ne les transfère pas à une cible d’E/S qui le fait, passez à l’étape 3.
    • Si le pilote conserve certaines demandes pendant une période prolongée, renvoyez ces demandes dans une file d’attente manuelle. Dans sa routine ComponentActiveConditionCallback , le pilote peut ensuite récupérer les requêtes.
    • Si le pilote transfère certaines demandes à une cible d’E/S qui les conserve pendant une période prolongée, annulez ces demandes. Renvoyez les requêtes dans ComponentActiveConditionCallback.
  3. Lorsque chaque file d’attente a été arrêtée, le framework appelle EvtIoQueueState. Si le pilote arrête plusieurs files d’attente gérées par l’alimentation, le framework appelle EvtIoQueueState plusieurs fois, une fois pour chaque file d’attente.

    Le pilote doit appeler PoFxCompleteIdleCondition après l’appel de la dernière fonction EvtIoQueueState . Par exemple, le pilote peut effectuer cet appel à partir du dernier EvtIoQueueState.

    Pour déterminer le dernier appel, le pilote peut utiliser un compteur pour suivre le nombre de fois que l’infrastructure a appelé EvtIoQueueState. L’exemple Singlecomp illustre cette technique. Cet exemple est disponible à partir du Windows 8 WDK.

Voici un exemple de séquence de mise sous tension classique :

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

Redémarrez les files d’attente gérées par l’alimentation et les opérations d’E/S autogérées dans ComponentActiveConditionCallback.

Si le pilote a précédemment appelé WdfInterruptReportInactive, réactivez les interruptions inactives en appelant WdfInterruptReportActive à partir de ComponentActiveConditionCallback ou ComponentIdleStateCallback.