DMA 通道物件

注意

Microsoft 支援多元且包容性的環境。 本文包含 無偏差通訊的 Microsoft 樣式指南 辨識為排除詞彙的參考。 本文中會使用單字或片語來保持一致性,因為它目前會出現在軟體中。 當軟體更新為移除語言時,本文將會更新為一致。

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

IDmaChannel物件會封裝下列專案:

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

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

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

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

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

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

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

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

主要或次級裝置的 DMA 通道物件會公開下列內容:

  • 配接器物件

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

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

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

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSystemeDmaChannel

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

配接器驅動程式也可以呼叫 PcNewDmaChannel 函式來建立 DMA 通道物件,但此函式比 IPortWaveXxx::NewXxxDmaChannel 呼叫更困難,因為呼叫端必須明確指定裝置物件和其他內容資訊。

如果是從屬裝置的 DMA 通道,IDmaChannel::TransferCount方法會傳回 mapSize) 參數 (呼叫IDmaChannelAlle::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::P hysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

IDmaChannel以新增下列方法來擴充IDmaChannel

IDmaChannelSysteme::ReadCounter

IDmaChannelSchedulee::Start

IDmaChannelSchedulee::Stop

IDmaChannelGeneratione::WaitForTC