DMA トランザクションの作成と初期化

[KMDF のみに適用]

ドライバーが DMA デバイスに I/O 要求を送信する前に、ドライバーは次の手順を実行する必要があります。

  1. WdfDmaTransactionCreate を呼び出して、要求の DMA トランザクション オブジェクトを作成します。

  2. WdfDmaTransactionInitializeUsingRequestWdfDmaTransactionInitialize、または WdfDmaTransactionInitializeUsingOffset を呼び出してトランザクション オブジェクトを初期化します。

通常、要求ハンドラーフレームワーク要求オブジェクトを受け取り、要求をハードウェアに渡す必要があるため、ドライバーは DMA トランザクションを作成します。 この場合、ドライバーは WdfDmaTransactionInitializeUsingRequest を呼び出す必要があります。これは要求オブジェクト ハンドルを入力として受け取り、要求オブジェクトから要求のアドレス パラメーターを抽出します。

ドライバーが受け取ったフレームワーク要求オブジェクトに基づいていない DMA トランザクションをドライバーが作成する必要がある場合、ドライバーは WdfDmaTransactionInitialize または WdfDmaTransactionInitializeUsingOffset を呼び出すことができます。 どちらのメソッドも、ドライバーが提供するアドレス パラメーターを受け取ります。

3 つの初期化メソッドはすべて、入力パラメーターとして EvtProgramDma イベント コールバック関数のアドレスを必要とします。 このコールバック関数はデバイスをプログラムし、DMA 転送が使用可能になるたびにフレームワークによってコールバック関数が呼び出されます。

ドライバーが WdfDmaEnablerCreate を呼び出して DMA イネーブラー オブジェクトを作成すると、ドライバーはデバイスの最大転送長を含む WDF_DMA_ENABLER_CONFIG 構造体を提供します。 フレームワークでは、この値をすべての DMA 転送の既定の最大長として使用します。

DMA トランザクションの種類によっては、デバイスの既定の最大長とは異なる最大転送長を指定することが必要になる場合があります。 WdfDmaTransactionSetMaximumLength を使用して、個々のトランザクションの最大転送長を設定できます。 フレームワークは、指定されたトランザクションを処理している間にのみ、指定された最大転送長を使用します。

転送の最大長は、オペレーティング システムが DMA イネーブラー オブジェクトで使用できるできるようにするマップ レジスタの数によって制限されることに注意してください。 使用可能な転送の最大長を判断するために、ドライバーは WdfDmaEnablerGetFragmentLength を呼び出すことができます。 WdfDmaEnablerGetFragmentLength が返す値が、ドライバーが WdfDmaEnablerCreate に指定した転送の最大長より小さい場合、フレームワークは小さい値を使用します。

ドライバーが DMA トランザクションを作成して初期化した後、ドライバーはトランザクションを開始する必要があります。