Abilitazione delle transazioni DMA

[Si applica solo a KMDF]

Se il driver basato su framework gestisce le operazioni di I/O per i dispositivi DMA, il driver deve abilitare le funzionalità DMA del framework per ogni dispositivo DMA. Per abilitare queste funzionalità, la funzione di callback evtDriverDeviceAdd o EvtDevicePrepareHardware deve:

  1. Chiamare WdfDeviceSetAlignmentRequirement per specificare il requisito del dispositivo per l'allineamento del buffer.

  2. Chiamare WdfDmaEnablerCrea per specificare il tipo di operazioni DMA (singolo pacchetto o dispersione/raccolta) e le dimensioni massime di trasferimento supportate dal dispositivo. A partire da KMDF versione 1.11, il framework supporta DMA in modalità sistema in sistemi in un chip (SoC) in esecuzione in Windows 8 o versioni successive del sistema operativo.

  3. Chiamare WdfDmaEnablerSetMaximumScatterGatherElements per specificare il numero massimo di elementi che il dispositivo può supportare in un elenco di dispersione/raccolta, se il dispositivo supporta operazioni di dispersione/raccolta.

L'esempio di codice seguente dell'esempio PLX9x5x5x illustra come abilitare le funzionalità DMA del framework. Questo codice viene visualizzato nel file 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 il driver richiede buffer comuni, la funzione evtDriverDeviceAggiungi il callback viene in genere impostata. Per altre informazioni su questi buffer, vedere Uso di buffer comuni.

Dopo che un driver ha chiamato WdfDmaEnablerCreate, può chiamare WdfDmaEnablerWdmGetDmaAdapter per ottenere puntatori a strutture WDM DMA_ADAPTER create dal framework per le direzioni di input e output del dispositivo. Tuttavia, la maggior parte dei driver basati su framework non deve accedere a queste strutture.