システム モード DMA のサポート

[KMDF にのみ適用]

システム モード DMA は、バス マスター DMA とは対照的に、複数のデバイスが 1 つのマルチチャンネル DMA コントローラーを共有する構成を表します。

カーネルモード ドライバー フレームワーク (KMDF) バージョン 1.11 以降、フレームワークは、Windows 8 以降のバージョンの Windows オペレーティング システムで実行されている System on a Chip (SoC) ベースのシステムモード DMA をサポートします。

このトピックでは、KMDF ドライバーがシステム モード DMA デバイスの I/O 要求を処理するために、イベント コールバック関数と、登録できるオプションのイベント コールバック関数で提供する必要があるコードについて説明します。

KMDF とバスマスター DMA の詳細については、「バスマスター DMA デバイスの KMDF ドライバーでの I/O 要求の処理」を参照してください。

次の図は、システムモード DMA をサポートするためにドライバーが使用するイベント コールバック関数を示しています。

Flowchart showing event callback functions for system-mode DMA implementation in KMDF drivers.

システムモード DMA イネーブラーの作成

システムモード DMA プロファイルの作成は、2 段階のプロセスです。 次の手順は、一般的なシナリオを表しています。

  1. 通常、EvtDriverDeviceAdd コールバック関数では、ドライバーはWDF_DMA_ENABLER_CONFIG_INIT を呼び出し、プロファイル パラメーターを SystemMode または SystemModeDuplex に設定します。 その後、ドライバーは WdfDmaEnablerCreate を呼び出し、先ほど受け取ったWDF_DMA_ENABLER_CONFIG 構造体を渡します。

    ドライバーは、EvtDevicePrepareHardware の実行中にイネーブラーを作成することもできます。

  2. ドライバーの EvtDevicePrepareHardware コールバック関数は、WdfDmaEnablerConfigureSystemProfile メソッドを呼び出すことによって、DMA イネーブラーを DMA リソースに関連付けます。 双方向イネーブラーの場合、ドライバーは WdfDmaEnablerConfigureSystemProfile を 2 回呼び出して、各転送方向を構成します。

    ドライバーは、EvtDevicePrepareHardware が完了した後に WdfDmaEnablerConfigureSystemProfile を呼び出すことができますが、ドライバーは DMA トランザクションを初期化する前に、このメソッドを呼び出す必要があります。

省略可能なコールバック関数の提供

通常、KMDF ドライバーは DMA チャンネルを構成しません。 ただし、状況によっては、ドライバーがチャンネル固有の構成を実行する必要がある場合があります。 たとえば、ドライバーは、次の手順を使用して DMA コントローラーによって実装されるカスタム関数を呼び出す場合があります。

  1. ドライバーの要求ハンドラーのいずれかで、ドライバーは WdfDmaTransactionSetChannelConfigurationCallback を呼び出して EvtDmaTransactionConfigureDmaChannel コールバック関数を登録します。
  2. ドライバーの EvtDmaTransactionConfigureDmaChannel コールバック関数は、WdfDmaEnablerWdmGetDmaAdapter を呼び出して、WDM DMA_ADAPTER へのポインターを取得します。 この構造体は、ドライバーのシステム モード DMA チャンネルを表すアダプター オブジェクトです。
  3. その後、ドライバーは ConfigureAdapterChannel を呼び出して、DMA コントローラーによって実装されたカスタム関数を有効にすることができます。 このルーチンは、DMA_OPERATIONS 構造体で返されたアドレスからのポインターによってのみ呼び出されます。
  4. ドライバーの EvtDmaTransactionConfigureDmaChannel コールバック関数は、DMA チャンネルを正常に構成した場合に TRUE を返します。
  5. フレームワークは、ドライバーの EvtProgramDma コールバック関数を呼び出します。

転送完了通知の受け取り

バス マスタリング コントローラーを使用するデバイスとは異なり、システム モード DMA デバイスのハードウェアは、割り込みを発行して DMA 転送の完了を通知しない可能性があります。

デバイスが DMA 転送の完了を通知する割り込みを発生させない場合、ドライバーは、システム モード DMA 転送が完了したときにフレームワークが呼び出す EvtDmaTransactionDmaTransferComplete イベント コールバック関数を提供できます。

このコールバック関数を登録するために、ドライバーは要求ハンドラーの 1 つから WdfDmaTransactionSetTransferCompleteCallback を呼び出します。