Suporte a dispositivos Single-Component com estados de energia funcionais únicos ou múltiplos
Um driver KMDF para um dispositivo de componente único pode definir um ou mais estados de energia funcionais para o componente e registrar funções de retorno de chamada que a PoFx (estrutura de gerenciamento de energia) chama quando o estado fx do componente é alterado ou sua condição ativa/ociosa é alterada. A partir do UMDF versão 2.0, 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 de 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 destina-se apenas a drivers KMDF. Chame WdfDeviceWdmAssignPowerFrameworkSettings para especificar as configurações da estrutura de energia que o WDF usa ao registrar com 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 retorno de chamada. Se o driver der suporte a apenas um único estado de energia funcional (F0), essa etapa será opcional.
Esta etapa se aplica a drivers KMDF e drivers UMDF. Chame WdfDeviceAssignS0IdleSettings e defina o campo IdleTimeoutType da estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS como SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint. Isso faz com que o WDF se registre no PoFx.
Para drivers KMDF, ao registrar com PoFx, a estrutura usa as informações fornecidas pelo driver em WDF_POWER_FRAMEWORK_SETTINGS quando chamou WdfDeviceWdmAssignPowerFrameworkSettings.
Como um dispositivo pode iniciar mais de uma vez, por exemplo, em caso de rebalanceamento de recursos, um driver pode executar as etapas anteriores na função de retorno de chamada EvtDeviceSelfManagedIoInit . Se o driver tiver registrado uma função de retorno de chamada EvtDeviceSelfManagedIoInit , a estrutura a chamará uma vez para cada dispositivo, depois que a estrutura tiver 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.
Ligar
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 EvtDeviceWdmPostPoFxRegisterDevice do driver depois que a estrutura é registrada com PoFx. Aqui está um exemplo de uma sequência típica de ligar/ligar/desliga:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- O identificador EvtDeviceWdmPostPoFxRegisterDevice // PoFx está disponível
O driver fornecerá o retorno de chamada EvtDeviceWdmPostPoFxRegisterDevice se precisar executar operações adicionais usando o POHANDLE para o registro da estrutura de energia. Por exemplo, ele pode especificar requisitos de latência, residência e ativação. Para obter mais informações sobre rotinas que usam o POHANDLE, consulte Rotinas de gerenciamento de energia do dispositivo.
O driver também pode usar o POHANDLE para trocar solicitações de controle de energia com PoFx:
- Para enviar uma solicitação de controle de energia para PoFx, o driver fornece uma função de retorno de chamada EvtDeviceWdmPostPoFxRegisterDevice e, em seguida, usa o POHANDLE resultante para chamar PoFxPowerControl.
- Para executar operações de controle de energia solicitadas pelo PoFx, o driver fornece uma rotina de retorno de chamada PowerControlCallback em sua estrutura de WDF_POWER_FRAMEWORK_SETTINGS .
Desligar
O 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. A PoFx chama essa rotina para notificar o driver de uma alteração pendente para o 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 baixa potência, um driver pode salvar o estado do hardware e desabilitar interrupções e DMA. O driver chama WdfInterruptReportInactive para informar ao sistema 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 em sua estrutura WDF_POWER_FRAMEWORK_SETTINGS . A PoFx chama essa rotina para notificar o driver de que um componente ficou ocioso. Nessa rotina, o driver inicia o processo de parar suas filas gerenciadas por energia e operações de E/S autogerenciadas:
Chame WdfIoQueueStop uma vez para cada uma das filas gerenciadas por energia do dispositivo. Em cada chamada para WdfIoQueueStop, forneça um retorno de chamada EvtIoQueueState . Normalmente, o driver chama WdfIoQueueStop de dentro de ComponentIdleConditionCallback.
Verifique se as solicitações enviadas para o driver de cada uma das filas gerenciadas por energia são concluídas rapidamente. Dependendo do driver, isso pode envolver alguns ou todos os seguintes:
- Se o driver não armazenar solicitações por um tempo estendido e não as encaminhar para um destino de E/S que o faça, continue na etapa 3.
- Se o driver tiver determinadas solicitações por um tempo estendido, solicite essas solicitações novamente para uma fila manual. Em sua rotina ComponentActiveConditionCallback , o driver pode recuperar as solicitações.
- Se o driver encaminhar determinadas solicitações para um destino de E/S que as mantém por um longo período, 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 vez para cada fila.
O driver deve chamar PoFxCompleteIdleCondition depois que a última função EvtIoQueueState tiver 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 acompanhar 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 desligar:
Reinicie filas gerenciadas por energia e operações de E/S autogerenciadas em ComponentActiveConditionCallback.
Se o driver anteriormente chamado WdfInterruptReportInactive, habilite novamente as interrupções inativas chamando WdfInterruptReportActive de ComponentActiveConditionCallback ou ComponentIdleStateCallback.