Compatibilidad con DMA de System-Mode

[Solo se aplica a KMDF]

DMA en modo sistema, a diferencia de DMA de bus-master , describe una configuración en la que varios dispositivos comparten un único controlador DMA multicanal.

A partir de Kernel-Mode Driver Framework (KMDF) versión 1.11, el marco admite DMA en modo sistema en sistemas basados en chip (SoC) que se ejecutan en Windows 8 o versiones posteriores del sistema operativo Windows.

En este tema se describe el código que un controlador KMDF debe proporcionar en sus funciones de devolución de llamada de eventos, así como funciones opcionales de devolución de llamada de eventos que puede registrar, para controlar las solicitudes de E/S de un dispositivo DMA en modo sistema.

Para obtener información sobre KMDF y DMA maestro de bus, consulte Control de solicitudes de E/S en un controlador KMDF para un dispositivo DMA de Bus-Master.

En la ilustración siguiente se muestran las funciones de devolución de llamada de eventos que usa el controlador para admitir DMA en modo sistema:

Diagrama de flujo en el que se muestran las funciones de devolución de llamada de eventos para la implementación de DMA en modo del sistema en controladores kmdf.

Creación de un habilitador de DMA de System-Mode

La creación de un perfil de DMA en modo sistema es un proceso de dos pasos. Los pasos siguientes representan un escenario típico:

  1. Normalmente, en su función de devolución de llamada EvtDriverDeviceAdd , el controlador llama a WDF_DMA_ENABLER_CONFIG_INIT, estableciendo el parámetro Profile en SystemMode o SystemModeDuplex. A continuación, el controlador llama a WdfDmaEnablerCreate y pasa la estructura de WDF_DMA_ENABLER_CONFIG que acaba de recibir.

    El controlador podría crear el habilitador durante EvtDevicePrepareHardware.

  2. La función de devolución de llamada EvtDevicePrepareHardware del controlador asocia el habilitador DMA con sus recursos de DMA llamando al método WdfDmaEnablerConfigureSystemProfile . Para un habilitador dúplex, el controlador llama a WdfDmaEnablerConfigureSystemProfile dos veces, una vez para configurar cada dirección de transferencia.

    El controlador puede llamar a WdfDmaEnablerConfigureSystemProfile después de que EvtDevicePrepareHardware se haya completado, pero el controlador debe llamar a este método antes de inicializar las transacciones DMA.

Proporcionar funciones de devolución de llamada opcionales

Normalmente, los controladores KMDF no configuran canales DMA. Sin embargo, en determinadas circunstancias, es posible que los controladores necesiten realizar una configuración específica del canal. Por ejemplo, un controlador podría llamar a una función personalizada implementada por el controlador DMA mediante los pasos siguientes:

  1. En uno de los controladores de solicitud del controlador, el controlador llama a WdfDmaTransactionSetChannelConfigurationCallback para registrar una función de devolución de llamada EvtDmaTransactionConfigureDmaChannel .
  2. La función de devolución de llamada EvtDmaTransactionConfigureDmaChannel del controlador llama a WdfDmaEnablerWdmGetDmaAdapter para recuperar un puntero al DMA_ADAPTER WDM. Esta estructura es el objeto de adaptador que representa el canal DMA del modo del sistema del controlador.
  3. A continuación, el controlador puede llamar a ConfigureAdapterChannel para habilitar las funciones personalizadas implementadas por el controlador DMA. Esta rutina solo es invocable por puntero de la dirección devuelta en una estructura de DMA_OPERATIONS .
  4. La función de devolución de llamada EvtDmaTransactionConfigureDmaChannel del controlador devuelve TRUE si configura correctamente el canal DMA.
  5. El marco llama a la función de devolución de llamada EvtProgramDma del controlador.

Recepción de la notificación de finalización de transferencia

A diferencia de los dispositivos que usan controladores de maestro de bus, es posible que el hardware de un dispositivo DMA en modo sistema no señale la finalización de la transferencia de DMA mediante la emisión de una interrupción.

Si el dispositivo no genera una interrupción para indicar la finalización de la transferencia de DMA, el controlador puede proporcionar una función de devolución de llamada de evento EvtDmaTransactionDmaTransferComplete a la que el marco llama cuando se ha completado una transferencia DMA en modo sistema.

Para registrar esta función de devolución de llamada, un controlador llama a WdfDmaTransactionSetTransferCompleteCallback desde uno de sus controladores de solicitud.