Compartilhar via


DMA baseado em pacote no AVStream

O DMA (acesso direto à memória) baseado em pacote ocorre quando o minidriver lê dados diretamente de e grava dados diretamente para capturar buffers recebidos do modo de usuário. O AVSHwS (Driver de Exemplo de Hardware Simulado) do AVStream nos exemplos do WDK (Kit de Driver do Windows) demonstra como criar um minidriver AVStream que executa esse tipo de DMA.

Para implementar um esquema de DMA baseado em pacotes:

  1. Especifique KSPIN_FLAG_GENERATE_MAPPINGS no membro Flags de estruturasde KSPIN_DESCRIPTOR_EX relevantes. Observe que esse sinalizador só deve ser usado por um barramento master com suporte de dispersão/coleta.

  2. Registre uma ISR (rotina de serviço de interrupção), conforme descrito em Escrevendo minidrivers AVStream para hardware.

Em seguida, na expedição inicial AVStrMiniDeviceStart :

  1. Configure um objeto de adaptador de DMA usando IoGetDmaAdapter.

  2. Registre o objeto do adaptador DMA com AVStream chamando KsDeviceRegisterAdapterObject.

O minidriver especifica o tamanho máximo para um único mapeamento de dispersão/coleta fornecendo um parâmetro MaxMappingByteCount na chamada para KsDeviceRegisterAdapterObject.

Se qualquer mapeamento de dispersão/coleta exceder esse tamanho máximo, o AVStream dividirá automaticamente o mapeamento em vários mapeamentos de dispersão/coleta, cada um deles não maior que o tamanho especificado em MaxMappingByteCount.

Você também deve fornecer uma rotina de retorno de chamada AVStrMiniPinProcess . O gravador de driver deve escolher a funcionalidade apropriada para esse retorno de chamada. Como um exemplo, você pode fazer o seguinte:

  1. Chame KsPinGetLeadingEdgeStreamPointer.

  2. Clone a borda à esquerda chamando KsStreamPointerClone.

  3. Programar hardware de DMA com base no clone.

  4. Chame KsStreamPointerAdvanceOffsets ou KsStreamPointerAdvance para avançar a borda à esquerda.

  5. Repita da etapa 2 conforme necessário para quadros adicionais.

Quando o hardware interrompe a conclusão do DMA, o kernel chama o ISR que o fornecedor registrou anteriormente. No ISR, o minidriver enfileira uma DPC (chamada de procedimento adiado).

Seu DPC deve atualizar DataUsed e possivelmente outros membros da estrutura KSSTREAM_HEADER . Em seguida, o DPC pode chamar KsStreamPointerDelete para excluir o clone e liberar o quadro associado.

Como alternativa, o DPC poderá avançar o ponteiro de clone se apenas parte do quadro for concluída. Para fazer isso, chame KsStreamPointerAdvanceOffsets.

Se necessário para retomar o processamento, chame KsPinAttemptProcessing.

Observação

Se um mapeamento tiver menos de uma página física, não há garantia de que resida em uma única página física.