Freigeben über


Erstellen und Initialisieren einer DMA-Transaktion

[Gilt nur für KMDF]

Bevor Ihr Treiber eine E/A-Anforderung an ein DMA-Gerät senden kann, muss der Treiber Folgendes ausführen:

  1. Rufen Sie WdfDmaTransactionCreate auf , um ein DMA-Transaktionsobjekt für die Anforderung zu erstellen.

  2. Rufen Sie WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize oder WdfDmaTransactionInitializeUsingOffset auf, um das Transaktionsobjekt zu initialisieren.

In der Regel erstellt Ihr Treiber eine DMA-Transaktion , da ein Anforderungshandler ein Frameworkanforderungsobjekt empfangen hat und die Anforderung an die Hardware übergeben muss. In diesem Fall sollte der Treiber WdfDmaTransactionInitializeUsingRequest aufrufen, der ein Anforderungsobjekthandle als Eingabe akzeptiert und die Adressparameter der Anforderung aus dem Anforderungsobjekt extrahiert.

Wenn Ihr Treiber eine DMA-Transaktion erstellen muss, die nicht auf einem Frameworkanforderungsobjekt basiert, das der Treiber empfangen hat, kann der Treiber entweder WdfDmaTransactionInitialize oder WdfDmaTransactionInitializeUsingOffset aufrufen. Beide Methoden akzeptieren Adressparameter, die der Treiber bereitstellt.

Alle drei Initialisierungsmethoden erfordern die Adresse einer EvtProgramDma-Ereignisrückruffunktion als Eingabeparameter. Diese Rückruffunktion programmiert das Gerät, und das Framework ruft die Rückruffunktion jedes Mal auf, wenn eine DMA-Übertragung verfügbar ist.

Wenn Ihr Treiber WdfDmaEnablerCreate aufruft, um ein DMA-Aktivierungsobjekt zu erstellen, stellt der Treiber eine WDF_DMA_ENABLER_CONFIG Struktur bereit, die die maximale Übertragungslänge des Geräts enthält. Das Framework verwendet diesen Wert als maximale Standardlänge für alle DMA-Übertragungen.

Für einige Arten von DMA-Transaktionen müssen Sie möglicherweise eine maximale Übertragungslänge angeben, die sich von der standardmäßigen maximalen Länge des Geräts unterscheidet. Sie können WdfDmaTransactionSetMaximumLength verwenden, um eine maximale Übertragungslänge für eine einzelne Transaktion festzulegen. Das Framework verwendet nur die angegebene maximale Übertragungslänge, während es die angegebene Transaktion verarbeitet.

Beachten Sie, dass die maximale Übertragungslänge durch die Anzahl von Kartenregistern begrenzt wird, die das Betriebssystem dem DMA-Enabler-Objekt zur Verfügung stellt. Um die maximale verfügbare Übertragungslänge zu bestimmen, kann Ihr Treiber WdfDmaEnablerGetFragmentLength aufrufen. Wenn der Wert, den WdfDmaEnablerGetFragmentLength zurückgibt, kleiner als die maximale Übertragungslänge ist, die der Treiber für WdfDmaEnablerCreate bereitgestellt hat, verwendet das Framework den kleineren Wert.

Nachdem Ihr Treiber eine DMA-Transaktion erstellt und initialisiert hat, muss der Treiber die Transaktion starten.