Criando e inicializando uma transação de DMA

[Aplica-se somente ao KMDF]

Antes que o driver possa enviar uma solicitação de E/S para um dispositivo DMA, o driver deve:

  1. Chame WdfDmaTransactionCreate para criar um objeto de transação DMA para a solicitação.

  2. Chame WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize ou WdfDmaTransactionInitializeUsingOffset para inicializar o objeto de transação.

Normalmente, o driver cria uma transação de DMA porque um manipulador de solicitação recebeu um objeto de solicitação de estrutura e deve passar a solicitação para o hardware. Nesse caso, o driver deve chamar WdfDmaTransactionInitializeUsingRequest, que aceita um identificador de objeto de solicitação como entrada e extrai os parâmetros de endereço da solicitação do objeto de solicitação.

Se o driver precisar criar uma transação de DMA que não se baseie em um objeto de solicitação de estrutura que o driver recebeu, o driver poderá chamar WdfDmaTransactionInitialize ou WdfDmaTransactionInitializeUsingOffset. Ambos os métodos aceitam parâmetros de endereço que o driver fornece.

Todos os três métodos de inicialização exigem o endereço de uma função de retorno de chamada de evento EvtProgramDma como um parâmetro de entrada. Essa função de retorno de chamada programa o dispositivo e a estrutura chama a função de retorno de chamada sempre que uma transferência de DMA está disponível.

Quando o driver chama WdfDmaEnablerCreate para criar um objeto habilitador de DMA, o driver fornece uma estrutura de WDF_DMA_ENABLER_CONFIG que contém o comprimento máximo de transferência do dispositivo. A estrutura usa esse valor como o comprimento máximo padrão para todas as transferências de DMA.

Para alguns tipos de transações de DMA, talvez seja necessário especificar um comprimento máximo de transferência diferente do comprimento máximo padrão do dispositivo. Você pode usar WdfDmaTransactionSetMaximumLength para definir um comprimento máximo de transferência para uma transação individual. A estrutura usa o comprimento máximo de transferência especificado somente enquanto processa a transação especificada.

Observe que o comprimento máximo de transferência é limitado pelo número de registros de mapa que o sistema operacional disponibiliza para o objeto habilitador de DMA. Para determinar o comprimento máximo de transferência disponível, o driver pode chamar WdfDmaEnablerGetFragmentLength. Se o valor retornado por WdfDmaEnablerGetFragmentLength for menor que o comprimento máximo de transferência que o driver forneceu a WdfDmaEnablerCreate, a estrutura usará o valor menor.

Depois que o driver cria e inicializa uma transação de DMA, o driver deve iniciar a transação.