DMA トランザクションの有効化
[KMDF のみに適用]
フレームワークベースのドライバーが DMA デバイスの I/O 操作を処理する場合、ドライバーは、DMA デバイスごとにフレームワークの DMA 機能を有効にする必要があります。 これらの機能を有効にするには、ドライバーの EvtDriverDeviceAdd または EvtDevicePrepareHardware コールバック関数は次を実行する必要があります。
WdfDeviceSetAlignmentRequirement を呼び出して、バッファーの配置に対するデバイスの要件を指定します。
WdfDmaEnablerCreate を呼び出して、DMA 操作の種類 (単一パケットまたはスキャッター/ギャザー) と、デバイスがサポートする最大転送サイズを指定します。 KMDF バージョン 1.11 以降、フレームワークでは、オペレーティング システムの Windows 8 以降のバージョンで実行されているシステム オン チップ (SoC) ベースのシステム モード DMA がサポートされています。
デバイスがスキャッター/ギャザー操作をサポートしている場合は、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 構造体へのポインターを取得できます。 ただし、ほとんどのフレームワークベースのドライバーは、これらの構造体にアクセスする必要はありません。