Unterstützung System-Mode DMA

[Gilt nur für KMDF]

DMA im Systemmodus beschreibt im Gegensatz zu Bus-master DMA eine Konfiguration, bei der mehrere Geräte einen einzelnen DMA-Controller gemeinsam nutzen.

Ab Kernel-Mode Driver Framework (KMDF) Version 1.11 unterstützt das Framework DMA auf SoC-basierten Systemen (System on a Chip), die auf Windows 8 oder höheren Versionen des Windows-Betriebssystems ausgeführt werden.

In diesem Thema wird der Code beschrieben, den ein KMDF-Treiber in seinen Ereignisrückruffunktionen bereitstellen muss, sowie optionale Ereignisrückruffunktionen, die er registrieren kann, um E/A-Anforderungen für ein DMA-Gerät im Systemmodus zu verarbeiten.

Informationen zu KMDF und Bus-master DMA finden Sie unter Verarbeiten von E/A-Anforderungen in einem KMDF-Treiber für ein Bus-Master DMA-Gerät.

Die folgende Abbildung zeigt die Ereignisrückruffunktionen, die Ihr Treiber zur Unterstützung von DMA im Systemmodus verwendet:

Flussdiagramm mit Ereignisrückruffunktionen für die DMA-Implementierung im Systemmodus in KMDF-Treibern.

Erstellen eines System-Mode DMA-Enablers

Das Erstellen eines DMA-Profils im Systemmodus ist ein zweistufiger Prozess. Die folgenden Schritte stellen ein typisches Szenario dar:

  1. In der Regel ruft der Treiber in seiner Rückruffunktion EvtDriverDeviceAddWDF_DMA_ENABLER_CONFIG_INIT auf und legt den Profile-Parameter auf SystemMode oder SystemModeDuplex fest. Der Treiber ruft dann WdfDmaEnablerCreate auf und übergibt die WDF_DMA_ENABLER_CONFIG Struktur, die er gerade empfangen hat.

    Alternativ kann der Treiber den Enabler während EvtDevicePrepareHardware erstellen.

  2. Die EvtDevicePrepareHardware-Rückruffunktion Ihres Treibers verknüpft den DMA-Enabler mit seinen DMA-Ressourcen, indem die WdfDmaEnablerConfigureSystemProfile-Methode aufgerufen wird. Bei einem Duplexaktivierer ruft der Treiber WdfDmaEnablerConfigureSystemProfile zweimal auf, einmal, um jede Übertragungsrichtung zu konfigurieren.

    Der Treiber kann WdfDmaEnablerConfigureSystemProfile aufrufen, nachdem EvtDevicePrepareHardware abgeschlossen ist, aber der Treiber muss diese Methode aufrufen, bevor er DMA-Transaktionen initialisiert.

Bereitstellen optionaler Rückruffunktionen

In der Regel konfigurieren KMDF-Treiber keine DMA-Kanäle. Unter bestimmten Umständen müssen Treiber jedoch eine kanalspezifische Konfiguration durchführen. Ein Treiber kann beispielsweise eine benutzerdefinierte Funktion aufrufen, die vom DMA-Controller implementiert wird, indem er die folgenden Schritte ausführt:

  1. In einem der Anforderungshandler des Treibers ruft der Treiber WdfDmaTransactionSetChannelConfigurationCallback auf, um eine EvtDmaTransactionConfigureDmaChannel-Rückruffunktion zu registrieren.
  2. Die Rückruffunktion EvtDmaTransactionConfigureDmaChannel ihres Treibers ruft WdfDmaEnablerWdmGetDmaAdapter auf, um einen Zeiger auf den WDM-DMA_ADAPTER abzurufen. Diese Struktur ist das Adapterobjekt, das den DMA-Kanal im Systemmodus des Treibers darstellt.
  3. Der Treiber kann dann ConfigureAdapterChannel aufrufen, um benutzerdefinierte Funktionen zu aktivieren, die vom DMA-Controller implementiert werden. Diese Routine kann nur durch zeiger von der Adresse aufgerufen werden, die in einer DMA_OPERATIONS-Struktur zurückgegeben wird.
  4. Die Rückruffunktion EvtDmaTransactionConfigureDmaChannel ihres Treibers gibt TRUE zurück, wenn der DMA-Kanal erfolgreich konfiguriert wird.
  5. Das Framework ruft die Rückruffunktion EvtProgramDma des Treibers auf.

Empfangen einer Benachrichtigung über den Abschluss der Übertragung

Im Gegensatz zu Geräten, die Busmastercontroller verwenden, signalisiert die Hardware für ein DMA-Gerät im Systemmodus möglicherweise nicht den Abschluss der DMA-Übertragung, indem ein Interrupt ausgegeben wird.

Wenn Ihr Gerät keinen Interrupt auslöst, um den Abschluss der DMA-Übertragung zu signalisieren, kann Ihr Treiber eine EvtDmaTransactionDmaTransferComplete-Ereignisrückruffunktion bereitstellen, die das Framework aufruft, wenn eine DMA-Übertragung im Systemmodus abgeschlossen ist.

Um diese Rückruffunktion zu registrieren, ruft ein Treiber WdfDmaTransactionSetTransferCompleteCallback von einem seiner Anforderungshandler auf.