Partager via


Prise en charge des Power-Down inactifs sur les appareils Multiple-Component

[S’applique uniquement à KMDF]

Un pilote KMDF pour un appareil à plusieurs composants peut prendre en charge les états d’alimentation inactifs et fonctionnels. Étant donné que dans ce cas, le pilote s’inscrit directement auprès de l’infrastructure de gestion de l’alimentation (PoFx), le pilote doit coordonner les changements d’état Dx résultants avec PoFx.

Fourniture des paramètres d’inactivité de la stratégie d’alimentation des appareils

Lorsqu’il appelle WdfDeviceAssignS0IdleSettings, le pilote doit définir IdleTimeoutType sur DriverManagedIdleTimeout dans la structure WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . En outre, le pilote doit définir PowerUpIdleDeviceOnSystemWake sur WdfTrue et IdleCaps sur IdleCannotWakeFromS0, comme illustré dans l’exemple suivant.

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS s0IdleSettings;

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&s0IdleSettings, 
                                           IdleCannotWakeFromS0);
s0IdleSettings.IdleTimeoutType = DriverManagedIdleTimeout;
s0IdleSettings.PowerUpIdleDeviceOnSystemWake = WdfTrue;
s0IdleSettings.IdleTimeout = 1;
status = WdfDeviceAssignS0IdleSettings(device, &s0IdleSettings);

Transition de l’état Working (D0) à Low-Power (Dx)

Dans EvtDeviceSelfManagedIoInit, le pilote appelle WdfDeviceStopIdle pour prendre une référence d’alimentation, ce qui empêche WDF de placer l’appareil dans un état de faible consommation.

Le pilote libère la référence d’alimentation en appelant WdfDeviceResumeIdle à partir de sa routine de rappel DevicePowerRequiredCallback .

Le pilote spécifie généralement un délai d’inactivité très court afin que WDF place l’appareil dans un état de faible consommation peu de temps après la libération de toutes les références d’alimentation.

Transition de Low-Power (Dx) à l’état de travail (D0)

Dans DevicePowerRequiredCallback, le pilote doit amener l’appareil à son état de fonctionnement (D0). Pour ce faire, il doit reporter à un thread de travail un appel à WdfDeviceStopIdle avec le paramètre WaitForD0 défini sur TRUE. Cet appel bloquant à WdfDeviceStopIdlene doit pas être effectué à partir de DevicePowerRequiredCallback.

Au lieu de cela, le pilote doit différer l’appel bloquant à un thread worker qui s’exécute au niveau passif et est garanti de ne pas effectuer l’appel WdfDeviceStopIdle dans le contexte de la routine de répartition des E/S d’une file d’attente gérée par l’alimentation.

Si le pilote a précédemment appelé WdfDeviceInitSetPowerPageable (ce qui signifie qu’il peut accéder aux données paginables pendant les transitions d’alimentation), le pilote peut appeler WdfWorkItemCreate pour créer un élément de travail d’infrastructure. Si le pilote n’a pas défini power-pagable, le pilote doit créer son propre thread système. Pour plus d’informations, consultez PsCreateSystemThread.

Une fois WdfDeviceStopIdle retourné, même si la méthode retourne une erreur, le pilote doit appeler PoFxReportDevicePoweredOn.