DMA トランザクションの有効化

[KMDF のみに適用]

フレームワークベースのドライバーが DMA デバイスの I/O 操作を処理する場合、ドライバーは、DMA デバイスごとにフレームワークの DMA 機能を有効にする必要があります。 これらの機能を有効にするには、ドライバーの EvtDriverDeviceAdd または EvtDevicePrepareHardware コールバック関数は次を実行する必要があります。

  1. WdfDeviceSetAlignmentRequirement を呼び出して、バッファーの配置に対するデバイスの要件を指定します。

  2. WdfDmaEnablerCreate を呼び出して、DMA 操作の種類 (単一パケットまたはスキャッター/ギャザー) と、デバイスがサポートする最大転送サイズを指定します。 KMDF バージョン 1.11 以降、フレームワークでは、オペレーティング システムの Windows 8 以降のバージョンで実行されているシステム オン チップ (SoC) ベースのシステム モード DMA がサポートされています。

  3. デバイスがスキャッター/ギャザー操作をサポートしている場合は、WdfDmaEnablerSetMaximumScatterGatherElements を呼び出して、デバイスがスキャッター/ギャザーリストでサポートできる要素の最大数を指定します。

PLX9x5x サンプルの次のコード例は、フレームワークの DMA 機能を有効にする方法を示しています。 このコードは Init.c ファイルに表示されます。

WDF_DMA_ENABLER_CONFIG   dmaConfig;

WdfDeviceSetAlignmentRequirement( DevExt->Device, PCI9656_DTE_ALIGNMENT_16 );
WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
                             WdfDmaProfileScatterGather64Duplex,
                             DevExt->MaximumTransferLength );
status = WdfDmaEnablerCreate( DevExt->Device,
                              &dmaConfig, 
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &DevExt->DmaEnabler );

ドライバーに共通バッファーが必要な場合、ドライバーの EvtDriverDeviceAdd コールバック関数は通常、それらを設定します。 これらのバッファーの詳細については、「共通バッファーの使用」を参照してください。

ドライバーが WdfDmaEnablerCreate を呼び出した後、WdfDmaEnablerWdmGetDmaAdapter を呼び出して、デバイスの入力方向と出力方向用にフレームワークによって作成される WDM DMA_ADAPTER 構造体へのポインターを取得できます。 ただし、ほとんどのフレームワークベースのドライバーは、これらの構造体にアクセスする必要はありません。