Habilitación de transacciones de DMA

[Solo se aplica a KMDF]

Si el controlador basado en marcos controla las operaciones de E/S para dispositivos DMA, el controlador debe habilitar las características de DMA del marco para cada dispositivo DMA. Para habilitar estas características, la función de devolución de llamada EvtDriverDeviceAdd o EvtDevicePrepareHardware del controlador debe:

  1. Llame a WdfDeviceSetAlignmentRequirement para especificar el requisito del dispositivo para la alineación del búfer.

  2. Llame a WdfDmaEnablerCreate para especificar el tipo de operaciones DMA (paquete único o dispersión/recopilación) y el tamaño máximo de transferencia que admite el dispositivo. A partir de la versión 1.11 de KMDF, el marco admite DMA en modo del sistema en sistemas basados en chip (SoC) que se ejecutan en Windows 8 o versiones posteriores del sistema operativo.

  3. Llame a WdfDmaEnablerSetMaximumScatterGatherElements para especificar el número máximo de elementos que el dispositivo puede admitir en una lista de dispersión y recopilación, si el dispositivo admite operaciones de dispersión y recopilación.

En el ejemplo de código siguiente del ejemplo PLX9x5x se muestra cómo habilitar las características DMA del marco. Este código aparece en el archivo 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 );

Si el controlador requiere búferes comunes, la función de devolución de llamada EvtDriverDeviceAdd del controlador normalmente las configura. Para obtener más información sobre estos búferes, consulte Uso de búferes comunes.

Después de llamar a un controlador WdfDmaEnablerCreate, puede llamar a WdfDmaEnablerWdmGetDmaAdapter para obtener punteros a las estructuras de DMA_ADAPTER WDM que crea el marco para las direcciones de entrada y salida del dispositivo. Sin embargo, la mayoría de los controladores basados en marcos no necesitan acceder a estas estructuras.