Supporto di dispositivi Single-Component con uno o più stati di alimentazione funzionale
Un driver KMDF per un dispositivo a singolo componente può definire uno o più stati di alimentazione 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. 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 altre informazioni su PoFx, vedere Panoramica di Power Management Framework.
Per implementare il supporto dello stato Fx per un dispositivo a singolo componente, è necessario eseguire le operazioni seguenti in ordine prima o durante la prima avvio di un dispositivo.
Questo passaggio riguarda solo i driver KMDF. Chiamare WdfDeviceWdmAssignPowerFrameworkSettings per specificare le impostazioni del framework di risparmio energia 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, durante la registrazione con PoFx, il framework usa le informazioni fornite dal driver in WDF_POWER_FRAMEWORK_SETTINGS quando viene chiamato 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 funzione di callback EvtDeviceSelfManagedIoInit . Se il driver ha registrato una funzione di callback EvtDeviceSelfManagedIoInit , il framework lo chiama una volta per ogni dispositivo, dopo che il framework ha chiamato la funzione di callback EvtDeviceD0Entry del driver per la prima volta.
La parte restante delle informazioni contenute in questo argomento si applica solo ai driver KMDF.
Accensione
Quando il driver chiama WdfDeviceWdmAssignPowerFrameworkSettings, può fornire un puntatore a una funzione di callback EvtDeviceWdmPostPoFxRegisterDevice .
Il framework chiama la funzione di callback EvtDeviceWdmPostPoFxRegisterDevice del driver dopo che il framework è stato registrato con PoFx. Ecco un esempio di una tipica sequenza di alimentazione:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- È disponibile l'handle EvtDeviceWdmPostPoFxRegisterDevice // PoFx
Il driver fornisce il callback EvtDeviceWdmPostPoFxRegisterDevice se deve eseguire operazioni aggiuntive usando POHANDLE per la registrazione del framework di alimentazione. Ad esempio, potrebbe specificare requisiti di latenza, residenza 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 routine di callback Di PowerControlCallback nella struttura WDF_POWER_FRAMEWORK_SETTINGS .
Spegnimento
WDF chiama la funzione di callback EvtDeviceWdmPrePoFxUnregisterDevice prima 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 le interruzioni 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 a una routine ComponentIdleConditionCallback nella relativa struttura WDF_POWER_FRAMEWORK_SETTINGS . PoFx chiama questa routine per notificare al driver che un componente è diventato inattiva. In questa routine, il driver avvia il processo di arresto delle code gestite dall'alimentazione e delle operazioni di I/O autogestito:
Chiamare WdfIoQueueStop una volta per ognuna delle code gestite dall'alimentazione del dispositivo. In ogni chiamata a WdfIoQueueStop specificare un callback EvtIoQueueState . In genere, il driver chiama WdfIoQueueStop dall'interno di ComponentIdleConditionCallback.
Assicurarsi che le richieste inviate al driver da ognuna delle code gestite dall'alimentazione vengano completate rapidamente. A seconda del driver, questo può comportare alcune o tutte le operazioni seguenti:
- Se il driver non contiene richieste per un periodo di tempo prolungato e non le inoltra a una destinazione di I/O che lo fa, continuare con il passaggio 3.
- Se il driver contiene determinate richieste per un periodo di tempo prolungato, accodare queste richieste a 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 li contiene 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, il framework chiama EvtIoQueueState più volte, una volta per ogni coda.
Il driver deve chiamare PoFxCompleteIdleCondition dopo la chiamata dell'ultima funzione EvtIoQueueState . Ad esempio, il driver potrebbe effettuare questa chiamata dall'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 dal Windows 8 WDK.
Di seguito è riportato un esempio di una tipica sequenza di spegnimento:
Riavviare le code gestite dall'alimentazione e le operazioni di I/O self-managed in ComponentActiveConditionCallback.
Se il driver precedentemente denominato WdfInterruptReportInactive, riabilitare gli interrupt inattivi chiamando WdfInterruptReportActive da ComponentActiveConditionCallback o ComponentIdleStateCallback.