システム モード 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 をサポートするためにドライバーが使用するイベント コールバック関数を示しています。
システムモード DMA イネーブラーの作成
システムモード DMA プロファイルの作成は、2 段階のプロセスです。 次の手順は、一般的なシナリオを表しています。
通常、EvtDriverDeviceAdd コールバック関数では、ドライバーはWDF_DMA_ENABLER_CONFIG_INIT を呼び出し、プロファイル パラメーターを SystemMode または SystemModeDuplex に設定します。 その後、ドライバーは WdfDmaEnablerCreate を呼び出し、先ほど受け取ったWDF_DMA_ENABLER_CONFIG 構造体を渡します。
ドライバーは、EvtDevicePrepareHardware の実行中にイネーブラーを作成することもできます。
ドライバーの EvtDevicePrepareHardware コールバック関数は、WdfDmaEnablerConfigureSystemProfile メソッドを呼び出すことによって、DMA イネーブラーを DMA リソースに関連付けます。 双方向イネーブラーの場合、ドライバーは WdfDmaEnablerConfigureSystemProfile を 2 回呼び出して、各転送方向を構成します。
ドライバーは、EvtDevicePrepareHardware が完了した後に WdfDmaEnablerConfigureSystemProfile を呼び出すことができますが、ドライバーは DMA トランザクションを初期化する前に、このメソッドを呼び出す必要があります。
省略可能なコールバック関数の提供
通常、KMDF ドライバーは DMA チャンネルを構成しません。 ただし、状況によっては、ドライバーがチャンネル固有の構成を実行する必要がある場合があります。 たとえば、ドライバーは、次の手順を使用して DMA コントローラーによって実装されるカスタム関数を呼び出す場合があります。
- ドライバーの要求ハンドラーのいずれかで、ドライバーは WdfDmaTransactionSetChannelConfigurationCallback を呼び出して EvtDmaTransactionConfigureDmaChannel コールバック関数を登録します。
- ドライバーの EvtDmaTransactionConfigureDmaChannel コールバック関数は、WdfDmaEnablerWdmGetDmaAdapter を呼び出して、WDM DMA_ADAPTER へのポインターを取得します。 この構造体は、ドライバーのシステム モード DMA チャンネルを表すアダプター オブジェクトです。
- その後、ドライバーは ConfigureAdapterChannel を呼び出して、DMA コントローラーによって実装されたカスタム関数を有効にすることができます。 このルーチンは、DMA_OPERATIONS 構造体で返されたアドレスからのポインターによってのみ呼び出されます。
- ドライバーの EvtDmaTransactionConfigureDmaChannel コールバック関数は、DMA チャンネルを正常に構成した場合に TRUE を返します。
- フレームワークは、ドライバーの EvtProgramDma コールバック関数を呼び出します。
転送完了通知の受け取り
バス マスタリング コントローラーを使用するデバイスとは異なり、システム モード DMA デバイスのハードウェアは、割り込みを発行して DMA 転送の完了を通知しない可能性があります。
デバイスが DMA 転送の完了を通知する割り込みを発生させない場合、ドライバーは、システム モード DMA 転送が完了したときにフレームワークが呼び出す EvtDmaTransactionDmaTransferComplete イベント コールバック関数を提供できます。
このコールバック関数を登録するために、ドライバーは要求ハンドラーの 1 つから WdfDmaTransactionSetTransferCompleteCallback を呼び出します。