Condividi tramite


Oggetti canale DMA

Nota

Microsoft supporta un ambiente diversificato e inclusivo. Questo articolo contiene riferimenti alla terminologia riconosciuta dalla Guida di stile Microsoft per le comunicazioni senza pregiudizio come esclusioni. La parola o la frase viene usata in questo articolo per coerenza perché è attualmente presente nel software. Quando il software viene aggiornato per rimuovere la lingua, questo articolo verrà aggiornato per essere allineato.

Il driver di sistema PortCls implementa le interfacce IDmaChannel e IDmaChannelSlave a vantaggio dei driver WaveCyclic e WavePci miniport. IDmaChannel rappresenta un canale DMA più i parametri DMA buffer e di utilizzo del buffer associati. Inoltre, i driver miniport WaveCyclic usano IDmaChannelSlave per gestire un canale DMA per un dispositivo subordinato. IDmaChannelSlave eredita da IDmaChannel. Per informazioni sul controllo delle operazioni DMA, vedere Oggetti adapter e DMA.

Un oggetto IDmaChannel incapsula quanto segue:

  • Un canale DMA per un dispositivo master o subordinato

  • Buffer di dati associato al canale

  • Informazioni che descrivono come usare il canale

I driver porta e miniport usano oggetti canale DMA per comunicare informazioni sull'utilizzo del canale DMA. In genere, un driver miniport alloca un set di canali DMA durante l'inizializzazione o durante la creazione di un flusso. Durante la creazione di un nuovo flusso, il driver miniport indica al driver di porta quale oggetto canale DMA verrà usato per il flusso.

È possibile creare un oggetto canale DMA per un dispositivo master o subordinato:

  • Un dispositivo subordinato non dispone di funzionalità hardware DMA predefinite e deve basarsi sul controller DMA di sistema per eseguire eventuali trasferimenti di dati richiesti dal dispositivo.

  • Un dispositivo master usa il proprio hardware DMA di mastering bus per eseguire trasferimenti di dati sul bus di sistema.

Per un esempio di dispositivo WaveCyclic che usa un oggetto canale DMA subordinato, vedere il driver audio di esempio Sb16 nelle versioni precedenti di Microsoft Windows Driver Kit (WDK). Un oggetto canale DMA master è poco più di un backboard per condividere informazioni sul canale DMA tra i driver porta e miniport. Per altre informazioni sui dispositivi master e subordinati, vedere Introduzione agli oggetti adapter.

L'oggetto canale DMA per un dispositivo master o subordinato espone quanto segue:

  • Oggetto adapter

  • Un singolo buffer comune che il driver e l'hardware DMA possono condividere

  • Valore delle dimensioni del buffer su cui è possibile eseguire query e modificare

L'oggettoadapter è una struttura di adattatore DMA per un oggetto dispositivo fisico (PDO). L'oggetto adapter viene creato automaticamente quando il driver miniport crea l'oggetto canale DMA chiamando uno dei metodi seguenti:

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

Il metodo IDmaChannel::GetAdapterObject può essere usato per ottenere un puntatore all'oggetto adapter.

Un driver di adattatore può anche chiamare la funzione PcNewDmaChannel per creare un oggetto canale DMA, ma questa funzione è più difficile da usare rispetto alle chiamate IPortWaveXxx::NewXxxDmaChannel perché il chiamante deve specificare in modo esplicito un oggetto dispositivo e altre informazioni contestuali.

Nel caso di un canale DMA per un dispositivo subordinato, il metodo IDmaChannel::TransferCount restituisce la dimensione massima del trasferimento (il parametro MapSize ) specificata nella chiamata a IDmaChannelSlave::Start. Inoltre, l'oggetto adapter fornisce alcuni metodi per la modifica e l'esecuzione di query sul dispositivo DMA. Nessuno di questi metodi è significativo per i canali DMA master.

IDmaChannel::AllocateBuffer e IDmaChannel::FreeBuffer vengono usati per gestire il singolo buffer comune associato all'oggetto canale DMA. Il buffer allocato dall'oggetto è garantito che sia accessibile sia al driver (con indirizzi di memoria virtuale del kernel) che al dispositivo DMA (con indirizzi di memoria fisica). Inoltre, il buffer sarà fisicamente contiguo. In genere, la strategia migliore consiste nell'allocare il buffer DMA durante l'inizializzazione del driver miniport quando la memoria fisicamente contigua è più abbondante. IDmaChannel::AllocateBufferSize restituisce le dimensioni del buffer come specificato nella chiamata a IDmaChannel::AllocateBuffer.

IDmaChannel::MaximumBufferSize indica le dimensioni massime effettive del buffer che è possibile usare. Ciò potrebbe superare le dimensioni allocate se le dimensioni allocate non sono pari a più dimensioni della pagina. Potrebbe essere inferiore alla dimensione allocata se il dispositivo DMA non può supportare i trasferimenti delle dimensioni allocate. IDmaChannel::BufferSize e IDmaChannel::SetBufferSize vengono usati per eseguire query e impostare le dimensioni del buffer da usare per i trasferimenti DMA. Quando il buffer viene allocato, la dimensione del buffer viene impostata sulla dimensione massima del buffer. Dopo l'inizializzazione, sia il driver di porta che il driver miniport hanno la possibilità di modificare le dimensioni del buffer o di individuarne il valore corrente. Il driver miniport usa il risultato di IDmaChannel::BufferSize per determinare le dimensioni di trasferimento per le operazioni DMA all'avvio del canale DMA. IDmaChannel::SystemAddress e IDmaChannel::P hysicalAddress vengono usati rispettivamente per ottenere gli indirizzi virtuali e fisici del buffer.

IDmaChannel::CopyTo e IDmaChannel::CopyFrom copiano i dati di esempio da e verso il buffer DMA. Il driver di porta WaveCyclic chiama questi metodi per copiare i dati audio tra il buffer dell'applicazione e il buffer ciclico del driver miniport.

Il buffer DMA non viene necessariamente usato per trasferire i dati trasmessi. Nel caso del driver di porta WavePci, i dati trasmessi vengono recapitati o recuperati dal driver miniport come elenco di mapping a dispersione/raccolta. Tuttavia, il driver miniport potrebbe comunque usare il buffer DMA come spazio di memoria condiviso per comunicare con il driver dell'adattatore.

I driver di porta forniscono driver miniport con funzioni che possono usare per creare canali DMA. Se non diversamente indicato nella descrizione del driver di porta, non è assolutamente necessario usare gli oggetti DMA allocati dal driver di porta. Il driver di porta richiede semplicemente un puntatore a un'interfaccia IDmaChannel che supporta i metodi necessari. Per un elenco dei metodi del canale DMA richiesti dal driver di porta, vedere la documentazione relativa a ogni driver di porta.

In genere, l'approccio più semplice consiste nell'usare le funzioni di allocazione del canale DMA implementate dal driver di porta. In rari casi, gli sviluppatori di driver miniport potrebbero dover implementare i propri oggetti canale DMA per soddisfare i requisiti speciali delle schede specifiche. A volte è necessaria l'implementazione di un nuovo oggetto. In altri casi, è sufficiente che l'oggetto flusso del driver miniport esponga un'interfaccia IDmaChannel e implementi i metodi del canale DMA stesso.

L'interfaccia IDmaChannel supporta i metodi seguenti:

IDmaChannel::AllocateBuffer

IDmaChannel::AllocateBufferSize

IDmaChannel::BufferSize

IDmaChannel::CopyFrom

IDmaChannel::CopyTo

IDmaChannel::FreeBuffer

IDmaChannel::GetAdapterObject

IDmaChannel::MaximumBufferSize

IDmaChannel::P hysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

L'interfaccia IDmaChannelSlave estende IDmaChannel aggiungendo i metodi seguenti:

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Start

IDmaChannelSlave::Stop

IDmaChannelSlave::WaitForTC