Freigeben über


Paketbasierte DMA in AVStream

Paketbasierter direkter Speicherzugriff (DMA) tritt auf, wenn Ihr Minidriver Daten direkt aus liest und Daten direkt in die Erfassung von Puffern schreibt, die aus dem Benutzermodus empfangen werden. Der AVStream Simulated Hardware Sample Driver (AVSHwS) in den Beispielen des Windows Driver Kit (WDK) veranschaulicht, wie ein AVStream-Minidriver erstellt wird, der diesen DMA-Typ ausführt.

So implementieren Sie ein paketbasiertes DMA-Schema:

  1. Geben Sie KSPIN_FLAG_GENERATE_MAPPINGS im Flags-Element relevanter KSPIN_DESCRIPTOR_EX-Strukturen an. Beachten Sie, dass dieses Flag nur von einem Bus master mit Scatter-/Gather-Unterstützung verwendet werden sollte.

  2. Registrieren Sie eine Interruptdienstroutine (ISR), wie unter Schreiben von AVStream Minidrivern für Hardware beschrieben.

Starten Sie dann in der AVStrMiniDeviceStart-Verteilung :

  1. Richten Sie mithilfe von IoGetDmaAdapter ein DMA-Adapterobjekt ein.

  2. Registrieren Sie das DMA-Adapterobjekt bei AVStream, indem Sie KsDeviceRegisterAdapterObject aufrufen.

Der Minidriver gibt die maximale Größe für eine einzelne Scatter/Gather-Zuordnung an, indem im Aufruf von KsDeviceRegisterAdapterObject ein MaxMappingByteCount-Parameter angegeben wird.

Wenn eine Scatter-/Gather-Zuordnung diese maximale Größe überschreitet, unterbricht AVStream die Zuordnung automatisch in mehrere Scatter-/Gather-Zuordnungen, von denen jede nicht größer als die in MaxMappingByteCount angegebene Größe ist.

Sie müssen auch eine AVStrMiniPinProcess-Rückrufroutine bereitstellen. Der Treiberschreiber sollte die entsprechende Funktionalität für diesen Rückruf auswählen. Als Beispiel können Sie Folgendes tun:

  1. Rufen Sie KsPinGetLeadingEdgeStreamPointer auf.

  2. Klonen Sie den führenden Edge, indem Sie KsStreamPointerClone aufrufen.

  3. Programmieren Sie DMA-Hardware basierend auf dem Klon.

  4. Rufen Sie KsStreamPointerAdvanceOffsets oder KsStreamPointerAdvance auf, um die führende Edge zu fördern.

  5. Wiederholen Sie nach Bedarf aus Schritt 2 für zusätzliche Frames.

Wenn die Hardware für die DMA-Vervollständigung unterbricht, ruft der Kernel den ISR auf, den der Anbieter zuvor registriert hat. In der ISR stellt der Minidriver einen Verzögerten Prozeduraufruf (DPC) in die Warteschlange.

Ihr DPC sollte DataUsed und möglicherweise andere Member der KSSTREAM_HEADER-Struktur aktualisieren. Der DPC kann dann KsStreamPointerDelete aufrufen, um den Klon zu löschen und den zugeordneten Frame freizugeben.

Alternativ kann der DPC den Klonzeiger voranbringen, wenn nur ein Teil des Frames abgeschlossen ist. Rufen Sie hierzu KsStreamPointerAdvanceOffsets auf.

Rufen Sie bei Bedarf KsPinAttemptProcessing auf, um die Verarbeitung fortzusetzen.

Hinweis

Wenn eine Zuordnung kleiner als eine physische Seite ist, ist nicht garantiert, dass sie sich auf einer einzelnen physischen Seite befindet.