共用方式為


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::BufferSize 和 IDmaChannel::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::P hysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

IDmaChannelSlave 介面會藉由新增下列方法來擴充 IDmaChannel

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Start

IDmaChannelSlave::Stop

IDmaChannelSlave::WaitForTC