Gerenciamento de energia de ACX
Este tópico discute o gerenciamento de energia do ACX. Para obter informações sobre enumeração de dispositivo ACX, inicialização e desligamento e rebalanceamento de dispositivo, consulte Enumeração de dispositivo ACX. Para obter uma visão geral do ACX, consulte Visão geral das extensões de classe de áudio ACX.
O ACX aproveita o comportamento de energia PnP da KMDF do WDF. Para obter mais informações sobre sequências de gerenciamento de energia da KMDF, consulte Sequências de retorno de chamada de gerenciamento de energia e PnP.
É recomendável que os drivers do ACX implementem totalmente o gerenciamento de energia do WDF, por exemplo, implementando a estrutura WDF_PNPPOWER_EVENT_CALLBACKS. Para obter mais informações, consulte Suporte a PnP e gerenciamento de energia em seu driver.
Remoção surpresa do dispositivo do ACX
A estrutura do WDF pode chamar o EvtDeviceSurpriseRemoval a qualquer momento, ou seja, esse retorno de chamada não é serializado com a sequência de desligamento. O driver do WDF não deve executar nenhuma ação ao receber esse retorno de chamada, exceto para tomar nota de que o dispositivo foi removido de surpresa.
A sequência de retorno de chamada de remoção surpresa de desligamento é idêntica à desativação de Dx e casos de remoção, o WDF não invoca os seguintes retornos de chamada no caminho de remoção surpresa:
- EvtDeviceArmWakeFrom*, como EvtDeviceArmWakeFromS0
- EvtIoStop (limpar filas gerenciadas por energia) EvtWdfIoQueueIoStop
- EvtDeviceSelfManagedIoFlush (liberar buffers de E/S)
Para obter mais informações, consulte Sequências de retorno de chamada PnP e gerenciamento de energia e Usar filas de E/S gerenciadas por energia.
Inicialização do circuito do ACX
Um AcxCircuit "dinâmico" pode ser adicionado a qualquer momento. O driver cria um novo dispositivo PDO filho e associa o novo AcxCircuit ao manipular o retorno de chamada PrepareHardware do WDF para esse dispositivo PDO. O tempo de vida de um circuito "dinâmico" não está vinculado ao tempo de vida do FDO.
Um AcxCircuit "estático" só pode ser adicionado quando o driver está manipulando o retorno de chamada PrepareHardware do WDF para seu dispositivo FDO. O tempo de vida de um circuito "estático" não está vinculado ao tempo de vida do FDO.
Um driver do ACX também pode criar objetos AcxFactoryCircuit (provedores de circuito) durante a sequência de inicialização usando a função AcxFactoryCircuitCreate. Um objeto AcxFactoryCircuit usa a criação de circuitos dinâmicos para adicionar ACXCIRCUITS quando solicitado pelo ACX. Esse recurso é muito útil ao construir pontos de extremidade compostos, ou seja, ponto de extremidade de áudio composto por dois ou mais circuitos ACXs ligados entre si.
O circuito do ACX define os seguintes retornos de chamada que são invocados durante a inicialização de AcxCircuit / ponto de extremidade de áudio:
EvtAcxCircuitPrepareHardware: o ACX invoca esse retorno de chamada logo após o WDF entregar seu retorno de chamada de hardware de preparação do WDF. Ele dá uma oportunidade para o driver fazer qualquer preparação de hardware específica para o circuito. Essa chamada é serializada pelo ACX. O dispositivo não está em D0 quando essa chamada é invocada.
EvtAcxCircuitPowerUp: o ACX invoca esse retorno de chamada logo após voltar do Dx. Essa chamada é serializada pelo ACX. O dispositivo está em D0.
Para pontos de extremidade compostos, AcxCircuits pode opcionalmente se registrar para estes retornos de chamada:
EvtAcxCircuitCompositeCircuitInitialize, invocado na primeira vez que o ACX detecta que esse ACXCIRCUIT está visível, ou seja, o dispositivo associado foi em D0 e tornou esse circuito visível para entidades externas à sua própria pilha. As interfaces de áudio do circuito ainda estão no estado DESLIGADO.
EvtAcxCircuitCompositeInitialize, invocado cada vez que o ACX está terminando a inicialização de um ponto de extremidade composto. Após esse retorno de chamada, o ACX ativa as interfaces de áudio desse circuito.
EvtAcxCircuitCompositeDeinitialize, invocado sempre que o ACX está derrubando um ponto de extremidade composto. Os drivers podem não receber esse retorno de chamada se sua própria pilha tiver sido removida de surpresa ou não foi possível processar E/S.
Se presentes, as instâncias de fluxo são restauradas aos seus estados de pré-desligamento.
Desligamento e remoção do circuito do ACX
Um AcxCircuit "dinâmico" pode ser removido a qualquer momento invalidando e removendo o objeto de dispositivo associado ao circuito. O circuito associado pode ser removido/desanexado do dispositivo removido quando o driver manipula os retornos de chamada PrepareHardware/ReleaseHardware do WDF para esse dispositivo PDO. Como mencionado acima, a vida útil de um circuito "dinâmico" não está vinculada à vida útil do FDO.
Um AcxCircuit "estático" só pode ser removido quando o driver está manipulando os retornos de chamada PrepareHardware/ReleaseHardware do WDF para seu dispositivo FDO. O tempo de vida de um circuito "estático" não está vinculado ao tempo de vida do FDO.
O driver pode remover um AcxFactoryCircuit (provedor de circuito) em seus retornos de chamada PrepareHardware/ReleaseHardware do WDF. A remoção de um AcxFactoryCircuit tem o efeito de remover todos os seus AcxCircuit(s) "dinâmicos" associados. AcxCircuit(s) também podem ser removidos quando o gerenciador do ACX diz a uma fábrica de circuitos para remover um circuito específico ou quando o gerenciador do ACX fecha os identificadores de AcxFactoryCircuit. Nesse caso, o ACX fecha todos os circuitos associados a esse identificador.
A estrutura ACX_CIRCUIT_PNPPOWER_CALLBACKS descreve os retornos de chamada a seguir que podem ser usados por um driver do ACX.
EvtAcxCircuitPowerDown: o ACX invoca esse retorno de chamada pouco antes de entrar em Sx/Dx/Stop/Removal/SurpriseRemoval e quando o driver remove o circuito. Essa chamada é serializada pelo ACX. O dispositivo está em D0, embora tenha em mente que o dispositivo pode ser removido de surpresa a qualquer momento (o que significa que o hardware associado desapareceu).
EvtAcxCircuitReleaseHardware: o ACX invoca esse retorno de chamada pouco antes de o WDF entregar seu retorno de chamada de hardware de liberação do WDF. Isso dá uma oportunidade para o driver fazer qualquer limpeza enquanto o circuito ainda está ativo. Essa chamada é serializada pelo ACX. O dispositivo não está em D0 quando essa chamada é invocada.
EvtWdfObjectContextCleanup: o WDF invoca esse retorno de chamada quando o objeto WDF/ACX é excluído. Essa chamada é sincronizada com a exclusão da chamada de objeto do WDF. O dispositivo pode não estar em D0 quando essa chamada é invocada. O retorno de chamada está sendo executado no nível passivo.
EvtWdfObjectContextDestory: o WDF invoca esse retorno de chamada depois que a última referência a esse objeto desaparece. Essa chamada não é sincronizada com a exclusão da chamada de objeto do WDF. O dispositivo pode não estar em D0 quando essa chamada é invocada. Esse retorno de chamada é invocado somente depois que a última referência ao objeto desaparece. O retorno de chamada está sendo executado em <= nível de DPC. O IRQL exato depende do IRQL do thread liberando a última referência.
Gerenciamento de ociosidade do dispositivo do ACX
O ACX aproveita a infraestrutura de gerenciamento ocioso do WDF. Os drivers do ACX usam as seguintes DDIs do WDF para habilitar o gerenciamento ocioso:
WdfDeviceAssignS0IdleSettings: essa chamada especifica o tipo de tempo limite ocioso e gerenciamento ocioso. O driver do ACX é livre para usar a configuração apropriada para seu dispositivo.
WdfDeviceStopIdle: essa chamada impede que o dispositivo fique ocioso. Observe que sua chamada não bloqueia solicitações Sx. Ou seja, o dispositivo vai em Dx independentemente do número de referências de energia ativas quando o sistema vai para um estado de energia inferior.
WdfDeviceResumeIdle: essa chamada permite que o dispositivo reinicie seu tempo limite ocioso.
Em um cenário de pilha múltipla/circuito, pilhas diferentes podem ter diferentes tempos limite ociosos. Isso ocorre devido às diferentes configurações/requisitos de energia de cada pilha, portanto, diferentes tempos limite ociosos são apropriados. Para obter informações gerais sobre pilha múltipla, consulte Comunicações entre drivers de pilha múltipla ACX.
Driver do ACX e filas gerenciadas por energia
O WDF oferece suporte a filas de E/S gerenciadas por energia. Esse tipo de fila é totalmente integrado ao gerenciamento de energia do WDF. O WDF invoca os retornos de chamada da fila em várias etapas na sequência de inicialização/desligamento do WDF. Para obter mais informações, consulte Usar filas de E/S gerenciadas por energia.
Os drivers do ACX podem usar esse tipo de fila somente se o driver não estiver usando o recurso de componente único/múltiplo com vários estados (Fx).
Driver do ACX e estados D3Hot / D3Cold (D3)
Os drivers de áudio sabem quando ir em D3Hot ou D3Cold com base nas informações disponíveis na enumeração ACX_DX_EXIT_LATENCY.
typedef enum _ACX_DX_EXIT_LATENCY {
AcxDxExitLatencyInstant = 0,
AcxDxExitLatencyFast,
AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;
AcxDxExitLatencyFast corresponde a D3Hot (DSP ligado) e AcxDxExitLatencyResponsive corresponde a D3Cold (DSP desligado).
Os drivers de áudio podem obter o valor ACX_DX_EXIT_LATENCY chamando a função AcxDeviceGetCurrentDxExitLatency.
O WDF conhece os recursos de D3Cold do driver por meio do campo ExcludeD3Cold de WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. O driver passa essa struct como entrada para o WdfDeviceAssignS0IdleSettings.
Os drivers do WDF podem invocar o WdfDeviceAssignS0IdleSettings várias vezes para ativar ou desativar o D3Cold, dependendo do ambiente do sistema, ou seja, em resposta ao ACX. Para obter mais informações, consulte estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS.
Estrutura de gerenciamento de energia (PoFx) e tempo limite ocioso gerenciado pelo driver
Gerenciamento de energia em nível de componente
Observe que o WDF não oferece suporte direto aos estados de dispositivo/componente Fx. Para usar esses estados, o driver deve usar o tempo limite ocioso gerenciado pelo driver. Para obter mais informações sobre o uso de estados de componentes de dispositivo Fx e tempo limite ocioso gerenciado pelo driver, consulte os tópicos a seguir.
- Gerenciamento de energia em nível de componente
- Suporte a dispositivos de vários componentes com estado de energia funcional único ou múltiplo
Estrutura de gerenciamento de energia (PoFx)
O Windows fornece uma estrutura de gerenciamento de energia de tempo de execução (PoFx) que adiciona suporte para gerenciamento de energia em nível de componente. Um componente, ou subdispositivo, é uma unidade de hardware funcional em um dispositivo que pode ser ligada ou comutada para um estado de baixo consumo de energia, independentemente dos outros componentes no mesmo dispositivo. Para obter mais informações, consulte Visão geral da Power Management Framework.
Confira também
Documentação de referência da ACX
Visão geral de extensões de classe de áudio ACX
Usar filas de E/S gerenciadas por energia.
Sequências de retorno de chamada de gerenciamento de energia e PnP