Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der paketbasierte direkte Speicherzugriff (Direct Memory Access, DMA) tritt auf, wenn Ihr Minidriver Daten direkt ausliest und direkt in Erfassungspuffer schreibt, die im Benutzermodus empfangen werden. In den Beispielen des AVStream Simulated Hardware Sample Driver (AVSHwS) im Windows Driver Kit (WDK) wird veranschaulicht, wie Sie einen AVStream-Minidriver erstellen, der diesen DMA-Typ ausführt.
So implementieren Sie ein paketbasiertes DMA-Schema:
Geben Sie KSPIN_FLAG_GENERATE_MAPPINGS im Flags-Element relevanter KSPIN_DESCRIPTOR_EX Strukturen an. Beachten Sie, dass dieses Flag nur von einem Busmaster mit Scatter/Gather-Unterstützung verwendet werden sollte.
Registrieren Sie eine Unterbrechungsdienstroutine (INTERRUPT Service Routine, ISR), wie in Writing AVStream Minidrivers für Hardware beschrieben.
Dann im AVStrMiniDeviceStart-Startaufruf:
Richten Sie ein DMA-Adapterobjekt mit IoGetDmaAdapter ein.
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, durch Bereitstellung eines MaxMappingByteCount-Parameters im Aufruf von KsDeviceRegisterAdapterObject.
Wenn eine Scatter-/Gather-Zuordnung diese maximale Größe überschreitet, unterteilt 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 für diesen Rückruf die entsprechende Funktionalität auswählen. Wie ein Beispiel können Sie die folgenden Aktionen ausführen:
Rufen Sie KsPinGetLeadingEdgeStreamPointer auf.
Klonen Sie den führenden Rand, indem Sie KsStreamPointerClone aufrufen.
Programmieren Sie DMA-Hardware basierend auf dem Klon.
Rufen Sie KsStreamPointerAdvanceOffsets oder KsStreamPointerAdvance auf, um den führenden Rand voranzutreiben.
Wiederholen Sie bei Bedarf Schritt 2 für zusätzliche Frames.
Wenn die Hardware einen Interrupt für den DMA-Abschluss auslöst, ruft der Kernel das ISR auf, das der Hersteller zuvor registriert hat. Im ISR stellt der Minidriver einen verzögerten Prozeduraufruf (Deferred Procedure Call, DPC) in die Warteschlange.
Ihr DPC sollte DataUsed und möglicherweise andere Member der KSSTREAM_HEADER-Struktur aktualisieren. Der DPC ruft dann KsStreamPointerDelete auf, um den Klon zu löschen und den zugeordneten Frame freizugeben.
Alternativ kann der DPC den Klonzeiger weiterbewegen, wenn nur ein Teil des Rahmens abgeschlossen ist. Rufen Sie dazu KsStreamPointerAdvanceOffsets auf.
Wenn die Verarbeitung fortgesetzt werden muss, rufen Sie KsPinAttemptProcessing auf.
Hinweis
Wenn eine Zuordnung weniger als eine physische Seite umfasst, ist es nicht garantiert, auf einer einzelnen physischen Seite zu liegen.