Partilhar via


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 é atualizado para remover o idioma, este artigo será atualizado para estar alinhado.

O driver de 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 seu buffer DMA associado e parâmetros de 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 do adaptador e DMA.

Um objeto IDmaChannel encapsula o seguinte:

  • Um canal DMA para um dispositivo mestre ou subordinado

  • O buffer de dados que está associado com o 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 masterização de barramento 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 do adaptador.

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

  • Um objeto 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 DMA-adaptador para um objeto de dispositivo físico (DOP). 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 do 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 ) 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 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 conforme 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 pode suportar 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 de 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 da aplicação 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 comunicação com o driver do adaptador.

Os drivers de porta fornecem aos drivers de miniporta funções que eles podem usar para criar canais DMA. A menos que indicado de outra forma na descrição do driver de porta, não é absolutamente necessário usar objetos DMA alocados do driver de porta. O driver de porta simplesmente requer um ponteiro para uma interface IDmaChannel que suporte 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 outras ocasiões, é suficiente que o objeto de fluxo do driver de miniporta exponha uma interface IDmaChannel e implemente os métodos do próprio 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::PhysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

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

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Iniciar

IDmaChannelSlave::Parar

IDmaChannelSlave::WaitForTC