Condividi tramite


DMA basato su pacchetti in AVStream

L'accesso diretto alla memoria diretta basata su pacchetti si verifica quando il minidriver legge i dati direttamente da e scrive i dati direttamente per acquisire i buffer ricevuti dalla modalità utente. Gli esempi AVStream Simulated Hardware Sample Driver (AVSHwS) negli esempi di Windows Driver Kit (WDK) illustrano come creare un minidriver AVStream che esegue questo tipo di DMA.

Per implementare uno schema DMA basato su pacchetti:

  1. Specificare KSPIN_FLAG_GENERATE_MAPPINGS nel membro Flag delle strutture KSPIN_DESCRIPTOR_EX pertinenti. Si noti che questo flag deve essere usato solo da un master del bus con supporto di dispersione/raccolta.

  2. Registrare una routine di servizio di interruzione (ISR) come descritto in Scrittura di minidriver AVStream per hardware.

Quindi nell'invio iniziale di AVStrMiniDeviceStart :

  1. Configurare un oggetto adapter DMA usando IoGetDmaAdapter.

  2. Registrare l'oggetto adapter DMA con AVStream chiamando KsDeviceRegisterAdapterObject.

Il minidriver specifica le dimensioni massime per un singolo mapping a dispersione/raccolta fornendo un parametro MaxMappingByteCount nella chiamata a KsDeviceRegisterAdapterObject.

Se un mapping a dispersione/raccolta supera questa dimensione massima, AVStream interrompe automaticamente il mapping in diversi mapping a dispersione/raccolta, ognuno dei quali non è maggiore delle dimensioni specificate in MaxMappingByteCount.

È anche necessario fornire una routine di callback AVStrMiniPinProcess . Il writer del driver deve scegliere le funzionalità appropriate per questo callback. Come esempio, è possibile eseguire le operazioni seguenti:

  1. Chiamare KsPinGetLeadingEdgeStreamPointer.

  2. Clonare il bordo principale chiamando KsStreamPointerClone.

  3. Programmare l'hardware DMA in base al clone.

  4. Chiamare KsStreamPointerAdvanceOffsets o KsStreamPointerAdvance per avanzare il bordo principale.

  5. Ripetere dal passaggio 2 in base alle esigenze per fotogrammi aggiuntivi.

Quando l'hardware interrompe il completamento di DMA, il kernel chiama l'ISR registrato in precedenza dal fornitore. Nell'ISR, il minidriver accoda una chiamata di routine posticipata (DPC).

Il DPC deve aggiornare DataUsed e eventualmente altri membri della struttura KSSTREAM_HEADER. Il DPC potrebbe quindi chiamare KsStreamPointerDelete per eliminare il clone e rilasciare il frame associato.

In alternativa, il DPC potrebbe avanzare il puntatore clone se viene completata solo parte del frame. A tale scopo, chiamare KsStreamPointerAdvanceOffsets.

Se necessario per riprendere l'elaborazione, chiamare KsPinAttemptProcessing.

Nota

Se un mapping è minore di una pagina fisica in lunghezza, non è garantito che si trovi in una singola pagina fisica.