共用方式為


DMA 通道物件

備註

Microsoft支持多樣化的包容性環境。 本文包含術語的參考,Microsoft樣式指南可辨識為排除。 本文中會使用單字或片語來保持一致性,因為它目前會出現在軟體中。 當軟體更新以移除該語言時,本文也將進行更新以保持一致。

PortCls 系統驅動程式會實作 IDmaChannelIDmaChannelSlave 介面,以取得 WaveCyclic 和 WavePci 迷你埠驅動程式的優點。 IDmaChannel 代表 DMA 通道及其相關聯的 DMA 緩衝區和緩衝區使用量參數。 此外,WaveCyclic 迷你埠驅動程式會使用 IDmaChannelSlave 來管理次級裝置的 DMA 通道。 IDmaChannelSlave 繼承自 IDmaChannel。 如需控制 DMA 作業的相關資訊,請參閱 配接器物件和 DMA

IDmaChannel 物件封裝以下內容:

  • 主要或次級裝置的 DMA 通道

  • 與通道相關聯的資料緩衝區

  • 闡述通道使用方式的資訊

埠和迷你埠驅動程式會使用 DMA 通道物件來傳達 DMA 通道使用量的相關資訊。 一般而言,迷你埠驅動程式會在初始化期間或建立串流期間配置一組 DMA 通道。 在建立新資料串流期間,迷你埠驅動程式會告訴埠驅動程式哪個 DMA 通道物件將用於資料串流。

您可以為主要或次級裝置建立 DMA 通道物件:

  • 次級裝置沒有內建的 DMA 硬體功能,而且必須依賴系統 DMA 控制器來執行裝置所需的任何資料傳輸。

  • 主要裝置使用自己的匯流排主控 DMA 硬體,在系統匯流排上執行資料傳輸。

如需使用次級 DMA 通道物件的 WaveCyclic 裝置範例,請參閱舊版 Microsoft Windows 驅動程式套件 (WDK) 中的 Sb16 範例音訊驅動程式。 主要 DMA 通道物件只不過是背板,用於在埠和迷你埠驅動程式之間共用 DMA 通道的相關資訊。 如需主要和次級裝置的詳細資訊,請參閱 配接器物件簡介

主要或次級裝置的 DMA 通道物件會提供下列功能:

  • 配接器物件

  • 驅動程式和 DMA 硬體可以共用的單一通用緩衝區

  • 可查詢及變更的緩衝區大小值

配接器物件實體裝置物件 (PDO) 的 DMA 配接器結構。 當迷你埠驅動程式呼叫下列其中一個方法來建立 DMA 通道物件時,會自動建立配接器物件:

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

IDmaChannel::GetAdapterObject 方法可用來取得配接器物件的指標。

配接器驅動程式也可以呼叫 PcNewDmaChannel 函式來建立 DMA 通道物件,但此函式比 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 緩衝區或從 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::開始

IDmaChannelSlave::停止

IDmaChannelSlave::WaitForTC