Compartilhar via


DMA de suporte System-Mode

[Aplica-se somente ao KMDF]

O DMA do modo sistema, ao contrário do DMA master de barramento, descreve uma configuração na qual vários dispositivos compartilham um único controlador de DMA multicanal.

A partir do KMDF (Kernel-Mode Driver Framework) 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 Windows.

Este tópico descreve o código que um driver KMDF deve fornecer em suas funções de retorno de chamada de evento, bem como funções opcionais de retorno de chamada de evento que ele pode registrar, para lidar com solicitações de E/S para um dispositivo DMA no modo sistema.

Para obter informações sobre KMDF e DMA de master de barramento, consulte Manipulando solicitações de E/S em um driver KMDF para um dispositivo DMA Bus-Master.

A figura a seguir mostra as funções de retorno de chamada de evento que o driver usa para dar suporte ao DMA do modo sistema:

Fluxograma mostrando funções de retorno de chamada de evento para implementação de DMA no modo do sistema em drivers KMDF.

Criando um habilitador de DMA System-Mode

A criação de um perfil de DMA no modo de sistema é um processo de duas etapas. As seguintes etapas representam um cenário típico:

  1. Normalmente em sua função de retorno de chamada EvtDriverDeviceAdd , o driver chama WDF_DMA_ENABLER_CONFIG_INIT, definindo o parâmetro Profile como SystemMode ou SystemModeDuplex. Em seguida, o driver chama WdfDmaEnablerCreate, passando a estrutura WDF_DMA_ENABLER_CONFIG que ele acabou de receber.

    O driver pode, como alternativa, criar o habilitador durante EvtDevicePrepareHardware.

  2. A função de retorno de chamada EvtDevicePrepareHardware do driver associa o habilitador de DMA aos recursos de DMA chamando o método WdfDmaEnablerConfigureSystemProfile . Para um habilitador duplex, o driver chama WdfDmaEnablerConfigureSystemProfile duas vezes, uma vez para configurar cada direção de transferência.

    O driver pode chamar WdfDmaEnablerConfigureSystemProfile depois que EvtDevicePrepareHardware for concluído, mas o driver deve chamar esse método antes de inicializar as transações de DMA.

Fornecendo funções opcionais de retorno de chamada

Normalmente, os drivers KMDF não configuram canais de DMA. No entanto, em determinadas circunstâncias, os drivers podem precisar executar a configuração específica do canal. Por exemplo, um driver pode chamar uma função personalizada implementada pelo controlador de DMA usando as seguintes etapas:

  1. Em um dos manipuladores de solicitação do driver, o driver chama wdfDmaTransactionSetChannelConfigurationCallback para registrar uma função de retorno de chamada EvtDmaTransactionConfigureDmaChannel .
  2. A função de retorno de chamada EvtDmaTransactionConfigureDmaChannel do driver chama WdfDmaEnablerWdmGetDmaAdapter para recuperar um ponteiro para o WDM DMA_ADAPTER. Essa estrutura é o objeto do adaptador que representa o canal DMA do modo de sistema do driver.
  3. Em seguida, o driver pode chamar ConfigureAdapterChannel para habilitar funções personalizadas implementadas pelo controlador de DMA. Essa rotina pode ser chamada somente por ponteiro do endereço retornado em uma estrutura de DMA_OPERATIONS .
  4. A função de retorno de chamada EvtDmaTransactionConfigureDmaChannel do driver retornará TRUE se configurar com êxito o canal DMA.
  5. A estrutura chama a função de retorno de chamada EvtProgramDma do driver.

Receber notificação de conclusão da transferência

Ao contrário dos dispositivos que usam controladores de masterização de barramento, o hardware para um dispositivo DMA no modo de sistema pode não sinalizar a conclusão da transferência de DMA emitindo uma interrupção.

Se o dispositivo não gerar uma interrupção para sinalizar a conclusão da transferência de DMA, o driver poderá fornecer uma função de retorno de chamada de evento EvtDmaTransactionDmaTransferComplete que a estrutura chama quando uma transferência de DMA no modo do sistema for concluída.

Para registrar essa função de retorno de chamada, um driver chama WdfDmaTransactionSetTransferCompleteCallback de um de seus manipuladores de solicitação.