Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
[Si applica solo a KMDF]
DMA in modalità di sistema, a differenza del DMA master del bus , descrive una configurazione in cui più dispositivi condividono un singolo controller DMA, tipicamente 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 in Windows 8 o versioni successive del sistema operativo Windows.
In questo argomento viene descritto 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 su 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:
Creazione di un Attivatore DMA System-Mode
La creazione di un profilo DMA in modalità sistema è un processo in due passaggi. I passaggi seguenti rappresentano uno scenario tipico:
In genere nella funzione di callback EvtDriverDeviceAdd, il driver chiama WDF_DMA_ENABLER_CONFIG_INIT, impostando il parametro Profilo 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.
Il driver associa la funzione di callback EvtDevicePrepareHardware all'enabler DMA con le sue risorse DMA chiamando il metodo WdfDmaEnablerConfigureSystemProfile. Per un abilitatore duplex, il driver chiama due volte WdfDmaEnablerConfigureSystemProfile, una per ciascuna direzione di trasferimento.
Il driver può chiamare WdfDmaEnablerConfigureSystemProfile dopo che EvtDevicePrepareHardware è stato completato, ma deve chiamare questo metodo prima di inizializzare le transazioni DMA.
Fornire funzioni di callback facoltative
In genere, i driver KMDF non configurano i canali DMA. In determinate circostanze, tuttavia, potrebbe essere necessario che i driver eseguano una configurazione specifica del canale. Ad esempio, un driver potrebbe chiamare una funzione personalizzata implementata dal controller DMA attenendosi alla procedura seguente:
- In uno dei gestori di richieste del driver, il driver chiama WdfDmaTransactionSetChannelConfigurationCallback per registrare una funzione di callback EvtDmaTransactionConfigureDmaChannel.
- Il driver EvtDmaTransactionConfigureDmaChannel la funzione di callback WdfDmaEnablerWdmGetDmaAdapter per recuperare un puntatore al WDM DMA_ADAPTER. Questa struttura è l'oggetto adapter che rappresenta il canale DMA in modalità di sistema del driver.
- Il driver può quindi chiamare ConfigureAdapterChannel per abilitare le funzioni personalizzate implementate dal controller DMA. Questa routine è invocabile solo attraverso un puntatore dall'indirizzo restituito in una struttura di DMA_OPERATIONS.
- La funzione di callback EvtDmaTransactionConfigureDmaChannel del tuo driver restituisce TRUE se lo configura con successo il canale DMA.
- Il framework chiama la funzione di callback EvtProgramDma del driver.
Ricezione della notifica di completamento del trasferimento
A differenza dei dispositivi che usano controllori master del bus, l'hardware per un dispositivo DMA in modalità sistema potrebbe non indicare il completamento del trasferimento DMA emettendo un interrupt.
Se il dispositivo non genera un interrupt per segnalare il completamento del trasferimento DMA, il driver può fornire una funzione di callback degli eventi EvtDmaTransactionDmaTransferComplete che il framework chiama quando un trasferimento DMA in modalità sistema è stato completato.
Per registrare questa funzione di callback, un driver chiama WdfDmaTransactionSetTransferCompleteCallback da uno dei relativi gestori di richieste .