Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um driver KMDF para um dispositivo com um único componente pode definir um ou mais estados funcionais de energia para o componente e registar funções de callback que o framework de gestão de energia (PoFx) chama quando o estado Fx do componente muda ou a sua condição de ativa/inativa muda. A partir da versão 2.0 do UMDF, um driver UMDF para um dispositivo de componente único pode definir um único estado de energia funcional (F0).
Para obter mais informações sobre PoFx, consulte Visão geral da estrutura de gerenciamento de energia.
Para implementar o suporte ao estado Fx para um dispositivo de componente único, você deve fazer o seguinte na ordem antes ou durante a primeira vez que um dispositivo é iniciado.
Esta etapa é apenas para drivers KMDF. Chame WdfDeviceWdmAssignPowerFrameworkSettings para especificar as configurações da estrutura de energia que o WDF usa ao se registrar na PoFx. Na estrutura WDF_POWER_FRAMEWORK_SETTINGS que o driver fornece quando chama WdfDeviceWdmAssignPowerFrameworkSettings, o driver pode fornecer ponteiros para várias funções de callbacks. Se o driver suportar apenas um único estado de energia funcional (F0), esta etapa é opcional.
Esta etapa se aplica aos drivers KMDF e UMDF. Chame WdfDeviceAssignS0IdleSettings e defina o campo IdleTimeoutType da estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS como SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint. Isso faz com que a WDF se registre na PoFx.
Para controladores KMDF, quando se registam com PoFx, a estrutura usa as informações que o controlador forneceu em WDF_POWER_FRAMEWORK_SETTINGS quando chamou WdfDeviceWdmAssignPowerFrameworkSettings.
Como um dispositivo pode ser iniciado várias vezes, por exemplo, no caso de reequilíbrio de recursos, um driver pode executar os passos anteriores dentro da função de retorno de chamada EvtDeviceSelfManagedIoInit. Se o driver registou uma função de retorno de chamada EvtDeviceSelfManagedIoInit, a estrutura chama-a uma vez para cada dispositivo, depois de a estrutura ter chamado a função de retorno de chamada EvtDeviceD0Entry do driver pela primeira vez.
O restante das informações neste tópico se aplica somente aos drivers KMDF.
Ligando
Quando o driver chama WdfDeviceWdmAssignPowerFrameworkSettings, ele pode fornecer um ponteiro para uma função de retorno de chamada EvtDeviceWdmPostPoFxRegisterDevice .
A estrutura chama a função de retorno de chamada do driver EvtDeviceWdmPostPoFxRegisterDevice após a estrutura se registrar junto à PoFx. Aqui está um exemplo de uma sequência de activação típica:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- EvtDeviceWdmPostPoFxRegisterDevice // O identificador PoFx está disponível
O driver fornece o retorno de chamada EvtDeviceWdmPostPoFxRegisterDevice se precisar executar quaisquer operações adicionais usando o POHANDLE para o registro da estrutura de energia. Por exemplo, poderia especificar requisitos de latência, residência e despertar. Para obter mais informações sobre rotinas que usam o POHANDLE, consulte Rotinas de gerenciamento de energia de dispositivo.
Seu driver também pode usar o POHANDLE para trocar solicitações de controle de energia com PoFx:
- Para enviar um pedido de controlo de potência para o PoFx, o controlador fornece uma função de retorno de chamada EvtDeviceWdmPostPoFxRegisterDevice e, em seguida, usa o POHANDLE resultante para chamar PoFxPowerControl.
- Para executar operações de controlo de energia solicitadas pela PoFx, o driver fornece uma rotina de retorno de chamada PowerControlCallback na sua estrutura WDF_POWER_FRAMEWORK_SETTINGS.
Desligando
WDF chama a função de retorno de chamada EvtDeviceWdmPrePoFxUnregisterDevice antes de excluir um registro especificado com PoFx.
O driver pode fornecer um ponteiro para uma rotina ComponentIdleStateCallback na estrutura WDF_POWER_FRAMEWORK_SETTINGS que ele fornece a WdfDeviceWdmAssignPowerFrameworkSettings. O PoFx chama essa rotina para notificar o driver de uma alteração pendente no estado de energia Fx do componente especificado. Nessa rotina de retorno de chamada, o driver pode executar operações específicas de hardware relacionadas à alteração de estado funcional.
Por exemplo, antes de fazer a transição de um componente para um estado Fx de baixo consumo de energia, um driver pode salvar o estado do hardware e desabilitar interrupções e DMA. O driver chama WdfInterruptReportInactive para informar o sistema de que a interrupção não está mais ativa. Desativar interrupções durante transições de estado F pode reduzir o consumo geral de energia do sistema.
O driver também pode fornecer um ponteiro para uma rotina ComponentIdleConditionCallback na sua estrutura WDF_POWER_FRAMEWORK_SETTINGS. O PoFx chama essa rotina para notificar o driver de que um componente ficou ocioso. Nessa rotina, o driver inicia o processo de interromper suas filas gerenciadas por energia e operações de E/S autogerenciadas:
Chame WdfIoQueueStop uma vez para cada uma das filas de gerenciamento de energia do dispositivo. Em cada chamada para WdfIoQueueStop, forneça um retorno de chamada EvtIoQueueState . Normalmente, o driver chama WdfIoQueueStop de dentro de ComponentIdleConditionCallback.
Certifique-se de que as solicitações enviadas ao driver a partir de cada uma das filas geridas por energia sejam concluídas rapidamente. Dependendo do motorista, isso pode envolver alguns ou todos os seguintes:
- Se o driver não mantiver as solicitações por um período prolongado e não as encaminhar para um destino de E/S que o faça, avance para o passo 3.
- Se o driver mantiver determinadas solicitações por um tempo prolongado, reencaminhe essas solicitações para uma fila manual. Na rotina ComponentActiveConditionCallback, o driver pode então recuperar as solicitações.
- Se o driver encaminhar determinadas solicitações para um destino de E/S que as mantenha por um tempo prolongado, cancele essas solicitações. Reenvie as solicitações em ComponentActiveConditionCallback.
Quando cada fila é interrompida, a estrutura chama EvtIoQueueState. Se o driver estiver parando várias filas gerenciadas por energia, a estrutura chamará EvtIoQueueState várias vezes, uma para cada fila.
O driver deve chamar PoFxCompleteIdleCondition após a última função EvtIoQueueState ter sido chamada. Por exemplo, o driver pode fazer essa chamada de dentro do último EvtIoQueueState.
Para determinar qual chamada é a última, o driver pode usar um contador para rastrear o número de vezes que a estrutura chamou EvtIoQueueState. O exemplo Singlecomp ilustra essa técnica. Este exemplo está disponível a partir do WDK do Windows 8.
Aqui está um exemplo de uma sequência típica de desligamento:
Reinicie filas gerenciadas por energia e operações de E/S autogerenciadas em ComponentActiveConditionCallback.
Se o driver anteriormente chamou WdfInterruptReportInactive, reative as interrupções inativas chamando WdfInterruptReportActive a partir de ComponentActiveConditionCallback ou ComponentIdleStateCallback.