Supporto di Power-Down inattive nei dispositivi Multiple-Component
[Si applica solo a KMDF]
Un driver KMDF per un dispositivo a più componenti può supportare gli stati di alimentazione inattive e funzionali. Poiché in questo caso il driver registra direttamente con il framework di risparmio energia (PoFx), il driver deve coordinare le modifiche dello stato Dx risultanti con PoFx.
Fornire le impostazioni inattive di Power Policy del dispositivo
Quando chiama WdfDeviceAssignS0IdleSettings, il driver deve impostare IdleTimeoutType su DriverManagedIdleTimeout nella struttura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . Inoltre, il driver deve impostare PowerUpIdleDeviceOnSystemWake su WdfTrue e IdleCaps su IdleCannotWakeFromS0, come illustrato nell'esempio seguente.
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);
Transizione dallo stato di lavoro (D0) a Low-Power (Dx)
In EvtDeviceSelfManagedIoInit il driver chiama WdfDeviceStopIdle per prendere un riferimento di alimentazione, che impedisce a WDF di inserire il dispositivo in uno stato di bassa potenza.
Il driver rilascia il riferimento all'alimentazione chiamando WdfDeviceResumeIdle dalla routine di callback DevicePowerRequiredCallback .
Il driver specifica in genere un timeout di inattività molto breve in modo che WDF inserisce il dispositivo in uno stato di bassa potenza poco dopo che tutti i riferimenti di alimentazione vengono rilasciati.
Transizione da Low-Power (Dx) allo stato di lavoro (D0)
In DevicePowerRequiredCallback, il driver deve portare il dispositivo allo stato funzionante (D0). A tale scopo, deve rinviare a un thread di lavoro una chiamata a WdfDeviceStopIdle con il parametro WaitForD0 impostato su TRUE. Questa chiamata di blocco a WdfDeviceStopIdlenon deve essere effettuata dall'interno di DevicePowerRequiredCallback.
Il driver deve invece rinviare la chiamata di blocco a un thread di lavoro in esecuzione a livello passivo e non eseguire la chiamata WdfDeviceStopIdle nel contesto di una routine di invio I/O gestita da energia.
Se il driver ha precedentemente chiamato WdfDeviceInitSetPowerPageable (ovvero può accedere ai dati paginabili durante le transizioni di alimentazione), il driver può chiamare WdfWorkItemCreate per creare un elemento di lavoro del framework. Se il driver non ha impostato power pageable, il driver deve creare il proprio thread di sistema. Per altre informazioni, vedere PsCreateSystemThread.
Dopo che WdfDeviceStopIdle restituisce, anche se il metodo restituisce un errore, il driver deve chiamare PoFxReportDevicePoweredOn.