Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un driver KMDF per un dispositivo a componente singolo può definire uno o più stati di potenza funzionale per il componente e registrare le funzioni di callback che il framework di risparmio energia (PoFx) chiama quando lo stato fx del componente cambia o la relativa condizione attiva/inattiva cambia. A partire da UMDF versione 2.0, un driver UMDF per un dispositivo a singolo componente può definire un singolo stato di alimentazione funzionale (F0).
Per ulteriori informazioni su PoFx, vedere Panoramica del Power Management Framework.
Per implementare il supporto dello stato Fx per un dispositivo a componente singolo, è necessario eseguire le operazioni seguenti in ordine prima o durante la prima avvio di un dispositivo.
Questo passaggio è solo per i driver KMDF. Chiamare WdfDeviceWdmAssignPowerFrameworkSettings per specificare le impostazioni del framework di alimentazione usate da WDF durante la registrazione con PoFx. Nella struttura WDF_POWER_FRAMEWORK_SETTINGS fornita dal driver quando chiama WdfDeviceWdmAssignPowerFrameworkSettings, il driver può fornire puntatori a diverse funzioni di callback. Se il driver supporta solo un singolo stato di alimentazione funzionale (F0), questo passaggio è facoltativo.
Questo passaggio si applica ai driver KMDF e ai driver UMDF. Chiamare WdfDeviceAssignS0IdleSettings e impostare il campo IdleTimeoutType della struttura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS su SystemManagedIdleTimeout o SystemManagedIdleTimeoutWithHint. In questo modo, WDF viene registrato con PoFx.
Per i driver KMDF, al momento della registrazione con PoFx, il framework usa le informazioni fornite dal driver in WDF_POWER_FRAMEWORK_SETTINGS quando il driver chiama WdfDeviceWdmAssignPowerFrameworkSettings.
Poiché un dispositivo può avviarsi più volte, ad esempio in caso di ribilanciamento delle risorse, un driver potrebbe eseguire i passaggi precedenti all'interno della EvtDeviceSelfManagedIoInit funzione di callback. Se il driver ha registrato una funzione di callback EvtDeviceSelfManagedIoInit, il framework la chiama una volta per ogni dispositivo, dopo aver chiamato per la prima volta la funzione di callback EvtDeviceD0Entry del driver.
Il resto delle informazioni contenute in questo argomento si applica solo ai driver KMDF.
Accensione di potenza
Quando il driver chiama WdfDeviceWdmAssignPowerFrameworkSettings, può fornire un puntatore a una funzione di callback EvtDeviceWdmPostPoFxRegisterDevice.
Il framework chiama la funzione di callback del driver EvtDeviceWdmPostPoFxRegisterDevice dopo che il framework si è registrato presso PoFx. Di seguito è riportato un esempio di una tipica sequenza di alimentazione:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- L'handle PoFx è disponibile per EvtDeviceWdmPostPoFxRegisterDevice
Il driver fornisce il callback EvtDeviceWdmPostPoFxRegisterDevice se deve eseguire operazioni aggiuntive usando POHANDLE per la registrazione della struttura di alimentazione. Ad esempio, potrebbe specificare requisiti di latenza, permanenza e riattivazione. Per altre informazioni sulle routine che usano POHANDLE, vedere Routine di risparmio energia del dispositivo.
Il driver può anche usare POHANDLE per scambiare richieste di controllo alimentazione con PoFx:
- Per inviare una richiesta di controllo alimentazione a PoFx, il driver fornisce una funzione di callback EvtDeviceWdmPostPoFxRegisterDevice e quindi usa il POHANDLE risultante per chiamare PoFxPowerControl.
- Per eseguire operazioni di controllo dell'alimentazione richieste da PoFx, il driver fornisce una callback routine di PowerControlCallback nella struttura WDF_POWER_FRAMEWORK_SETTINGS.
Spegnimento
WDF chiama la funzione di callback EvtDeviceWdmPrePoFxUnregisterDeviceprima di eliminare una registrazione specificata con PoFx.
Il driver può fornire un puntatore a una routine ComponentIdleStateCallback nella struttura WDF_POWER_FRAMEWORK_SETTINGS che fornisce a WdfDeviceWdmAssignPowerFrameworkSettings. PoFx chiama questa routine per notificare al driver una modifica in sospeso allo stato di alimentazione Fx del componente specificato. In questa routine di callback, il driver può eseguire operazioni specifiche dell'hardware correlate alla modifica dello stato funzionale.
Ad esempio, prima di eseguire la transizione di un componente in uno stato Fx a basso consumo, un driver potrebbe salvare lo stato hardware e disabilitare gli interrupt e DMA. Il driver chiama WdfInterruptReportInactive per informare il sistema che l'interrupt non è più attivo. La disattivazione degli interrupt durante le transizioni di stato F può ridurre il consumo complessivo di energia del sistema.
Il driver può anche fornire un puntatore alla routine ComponentIdleConditionCallback nella struttura WDF_POWER_FRAMEWORK_SETTINGS. PoFx chiama questa routine per notificare al driver che il componente è diventato inattivo. In questa routine, il driver avvia il processo di arresto delle code gestite dall'alimentazione e delle operazioni di I/O gestite autonomamente.
Per ciascuna coda con gestione energetica del dispositivo, chiamare WdfIoQueueStop una volta. In ogni chiamata a WdfIoQueueStop, fornire un callback EvtIoQueueState. In genere, il driver chiama WdfIoQueueStop da dentro ComponentIdleConditionCallback.
Assicurarsi che ogni richiesta inviata da ciascuna delle code gestite dal sistema di alimentazione al driver venga completata rapidamente. A seconda del driver, questo può comportare alcune o tutte le operazioni seguenti:
- Se il driver non mantiene le richieste per un periodo di tempo prolungato e non le invia a una destinazione di I/O che lo fa, continuare con il passaggio 3.
- Se il driver trattiene determinate richieste per un periodo di tempo prolungato, accoda queste richieste in una coda manuale. Nella routine ComponentActiveConditionCallback, il driver può quindi recuperare le richieste.
- Se il driver inoltra determinate richieste a una destinazione di I/O che le trattiene per un periodo di tempo prolungato, annullare queste richieste. Inviare di nuovo le richieste in ComponentActiveConditionCallback.
Quando ogni coda è stata arrestata, il framework chiama EvtIoQueueState. Se il driver arresta più code gestite dall'alimentazione elettrica, il framework chiama EvtIoQueueState più volte, una volta per ogni coda.
Il driver deve chiamare PoFxCompleteIdleCondition dopo che l'ultima funzione EvtIoQueueState è stata chiamata. Ad esempio, il driver potrebbe effettuare questa chiamata all'interno dell'ultimo EvtIoQueueState.
Per determinare l'ultima chiamata, il driver potrebbe usare un contatore per tenere traccia del numero di volte in cui il framework ha chiamato EvtIoQueueState. L'esempio Singlecomp illustra questa tecnica. Questo esempio è disponibile a partire da Windows 8 WDK.
Di seguito è riportato un esempio di una tipica sequenza di risparmio di energia:
Riavviare le code gestite dall'alimentazione e le operazioni di I/O autonomamente gestite in ComponentActiveConditionCallback.
Se il driver ha chiamato in precedenza WdfInterruptReportInactive, dovrebbe riabilitare gli interrupt inattivi chiamando WdfInterruptReportActive da ComponentActiveConditionCallback o ComponentIdleStateCallback.