次の方法で共有


WdfDmaTransactionSetDeviceAddressOffset 関数 (wdfdmatransaction.h)

[KMDF にのみ適用]

WdfDmaTransactionSetDeviceAddressOffset メソッドは、DMA 操作の実行時にシステム DMA コントローラーがアクセスするレジスタのオフセットを指定します。

構文

void WdfDmaTransactionSetDeviceAddressOffset(
  [in] WDFDMATRANSACTION DmaTransaction,
  [in] ULONG             Offset
);

パラメーター

[in] DmaTransaction

変更するトランザクションを指定する DMA トランザクション オブジェクトへのハンドル。

[in] Offset

WDF_DMA_SYSTEM_PROFILE_CONFIGで指定された DeviceAddress から DMA を実行する必要があるレジスタのオフセット。

戻り値

なし

解説

WdfDmaTransactionSetDeviceAddressOffset は、システム モード DMA プロファイルを指定する DMA イネーブラーと共に使用する必要があります。

フレームワーク ベースのドライバーは、DMA トランザクションを初期化した後、および実行する前に WdfDmaTransactionSetDeviceAddressOffset を呼び出します。

ドライバーは、このメソッドを使用して、デバイスのレジスタ ファイル内の複数のレジスタにアクセスできます。

たとえば、ドライバーは DMA を使用して、デバイスのレジスタ ファイル内の個別の読み取りレジスタと書き込みレジスタにアクセスできます。

これを行うには、ドライバーは、イネーブラーを構成するときに、デバイスのレジスタ ファイルのベース アドレスを指定し、トランザクションを実行する前に必要に応じて読み取りまたは書き込みレジスタのオフセットを設定します。

ドライバーがWindows 8より前のオペレーティング システムでこのメソッドを呼び出すと、フレームワークの検証ツールによってエラーが報告されます。

次のコード例では、DMA トランザクションを初期化します。 次に、システム DMA コントローラーがアクセスするレジスタのオフセットを設定し、転送完了コールバック ルーチンを提供して、DMA トランザクションを実行します。

status = WdfDmaTransactionInitialize(
                                     RequestContext->DmaTransaction,
                                     EvtProgramDma,
                                     direction,
                                     mdl,
                                     startingVa,
                                     length
                                     );

if(!NT_SUCCESS(status)) {
    goto Complete;
}

WdfDmaTransactionSetDeviceAddressOffset(
                                        RequestContext->DmaTransaction,
                                        READ_DATA_REGISTER_OFFSET
                                        );

WdfDmaTransactionSetTransferCompleteCallback(
                                             RequestContext->DmaTransaction,
                                             EvtDmaTransactionDmaTransferComplete,
                                             RequestContext
                                             );

status = WdfDmaTransactionExecute(
                                  RequestContext->DmaTransaction, 
                                  RequestContext );

if(!NT_SUCCESS(status)) {
    goto Complete;
}

return status;

Complete:

WdfDmaTransactionRelease(
                         RequestContext->DmaTransaction
                         );

要件

要件
サポートされている最小のクライアント Windows 8
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.11
Header wdfdmatransaction.h (Wdf.h を含む)
Library Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf)

こちらもご覧ください

WDF_DMA_SYSTEM_PROFILE_CONFIG