Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
A Microsoft dá suporte a um ambiente diversificado 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 ela 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 em benefício dos drivers de miniporto WaveCyclic e WavePci. O IDmaChannel representa um canal DMA mais seus parâmetros de buffer de DMA e de uso de buffer associados. Além disso, os drivers de miniporto 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 de 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 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 miniporto 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 miniporto especifica 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 funcionalidades internas de hardware DMA e deve contar com o controlador DMA do sistema para executar as transferências de dados necessárias pelo dispositivo.
Um dispositivo mestre usa seu próprio hardware de DMA com controle direto do 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 de DMA mestre é pouco mais do que uma plataforma para compartilhar informações sobre o canal DMA entre os drivers de porta e miniporto. Para obter mais informações sobre dispositivos mestres e subordinados, consulte Introdução aos Objetos do Adaptador.
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 do adaptador é uma estrutura de adaptador DMA para um objeto de dispositivo físico (PDO). O objeto do adaptador é criado automaticamente quando o driver de miniporto 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 do adaptador fornece alguns métodos para manipular e consultar o dispositivo DMA. Nenhum desses métodos é significativo para canais mestres de DMA.
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 tem a garantia de estar 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 de DMA durante a inicialização do driver de miniporto quando a memória fisicamente contígua é mais abundante. IDmaChannel::AllocatedBufferSize retorna o tamanho do buffer conforme foi especificado na chamada para IDmaChannel::AllocateBuffer.
IDmaChannel::MaximumBufferSize indica o tamanho máximo real do buffer que pode ser usado. Isso poderá exceder o tamanho alocado se o tamanho alocado não for um múltiplo do tamanho da página. Pode ser menor que o tamanho alocado se o dispositivo DMA não puder dar 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 de 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 miniporto têm a oportunidade de alterar o tamanho do buffer ou descobrir seu valor atual. O driver de miniporto usa o resultado de IDmaChannel::BufferSize para determinar o tamanho da transferência para operações de 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 de DMA. O driver de porta WaveCyclic chama esses métodos para transferir dados de áudio entre o buffer do aplicativo e o buffer cíclico do driver de miniport.
O buffer de 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 do) driver de miniporto como uma lista de mapeamentos de dispersão/coleta. No entanto, o driver de miniporto ainda pode usar o buffer de DMA como um espaço de memória compartilhado para se comunicar com o driver do adaptador.
Os drivers de porta fornecem aos drivers de miniporto 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 dá suporte aos métodos necessários. Verifique a documentação de cada driver de porta para obter uma lista dos métodos de canal DMA exigidos pelo driver de porta.
Normalmente, a abordagem mais fácil é usar as funções de alocação de canal DMA que o driver de porta implementa. Em instâncias raras, os desenvolvedores de drivers de miniport podem precisar implementar seus próprios objetos de canal de DMA para atender aos requisitos especiais de seus adaptadores. Às vezes, isso requer a implementação de um novo objeto. Em outras ocasiões, basta que o objeto de fluxo do driver de miniporto exponha uma interface IDmaChannel e implemente ele mesmo os métodos de canal DMA.
A interface IDmaChannel dá suporte aos seguintes métodos:
IDmaChannel::AllocatedBufferSize
IDmaChannel::MaximumBufferSize
A interface IDmaChannelSlave estende o IDmaChannel adicionando os seguintes métodos: