Habilitando transações de DMA

[Aplica-se somente ao KMDF]

Se o driver baseado em estrutura lidar com operações de E/S para dispositivos DMA, o driver deverá habilitar os recursos de DMA da estrutura para cada dispositivo DMA. Para habilitar esses recursos, a função de retorno de chamada EvtDriverDeviceAdd ou EvtDevicePrepareHardware do driver deve:

  1. Chame WdfDeviceSetAlignmentRequirement para especificar o requisito do dispositivo para o alinhamento do buffer.

  2. Chame WdfDmaEnablerCreate para especificar o tipo de operações de DMA (pacote único ou dispersão/coleta) e o tamanho máximo de transferência compatível com o dispositivo. A partir do KMDF versão 1.11, a estrutura dá suporte ao DMA do modo sistema em sistemas baseados em SoC (System on a Chip) em execução em Windows 8 ou versões posteriores do sistema operacional.

  3. Chame WdfDmaEnablerSetMaximumScatterGatherElements para especificar o número máximo de elementos que o dispositivo pode dar suporte em uma lista de dispersão/coleta, se o dispositivo der suporte a operações de dispersão/coleta.

O exemplo de código a seguir do exemplo PLX9x5x ilustra como habilitar os recursos de DMA da estrutura. Esse código aparece no arquivo Init.c.

WDF_DMA_ENABLER_CONFIG   dmaConfig;

WdfDeviceSetAlignmentRequirement( DevExt->Device, PCI9656_DTE_ALIGNMENT_16 );
WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
                             WdfDmaProfileScatterGather64Duplex,
                             DevExt->MaximumTransferLength );
status = WdfDmaEnablerCreate( DevExt->Device,
                              &dmaConfig, 
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &DevExt->DmaEnabler );

Se o driver exigir buffers comuns, a função de retorno de chamada EvtDriverDeviceAdd do driver normalmente os configura. Para obter mais informações sobre esses buffers, consulte Usando buffers comuns.

Depois que um driver tiver chamado WdfDmaEnablerCreate, ele poderá chamar WdfDmaEnablerWdmGetDmaAdapter para obter ponteiros para o WDM DMA_ADAPTER estruturas que a estrutura cria para as direções de entrada e saída do dispositivo. No entanto, a maioria dos drivers baseados em estrutura não precisa acessar essas estruturas.