Partilhar via


Suporte à desativação de energia ociosa em dispositivos de múltiplos componentes

[Aplica-se apenas ao KMDF]

Um driver KMDF para um dispositivo de múltiplos componentes pode suportar desligamento ocioso e estados de energia funcional. Como neste caso o driver se regista diretamente com a estrutura de gestão de energia (PoFx), o driver deve coordenar as alterações de estado Dx resultantes com a PoFx.

Fornecendo configurações ociosas da política de energia do dispositivo

Quando chama WdfDeviceAssignS0IdleSettings, o driver deve definir IdleTimeoutType como DriverManagedIdleTimeout na estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. Além disso, o driver deve definir PowerUpIdleDeviceOnSystemWake como WdfTrue e IdleCaps como IdleCannotWakeFromS0, conforme mostrado no exemplo a seguir.

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

Transição do estado operativo (D0) para o estado Low-Power (Dx)

Em EvtDeviceSelfManagedIoInit, o driver chama WdfDeviceStopIdle para obter uma referência de energia, impedindo assim que o WDF coloque o dispositivo num estado de baixo consumo de energia.

O driver libera a referência de energia chamando WdfDeviceResumeIdle da sua rotina de retorno de chamada DevicePowerRequiredCallback.

O driver normalmente especifica um tempo limite de inatividade muito curto para que o WDF coloque o dispositivo em um estado de baixo consumo de energia logo após todas as referências de energia serem liberadas.

Transição do estado de Low-Power (Dx) para o estado funcional (D0)

Em DevicePowerRequiredCallback, o driver deve trazer o dispositivo para seu estado de trabalho (D0). Para fazer isso, ele deve adiar para um thread de trabalho uma chamada para WdfDeviceStopIdle com o parâmetro WaitForD0 definido como TRUE. Essa chamada de bloqueio para WdfDeviceStopIdlenão deve ser feita de dentro de DevicePowerRequiredCallback.

Em vez disso, o driver deve adiar a chamada de bloqueio para um thread de trabalho que esteja executando em nível passivo e tenha a garantia de não fazer a chamada WdfDeviceStopIdle no contexto da rotina de despacho de E/S de uma fila gerenciada por energia.

Se o driver tiver chamado anteriormente WdfDeviceInitSetPowerPageable (o que significa que pode aceder a dados pagináveis durante transições de energia), o driver pode utilizar WdfWorkItemCreate para criar um item de trabalho da framework. Se o driver não tiver definido power-pageable, o driver deve criar seu próprio thread do sistema. Para obter mais informações, consulte PsCreateSystemThread.

Depois que o WdfDeviceStopIdle retorna, mesmo se o método retornar um erro, o driver deve chamar PoFxReportDevicePoweredOn.