Udostępnij przez


Wspieranie trybu bezczynności Power-Down na urządzeniach Multiple-Component

[Dotyczy tylko usługi KMDF]

Sterownik KMDF dla urządzenia wieloskładnikowego może obsługiwać przełączanie w stan niskiego poboru mocy w stanie bezczynności oraz stany zasilania funkcjonalnego. Ponieważ w tym przypadku sterownik rejestruje się bezpośrednio w strukturze zarządzania energią (PoFx), sterownik musi koordynować wynikowe zmiany stanu Dx we współpracy z PoFx.

Konfigurowanie ustawień bezczynności polityki zasilania urządzenia

Gdy wywołuje WdfDeviceAssignS0IdleSettings, sterownik musi ustawić IdleTimeoutType na DriverManagedIdleTimeout w strukturze WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. Ponadto sterownik musi ustawić PowerUpIdleDeviceOnSystemWake na WdfTrueoraz IdleCaps na IdleCannotWakeFromS0, jak pokazano w poniższym przykładzie.

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);

Przechodzenie z trybu pracy (D0) do stanu Low-Power (Dx)

W EvtDeviceSelfManagedIoInitsterownik wywołuje WdfDeviceStopIdle, aby pobrać odwołanie do zasilania, co uniemożliwia WDF umieszczenie urządzenia w stanie niskiego zużycia energii.

Sterownik zwalnia odwołanie do zasilania, wywołując WdfDeviceResumeIdle ze swojej procedury wywołania zwrotnego DevicePowerRequiredCallback.

Sterownik zazwyczaj określa bardzo krótki czas bezczynności, dzięki czemu WDF umieszcza urządzenie w stanie niskiego poboru energii wkrótce po wydaniu wszystkich referencji mocy.

Przejście z Low-Power (Dx) do stanu roboczego (D0)

W DevicePowerRequiredCallbacksterownik urządzenia musi przełączyć urządzenie do stanu pracy (D0). W tym celu należy odroczyć na wątek roboczy wywołanie metody WdfDeviceStopIdle z ustawionym parametrem WaitForD0 na wartość TRUE. To blokowanie wywołania WdfDeviceStopIdle nie może być wykonane z poziomu DevicePowerRequiredCallback.

Zamiast tego sterownik musi odroczyć wywołanie blokujące do wątku roboczego, który jest uruchomiony na poziomie pasywnym i jest gwarancja, że nie wykona wywołania WdfDeviceStopIdle w kontekście procedury obsługi we/wy kolejki zarządzanej przez zasilanie.

Jeśli sterownik wcześniej wywołał WdfDeviceInitSetPowerPageable (co oznacza, że może uzyskać dostęp do danych stronicowalnych podczas przejść zasilania), sterownik może wywołać WdfWorkItemCreate w celu utworzenia elementu roboczego. Jeśli sterownik nie ustawił możliwości zarządzania energią, sterownik musi utworzyć własny wątek systemowy. Aby uzyskać więcej informacji, zobacz PsCreateSystemThread.

Po powrocie WdfDeviceStopIdle, nawet jeśli metoda zwróci błąd, sterownik musi wywołać PoFxReportDevicePoweredOn.