次の方法で共有


DMA チャネルのオブジェクト

Note

Microsoft では、多様性があり、包括的な環境をサポートしています。 この記事には、偏見のないコミュニケーションのための Microsoft スタイル ガイドで排他的と認識される用語への参照が含まれています。 この単語または言い回しは現在ソフトウェアで使われているものであることから、一貫性を保つためにこの記事で使用しています。 言語を削除するためにソフトウェアを更新される場合、それに合わせてこの記事も更新されます。

PortCls システム ドライバーでは、WaveCyclic ミニポート ドライバーと WavePci ミニポート ドライバーのために、IDmaChannel インターフェイスと IDmaChannelSlave インターフェイスが実装されます。 IDmaChannel は、DMA チャンネルと、それに関連付けられている DMA バッファー パラメーターおよびバッファー使用量パラメーターを表します。 また、WaveCyclic ミニポート ドライバーでは、下位デバイスの DMA チャンネルを管理する IDmaChannelSlave が使用されます。 IDmaChannelSlaveIDmaChannel から継承します。 DMA 操作の制御については、「アダプター オブジェクトと DMA」を参照してください。

IDmaChannel オブジェクトは、次をカプセル化します。

  • マスターまたは下位デバイスの DMA チャンネル

  • チャネルに関連付けられたデータ バッファーです。

  • チャネルの使用方法を説明する情報

ポート ドライバーとミニポート ドライバーは、DMA チャンネル オブジェクトを使用して、DMA チャンネルの使用状況に関する情報を通信します。 通常、ミニポート ドライバーは、初期化中またはストリームの作成時に DMA チャネルのセットを割り当てます。 新しいストリームの作成時に、ミニポート ドライバーは、ストリームに使用される DMA チャンネル オブジェクトをポート ドライバーに通知します。

DMA チャネル オブジェクトは、マスター デバイスまたは下位デバイス用に作成できます。

  • 下位デバイスは、組み込まれた DMA ハードウェア機能がないため、システム DMA コントローラーに依存して、デバイスに必要なデータ転送を実行する必要があります。

  • マスター デバイスは、独自のバス マスタリング DMA ハードウェアを使用して、システム バス上でデータ転送を実行します。

下位 DMA チャネル オブジェクトを使用する WaveCyclic デバイスの例については、以前のバージョンの Microsoft Windows Driver Kit (WDK) の Sb16 サンプル オーディオ ドライバーを参照してください。 マスター DMA チャンネル オブジェクトは、ポート ドライバーとミニポート ドライバーの間での DMA チャンネルに関する情報の共有を支援するためのものに過ぎません。 マスター デバイスと下位デバイスの詳細については、「アダプター オブジェクトの概要」を参照してください。

マスターまたは下位デバイスの DMA チャンネル オブジェクトは、次を公開します。

  • アダプター オブジェクト

  • ドライバーと DMA ハードウェアが共有できる 1 つの共通バッファー

  • クエリと変更が可能なバッファー サイズの値

アダプター オブジェクトは、物理デバイス オブジェクト (PDO) の DMA アダプター構造体です。 アダプター オブジェクトは、ミニポート ドライバーが次のいずれかのメソッドを呼び出すことによって DMA チャンネル オブジェクトを作成するときに、自動的に作成されます。

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

IDmaChannel::GetAdapterObject メソッドを使用すると、アダプター オブジェクトへのポインターを取得することができます。

アダプター ドライバーは、DMA チャンネル オブジェクトを作成する PcNewDmaChannel 関数を呼び出すこともできますが、呼び出し元が明示的にデバイス オブジェクトとその他のコンテキスト情報を指定する必要があるため、この関数は IPortWaveXxx::NewXxxDmaChannel 呼び出しよりも使用が難しい関数です。

下位デバイスの DMA チャンネルの場合、IDmaChannel::TransferCount メソッドは、IDmaChannelSlave::Start の呼び出しで指定された最大転送サイズ (MapSize パラメーター) を返します。 また、アダプター オブジェクトには、DMA デバイスを操作およびクエリするためのメソッドがいくつか用意されています。 マスター DMA チャンネルでは、これらのメソッドのいずれも意味がありません。

IDmaChannel::AllocateBufferIDmaChannel::FreeBuffer は、DMA チャンネル オブジェクトに関連付けられている単一の共通バッファーを管理するために使用されます。 オブジェクトによって割り当てられるバッファーは、ドライバー (カーネル仮想メモリ アドレスを使用) と DMA デバイス (物理メモリ アドレスを使用) の両方にアクセス可能であることが保証されます。 また、バッファーは物理的に連続します。 一般的に、物理的に連続したメモリが最も多いミニポート ドライバーの初期化中に、DMA バッファーを割り当てることが、最適な方法です。 IDmaChannel::AllocatedBufferSize は、IDmaChannel::AllocateBuffer の呼び出しで指定されたバッファーのサイズを返します。

IDmaChannel::MaximumBufferSize は、使用できる実際の最大バッファー サイズを示します。 これは、割り当てられたサイズがページ サイズの偶数倍でない場合は、割り当てられたサイズを超える可能性があります。 DMA デバイスが割り当てられたサイズの転送をサポートできない場合は、割り当てられたサイズよりも小さい可能性があります。 IDmaChannel::BufferSizeIDmaChannel::SetBufferSize は、DMA 転送に使用するバッファーのサイズを照会および設定するために使用されます。 バッファーが割り当てられると、バッファー サイズは最大バッファー サイズに設定されます。 初期化後、ポート ドライバーとミニポート ドライバーの両方に、バッファー サイズを変更するか、現在の値を検出する機会があります。 ミニポート ドライバーは、IDmaChannel::BufferSize の結果を使用して、DMA チャンネルが開始されたときの DMA 操作の転送サイズを決定します。 IDmaChannel::SystemAddressIDmaChannel::P hysicalAddress は、それぞれバッファーの仮想アドレスと物理アドレスを取得するために使用されます。

IDmaChannel::CopyToIDmaChannel::CopyFrom は DMA バッファーとの間でサンプル データをコピーします。 WaveCyclic ポート ドライバーは、アプリケーション バッファーとミニポート ドライバーの循環バッファーの間でオーディオ データをコピーするこれらのメソッドを呼び出します。

DMA バッファーは、必ずしもストリーミング データの転送に使用されるとは限りません。 WavePci ポート ドライバーの場合、ストリーミングされたデータは、散布図/収集マッピングの一覧としてミニポート ドライバーに配信されます (または、ミニポート ドライバーから取得されます)。 ただし、ミニポート ドライバーは引き続き、アダプター ドライバーと通信するための共有メモリ領域として DMA バッファーを使用することがあります。

ポート ドライバーは、DMA チャンネルの作成に使用できる機能をミニポート ドライバーに提供します。 ポート ドライバーの説明で特に明記されていない限り、ポート ドライバーから割り当てられた DMA オブジェクトを使用することは必ずしも必要ではありません。 ポート ドライバーには単純に、必要なメソッドをサポートする IDmaChannel インターフェイスへのポインターが必要です。 ポート ドライバーに必要な DMA チャンネル メソッドの一覧については、各ポート ドライバーのドキュメントを確認してください。

一般的には、ポート ドライバーが実装する DMA チャンネル割り当て関数を使用することが、最も簡単な方法です。 まれに、ミニポート ドライバーの開発者は、特定のアダプターの特別な要件を満たすために、独自の DMA チャンネル オブジェクトを実装する必要がある場合があります。 これには、新しいオブジェクトの実装が必要になることがあります。 それ以外の場合は、ミニポート ドライバーのストリーム オブジェクトに IDmaChannel インターフェイスを公開させ、DMA チャネル メソッド自体を実装するだけで十分です。

IDmaChannel インターフェイスでは、次のメソッドがサポートされています。

IDmaChannel::AllocateBuffer

IDmaChannel::AllocatedBufferSize

IDmaChannel::BufferSize

IDmaChannel::CopyFrom

IDmaChannel::CopyTo

IDmaChannel::FreeBuffer

IDmaChannel::GetAdapterObject

IDmaChannel::MaximumBufferSize

IDmaChannel::PhysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

IDmaChannelSlave インターフェイスは、次のメソッドを追加して IDmaChannel を拡張します。

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Start

IDmaChannelSlave::Stop

IDmaChannelSlave::WaitForTC