Monitorar a detecção de plug-quente
As informações nesta página se aplicam a drivers gráficos implementados usando uma versão anterior ao WDDM versão 2.2.
Uma saída de vídeo em um adaptador de exibição é considerada um dispositivo filho do adaptador de exibição. Um monitor ou outro dispositivo de exibição externo que se conecta à saída não é considerado um dispositivo filho. Durante a inicialização, a função DxgkDdiQueryChildRelations do driver de miniport de exibição atribui a cada dispositivo filho um tipo e um valor de conscientização do HPD. O tipo é um dos enumeradores DXGK_CHILD_DEVICE_TYPE :
TypeVideoOutput
TypeOther
O valor de conscientização do HPD é um dos enumeradores DXGK_CHILD_DEVICE_HPD_AWARENESS :
HpdAwarenessAlwaysConnected
HpdAwarenessInterruptible
HpdAwarenessPolled
Um dispositivo filho que tem um tipo de TypeVideoOutput e qualquer valor de reconhecimento hpd diferente de HpdAwarenessAlwaysConnected é chamado de conector de saída de vídeo.
Se o driver de miniporto de exibição não puder determinar se um monitor está conectado à saída do vídeo, o driver deverá emular o comportamento de um dispositivo interruptível, com o valor de reconhecimento hpd definido como HpdAwarenessInterruptible. Se o driver de miniporto de exibição precisar indicar que um monitor interruptível deve ser conectado à saída de vídeo, como quando um usuário insere um atalho de teclado para alternar para um modo de exibição de televisão, o driver deve chamar a função DxgkCbIndicateChildStatus com ChildStatus. HotPlug. Conectado definido como TRUE.
Em determinados momentos, o sistema operacional solicita que o driver de miniporte de exibição relate o status de todos os conectores de saída de vídeo que tenham um valor de reconhecimento HPD de HpdAwarenessPolled. Não há intervalo de sondagem regular; em vez disso, a solicitação é feita quando há uma necessidade específica de atualizar a lista de dispositivos e modos de exibição disponíveis. Por exemplo, quando um computador laptop está encaixado, o sistema operacional precisa saber se um monitor está conectado à saída de vídeo na estação de encaixe. O sistema operacional faz a solicitação chamando a função DxgkDdiQueryChildStatus do driver de miniport de exibição para cada dispositivo filho que tenha um valor de reconhecimento hpd de HpdAwarenessPolled.
Para conectores de saída de vídeo que têm um valor de reconhecimento HPD de HpdAwarenessInterruptible, o driver de miniporto de exibição é responsável por notificar o sistema operacional sempre que um dispositivo de exibição externo estiver conectado ou desconectado. O código de tratamento de interrupção do driver de miniporto de exibição chama a função DxgkCbIndicateChildStatus do driver de porta de exibição para relatar que um dispositivo de exibição externo foi conectado ou desconectado de uma saída de vídeo específica. Quando um computador laptop está encaixado, a função DxgkDdiNotifyAcpiEvent do driver de miniport de exibição deve chamar DxgkCbIndicateChildStatus para cada saída de vídeo na estação de encaixe que tenha um valor de reconhecimento HPD de HpdAwarenessInterruptible.
Se um conector com um valor de reconhecimento HPD de HpdAwarenessPolled ficar indisponível (ou seja, encoberto) quando um computador laptop estiver encaixado, a função DxgkDdiNotifyAcpiEvent do driver de miniporto de exibição deverá chamar DxgkCbIndicateChildStatus para relatar que o conector está desconectado.
A saída de vídeo associada a um painel de exibição integrado em um computador portátil é um caso incomum. O sistema operacional precisa saber se a tampa do computador portátil está aberta ou fechada, portanto, a ideia de conexão é usada para significar aberto e a ideia de não estar conectado é usada para significar fechado. A saída de vídeo associada a uma exibição integrada em um computador portátil tem um valor de reconhecimento hpd de HpdAwarenessInterruptible. No entanto, isso não significa que o adaptador de exibição gere uma interrupção quando a tampa é aberta ou fechada. Em vez disso, o BIOS do ACPI gera uma interrupção quando a tampa é aberta ou fechada. Essa interrupção resulta em uma chamada para a função DxgkDdiNotifyAcpiEvent do driver de miniport, que chama DxgkCbIndicateChildStatus para relatar o status (aberto ou fechado) da tampa. O driver de miniporto de exibição relata a status da tampa definindo o membro HotPlug.Connected de uma estrutura de DXGK_CHILD_STATUS como TRUE (aberto) ou FALSE (fechado) e passando a estrutura DXGK_CHILD_STATUS para DxgkCbIndicateChildStatus.
A lista a seguir descreve as etapas seguidas quando um monitor está conectado a um conector HD15, supondo que o conector tenha um valor de reconhecimento HPD de HpdAwarenessPolled.
Um monitor está conectado ao conector HD15 no adaptador de exibição. O adaptador de exibição não detecta isso como um evento hot-plug.
Em algum momento futuro, um aplicativo de modo de usuário solicita uma lista de dispositivos de exibição.
Para cada conector de saída de vídeo no adaptador de exibição que tem um valor de reconhecimento HPD de HpdAwarenessPolled, o gerenciador do VidPN chama a função DxgkDdiQueryChildStatus do driver de miniporto de exibição para determinar se um dispositivo de exibição externo está conectado. Quando DxgkDdiQueryChildStatus é chamado para o conector HD15, ele relata que um monitor externo está realmente conectado.
A lista a seguir descreve as etapas seguidas quando um monitor está conectado a um conector DVI, supondo que o conector tenha um valor de reconhecimento HPD de HpdAwarenessInterruptible.
Um painel simples está conectado ao conector DVI no adaptador de exibição.
O adaptador de exibição detecta um evento hot-plug e gera uma interrupção.
A interrupção é tratada pela função DxgkDdiInterruptRoutine do driver de miniport de exibição, que agenda uma DPC (chamada de procedimento adiado). Posteriormente, a função de retorno de chamada DPC do driver de miniporto de exibição é chamada.
A função de retorno de chamada DPC passa uma estrutura DXGK_CHILD_STATUS para a função DxgkCbIndicateChildStatus do driver de porta de exibição para relatar o status do conector DVI. O membro ChildUid da estrutura DXGK_CHILD_STATUS identifica o conector DVI e o membro HotPlug.Connected (definido como TRUE nesse caso) indica que um dispositivo de exibição externo está conectado.
Suponha que um conector DVI dê suporte a um dongle que tenha três branches: DVI, HD15 e S-video. Nesse caso, o driver de miniporto de exibição teria enumerado anteriormente três dispositivos filho associados a um conector DVI físico: DVI-on-DVI, HD15-on-DVI e S-video-on-DVI. Cada um desses dispositivos filho teria um tipo de TypeVideoOutput e um valor de reconhecimento hpd de HpdAwarenessInterruptible. A lista a seguir descreve as etapas seguidas quando um monitor está conectado ao branch HD15 do dongle.
O adaptador de exibição detecta um evento hot-plug e gera uma interrupção.
A interrupção é tratada pela função DxgkDdiInterruptRoutine do driver de miniport de exibição, que agenda uma DPC (chamada de procedimento adiado). Posteriormente, a função de retorno de chamada DPC do driver de miniporto de exibição é chamada.
A função de retorno de chamada DPC determina que o evento hot-plug estava na ramificação HD15 do dongle (HD15-on-DVI).
As funções de retorno de chamada DPC passam uma estrutura DXGK_CHILD_STATUS para DxgkCbIndicateChildStatus para relatar o status da saída de vídeo HD15-on-DVI. O membro ChildUid da estrutura DXGK_CHILD_STATUS identifica a saída do vídeo e o membro HotPlug.Connected (definido como TRUE nesse caso) indica que um dispositivo de exibição externo está conectado.
A lista a seguir descreve as etapas seguidas quando a tampa é fechada em um computador laptop.
A tampa é fechada em um computador portátil, o que gera um evento ACPI. Posteriormente, a função DxgkDdiNotifyAcpiEvent do driver de miniport de exibição é chamada.
DxgkDdiNotifyAcpiEvent passa uma estrutura DXGK_CHILD_STATUS para a função DxgkCbIndicateChildStatus do driver de porta de exibição para relatar o status do dispositivo filho associado ao painel de exibição interno. Especificamente, DxgkDdiNotifyAcpiEvent define o membro HotPlug.Connected da estrutura DXGK_CHILD_STATUS como FALSE.