Creazione e inizializzazione di una transazione DMA

[Si applica solo a KMDF]

Prima che il driver possa inviare una richiesta di I/O a un dispositivo DMA, il driver deve:

  1. Chiamare WdfDmaTransactionCrea per creare un oggetto transazione DMA per la richiesta.

  2. Chiamare WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize o WdfDmaTransactionInitializeUsingOffset per inizializzare l'oggetto transazioni.

In genere, il driver crea una transazione DMA perché un gestore di richieste ha ricevuto un oggetto richiesta framework e deve passare la richiesta all'hardware. In questo caso, il driver deve chiamare WdfDmaTransactionInitializeUsingRequest, che accetta un handle dell'oggetto richiesta come input ed estrae i parametri di indirizzo della richiesta dall'oggetto request.

Se il driver deve creare una transazione DMA non basata su un oggetto richiesta framework ricevuto dal driver, il driver può chiamare WdfDmaTransactionInitialize o WdfDmaTransactionInitializeUsingOffset. Entrambi i metodi accettano parametri di indirizzo forniti dal driver.

Tutti e tre i metodi di inizializzazione richiedono l'indirizzo di una funzione di callback eventi EvtProgramDma come parametro di input. Questa funzione di callback programma il dispositivo e il framework chiama la funzione di callback ogni volta che è disponibile un trasferimento DMA .

Quando il driver chiama WdfDmaEnablerCrea per creare un oggetto abilitante DMA, il driver fornisce una struttura WDF_DMA_ENABLER_CONFIG che contiene la lunghezza massima di trasferimento del dispositivo. Il framework usa questo valore come lunghezza massima predefinita per tutti i trasferimenti DMA.

Per alcuni tipi di transazioni DMA, potrebbe essere necessario specificare una lunghezza massima di trasferimento diversa dalla lunghezza massima predefinita del dispositivo. È possibile usare WdfDmaTransactionSetMaximumLength per impostare una lunghezza massima di trasferimento per una singola transazione. Il framework usa solo la lunghezza massima di trasferimento specificata mentre elabora la transazione specificata.

Si noti che la lunghezza massima del trasferimento è limitata dal numero di registri mappa che il sistema operativo rende disponibile per l'oggetto enabler DMA. Per determinare la lunghezza massima del trasferimento disponibile, il driver può chiamare WdfDmaEnablerGetFragmentLength. Se il valore restituito da WdfDmaEnablerGetFragmentLength è minore della lunghezza massima di trasferimento fornita dal driver a WdfDmaEnablerCreate, il framework usa il valore più piccolo.

Dopo aver creato e inizializzato una transazione DMA, il driver deve avviare la transazione.