Objetos de canal DMA

Observação

A Microsoft oferece suporte a um ambiente diverso e inclusivo. Este artigo contém referências à terminologia que o guia de estilo da Microsoft para comunicação sem preconceitos reconhece como excludente. A palavra ou frase é usada neste artigo para consistência porque aparece atualmente no software. Quando o software for atualizado para remover o idioma, este artigo será atualizado para estar alinhado.

O driver do sistema PortCls implementa as interfaces IDmaChannel e IDmaChannelSlave para o benefício dos drivers de miniporta WaveCyclic e WavePci. IDmaChannel representa um canal DMA mais seus parâmetros associados de buffer e uso de buffer. Além disso, os drivers de miniporta WaveCyclic usam IDmaChannelSlave para gerenciar um canal DMA para um dispositivo subordinado. IDmaChannelSlave herda de IDmaChannel. Para obter informações sobre como controlar operações DMA, consulte Objetos de adaptador e DMA.

Um objeto IDmaChannel encapsula o seguinte:

  • Um canal DMA para um dispositivo mestre ou subordinado

  • O buffer de dados associado ao canal

  • Informações que descrevem como o canal deve ser usado

Os drivers de porta e miniporta usam objetos de canal DMA para comunicar informações sobre o uso do canal DMA. Normalmente, um driver de miniporta aloca um conjunto de canais DMA durante a inicialização ou durante a criação de um fluxo. Durante a criação de um novo fluxo, o driver de miniporta informa ao driver de porta qual objeto de canal DMA será usado para o fluxo.

Um objeto de canal DMA pode ser criado para um dispositivo mestre ou subordinado:

  • Um dispositivo subordinado não tem recursos internos de hardware DMA e deve confiar no controlador DMA do sistema para executar quaisquer transferências de dados que o dispositivo exija.

  • Um dispositivo mestre usa seu próprio hardware DMA de bus-mastering para executar transferências de dados no barramento do sistema.

Para obter um exemplo de um dispositivo WaveCyclic que usa um objeto de canal DMA subordinado, consulte o driver de áudio de exemplo Sb16 em versões anteriores do Microsoft Windows Driver Kit (WDK). Um objeto de canal DMA mestre é pouco mais do que um backboard para compartilhar informações sobre o canal DMA entre os drivers de porta e miniporta. Para obter mais informações sobre dispositivos mestre e subordinado, consulte Introdução aos objetos adaptadores.

O objeto de canal DMA para um dispositivo mestre ou subordinado expõe o seguinte:

  • O objeto do adaptador

  • Um único buffer comum que o driver e o hardware DMA podem compartilhar

  • Um valor de tamanho de buffer que pode ser consultado e alterado

O objeto adaptador é uma estrutura de adaptador DMA para um objeto de dispositivo físico (PDO). O objeto adaptador é criado automaticamente quando o driver de miniporta cria o objeto de canal DMA chamando um dos seguintes métodos:

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

O método IDmaChannel::GetAdapterObject pode ser usado para obter um ponteiro para o objeto adaptador.

Um driver de adaptador também pode chamar a função PcNewDmaChannel para criar um objeto de canal DMA, mas essa função é mais difícil de usar do que as chamadas IPortWaveXxx::NewXxxDmaChannel porque o chamador deve especificar explicitamente um objeto de dispositivo e outras informações contextuais.

No caso de um canal DMA para um dispositivo subordinado, o método IDmaChannel::TransferCount retorna o tamanho máximo de transferência (o parâmetro MapSize) que foi especificado na chamada para IDmaChannelSlave::Start. Além disso, o objeto adaptador fornece alguns métodos para manipular e consultar o dispositivo DMA. Nenhum desses métodos é significativo para canais DMA mestres.

IDmaChannel::AllocateBuffer e IDmaChannel::FreeBuffer são usados para gerenciar o único buffer comum associado ao objeto de canal DMA. O buffer alocado pelo objeto é garantido para ser acessível ao driver (com endereços de memória virtual do kernel) e ao dispositivo DMA (com endereços de memória física). Além disso, o buffer será fisicamente contíguo. Normalmente, a melhor estratégia é alocar o buffer DMA durante a inicialização do driver de miniporta, quando a memória fisicamente contígua é mais abundante. IDmaChannel::AllocatedBufferSize retorna o tamanho do buffer como foi especificado na chamada para IDmaChannel::AllocateBuffer.

IDmaChannel::MaximumBufferSize indica o tamanho máximo real do buffer que pode ser usado. Isso pode exceder o tamanho alocado se o tamanho alocado não for um múltiplo par do tamanho da página. Pode ser menor do que o tamanho alocado se o dispositivo DMA não puder oferecer suporte a transferências do tamanho alocado. IDmaChannel::BufferSize e IDmaChannel::SetBufferSize são usados para consultar e definir o tamanho do buffer a ser usado para transferências DMA. Quando o buffer é alocado, o tamanho do buffer é definido como o tamanho máximo do buffer. Após a inicialização, o driver de porta e o driver de miniporta têm a oportunidade de alterar o tamanho do buffer ou descobrir seu valor atual. O driver de miniporta usa o resultado de IDmaChannel::BufferSize para determinar o tamanho da transferência para operações DMA quando o canal DMA é iniciado. IDmaChannel::SystemAddress e IDmaChannel::P hysicalAddress são usados para obter os endereços virtuais e físicos do buffer, respectivamente.

IDmaChannel::CopyTo e IDmaChannel::CopyFrom copiam dados de exemplo de e para o buffer DMA. O driver de porta WaveCyclic chama esses métodos para copiar dados de áudio entre o buffer do aplicativo e o buffer cíclico do driver de miniporta.

O buffer DMA não é necessariamente usado para transferir os dados transmitidos. No caso do driver de porta WavePci, os dados transmitidos são entregues (ou recuperados de) o driver de miniporta como uma lista de mapeamentos de dispersão/coleta. No entanto, o driver de miniporta ainda pode fazer uso do buffer DMA como um espaço de memória compartilhada para se comunicar com o driver do adaptador.

Os drivers de porta fornecem drivers de miniporta com funções que eles podem usar para criar canais DMA. Salvo indicação em contrário na descrição do driver de porta, não é absolutamente necessário usar objetos DMA alocados a partir do driver de porta. O driver de porta simplesmente requer um ponteiro para uma interface IDmaChannel que suporta os métodos necessários. Verifique a documentação de cada driver de porta para obter uma lista dos métodos de canal DMA que o driver de porta requer.

Normalmente, a abordagem mais fácil é usar as funções de alocação de canal DMA que o driver de porta implementa. Em casos raros, os desenvolvedores de drivers de miniporta podem precisar implementar seus próprios objetos de canal DMA para atender aos requisitos especiais de seus adaptadores específicos. Isso às vezes requer a implementação de um novo objeto. Em outros momentos, é suficiente que o objeto de fluxo do driver de miniporta exponha uma interface IDmaChannel e implemente os próprios métodos de canal DMA.

A interface IDmaChannel suporta os seguintes métodos:

IDmaChannel::AllocateBuffer

IDmaChannel::AllocatedBufferSize

IDmaChannel::BufferSize

IDmaChannel::CopyFrom

IDmaChannel::CopyTo

IDmaChannel::FreeBuffer

IDmaChannel::GetAdapterObject

IDmaChannel::MaximumBufferSize

IDmaChannel::P hysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

A interface IDmaChannelSlave estende IDmaChannel adicionando os seguintes métodos:

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Iniciar

IDmaChannelSlave::Parar

IDmaChannelSlave::WaitForTC