Condividi tramite


Sorpresa Wake-Up

Un risveglio a sorpresa è una transizione inattesa a D0. Dopo che un dispositivo entra in D3cold, potrebbe verificarsi un risveglio inatteso come effetto collaterale quando il driver per un altro dispositivo sullo stesso rail di alimentazione richiede una transizione da D3cold a D0. Il driver per il primo dispositivo deve ricevere una notifica della riattivazione a sorpresa per impedire che il dispositivo rimanga in uno stato D0 non inizializzato.

Quando un dispositivo passa da D3hot a D3cold, probabilmente lo fa perché la fonte di alimentazione che condivide con alcuni altri dispositivi è stata disattivata. Qualche volta che questi dispositivi entrano in D3cold, il driver per uno dei dispositivi potrebbe richiedere una transizione a D0. In risposta a questa richiesta, il driver del bus padre o il driver di filtro ACPI attiva l'alimentazione, e tutti i dispositivi che condividono l'alimentazione passano agli stati hardware predefiniti.

L'unico driver di dispositivo che prevede questa modifica dello stato di alimentazione è il driver che ha richiesto la modifica. I driver per gli altri dispositivi devono ricevere una notifica di questa modifica in modo che possano inizializzare correttamente i propri dispositivi per funzionare in D0. Solo un driver che può ricevere questa notifica deve consentire al dispositivo di immettere D3cold. In caso contrario, il driver non saprà quando il dispositivo entra in D0.

Quando un dispositivo è attivato, viene immesso uno stato hardware non inizializzato predefinito. Ad esempio, la specifica PCI Express Base 3.0 definisce uno stato non inizializzato D0 che un dispositivo entra quando riceve la potenza per la prima volta. La definizione di questo stato è specifica per i dispositivi PCI e PCI Express, ma i dispositivi che si connettono ad altri bus sono progettati per immettere stati hardware simili quando vengono attivati.

Nel caso di un dispositivo PCI o PCI Express che implementa più funzioni, queste funzioni del dispositivo probabilmente condividono la stessa guida di alimentazione. Tuttavia, ogni funzione potrebbe avere un driver separato e i driver per queste funzioni potrebbero non comunicare direttamente tra loro. Quando il driver per una di queste funzioni richiede una modifica dello stato di alimentazione da D3cold a D0, i driver per le altre funzioni non prevedono questa modifica. Quando queste altre funzioni ricevono alimentazione, i driver devono ricevere una notifica in modo che possano configurare le funzioni in modo che funzionino correttamente in D0.

Un autista del bus rileva quando viene attivata l'alimentazione di un dispositivo figlio. Se il driver di funzione di questo dispositivo non ha richiesto una transizione a D0, il driver del bus chiede al driver di dispositivo di inviare un IRP di alimentazione D0 (una richiesta di IRP_MN_SET_POWER con stato di destinazione = PowerDeviceD0) per inizializzare il dispositivo da usare in D0. Da questo stato D0 inizializzato, il driver di dispositivo può quindi avviare la transizione del dispositivo a D3hot. I driver di dispositivo possono ricevere notifiche di transizioni di sorpresa a D0 dai conducenti degli autobus nei modi seguenti:

A partire da Windows 8, il driver di funzione di un dispositivo, che funge da proprietario dei criteri di alimentazione, può registrarsi come client di PoFx. Quando l'autista dell'autobus notifica a PoFx che il dispositivo ha riscontrato una transizione a sorpresa a D0, PoFx aiuta il dispositivo a passare a uno stato D0 inizializzato e quindi a D3hot. Prima di tutto, PoFx chiama la routine DevicePowerRequiredCallback del driver per richiedere al driver di dispositivo di inviare un IRP di alimentazione D0 nello stack di dispositivi. Successivamente, PoFx chiama la routine DevicePowerNotRequiredCallback del driver per notificare che il dispositivo non è necessario rimanere nello stato D0.

A partire da Kernel-Mode Driver Framework (KMDF) versione 1.11, il driver KMDF per un dispositivo a componente singolo può registrarsi indirettamente con PoFx chiamando il metodo WdfDeviceWdmAssignPowerFrameworkSettings . In questa chiamata, il driver fornisce puntatori alle routine di callback che notificano il driver delle transizioni inattese verso D0. Per altre informazioni, vedere Supportare gli stati di potenza funzionale.

Un driver che non registra il dispositivo con PoFx può comunque ricevere una notifica di transizione imprevista a D0 se il dispositivo è pronto per la riattivazione. Quando i conducenti del bus accendono l'alimentazione del dispositivo, completano la richiesta di IRP_MN_WAIT_WAKE del conducente. In risposta, il driver inizializza il dispositivo in modo che funzioni in D0. È probabile che il dispositivo sia inattivo, nel qual caso il driver, dopo qualche tempo, sposterà il dispositivo in D3hot.

Un driver di funzione che non esegue la registrazione con PoFx e che non prepara il dispositivo per il risveglio non riceve notifiche di una transizione inattesa da D3cold a D0. Il dispositivo potrebbe impiegare grandi quantità di tempo in uno stato D0 non inizializzato. In questo stato, tutti i componenti del dispositivo vengono in genere attivati. Per ridurre il consumo energetico dei dispositivi inattivi, i driver dovrebbero abilitare l'ingresso a D3cold solo se possono ricevere notifiche di transizioni improvvise a D0.