Condividi tramite


Supporto di System-Mode DMA

[Si applica solo a KMDF]

DMA in modalità sistema, a differenza di DMA master del bus , descrive una configurazione in cui più dispositivi condividono un singolo controller DMA multicanale.

A partire da Kernel-Mode Driver Framework (KMDF) versione 1.11, il framework supporta DMA in modalità sistema in sistemi basati su chip (SoC) in esecuzione su Windows 8 o versioni successive del sistema operativo Windows.

Questo argomento descrive il codice che un driver KMDF deve fornire nelle funzioni di callback degli eventi, nonché nelle funzioni di callback di eventi facoltative che può registrare, per gestire le richieste di I/O per un dispositivo DMA in modalità sistema.

Per informazioni su KMDF e DMA master del bus, vedere Gestione delle richieste di I/O in un driver KMDF per un dispositivo DMA Bus-Master.

La figura seguente mostra le funzioni di callback degli eventi usate dal driver per supportare DMA in modalità sistema:

Diagramma di flusso che mostra le funzioni di callback degli eventi per l'implementazione DMA in modalità sistema nei driver KMDF.

Creazione di un enabler DMA System-Mode

La creazione di un profilo DMA in modalità sistema è un processo in due passaggi. I passaggi seguenti rappresentano uno scenario tipico:

  1. In genere, nella funzione di callback EvtDriverDeviceAdd , il driver chiama WDF_DMA_ENABLER_CONFIG_INIT, impostando il parametro Profile su SystemMode o SystemModeDuplex. Il driver chiama quindi WdfDmaEnablerCreate, passando la struttura WDF_DMA_ENABLER_CONFIG appena ricevuta.

    Il driver potrebbe in alternativa creare l'abilitazione durante EvtDevicePrepareHardware.

  2. La funzione di callback EvtDevicePrepareHardware del driver associa l'abilitatore DMA alle risorse DMA chiamando il metodo WdfDmaEnablerConfigureSystemProfile . Per un abilitatore duplex, il driver chiama WdfDmaEnablerConfigureSystemProfile due volte, una volta per configurare ogni direzione di trasferimento.

    Il driver può chiamare WdfDmaEnablerConfigureSystemProfile dopo il completamento di EvtDevicePrepareHardware , ma il driver deve chiamare questo metodo prima di inizializzare le transazioni DMA.

Fornitura di funzioni di callback facoltative

In genere, i driver KMDF non configurano i canali DMA. Tuttavia, in determinate circostanze, i driver potrebbero dover eseguire una configurazione specifica del canale. Ad esempio, un driver potrebbe chiamare una funzione personalizzata implementata dal controller DMA attenendosi alla procedura seguente:

  1. In uno dei gestori di richieste del driver il driver chiama WdfDmaTransactionSetChannelConfigurationCallback per registrare una funzione di callback EvtDmaTransactionConfigureDmaChannel .
  2. La funzione di callback EvtDmaTransactionConfigureDmaChannel del driver chiama WdfDmaEnablerWdmGetDmaAdapter per recuperare un puntatore al DMA_ADAPTER WDM. Questa struttura è l'oggetto adapter che rappresenta il canale DMA in modalità sistema del driver.
  3. Il driver può quindi chiamare ConfigureAdapterChannel per abilitare le funzioni personalizzate implementate dal controller DMA. Questa routine è chiamabile solo dal puntatore dall'indirizzo restituito in una struttura di DMA_OPERATIONS .
  4. La funzione di callback EvtDmaTransactionConfigureDmaChannel del driver restituisce TRUE se configura correttamente il canale DMA.
  5. Il framework chiama la funzione di callback EvtProgramDma del driver.

Ricezione della notifica del completamento del trasferimento

A differenza dei dispositivi che usano controller di mastering del bus, l'hardware per un dispositivo DMA in modalità sistema potrebbe non segnalare il completamento del trasferimento DMA eseguendo un interrupt.

Se il dispositivo non genera un interrupt per segnalare il completamento del trasferimento DMA, il driver può fornire una funzione di callback dell'evento EvtDmaTransactionDmaTransferComplete che il framework chiama al termine del trasferimento DMA in modalità sistema.

Per registrare questa funzione di callback, un driver chiama WdfDmaTransactionSetTransferCompleteCallback da uno dei gestori di richiesta.