共用方式為


AVStream 中的封包型 DMA

封包型直接記憶體存取 (DMA) 發生于迷你驅動程式直接讀取資料,並直接寫入資料,以擷取從使用者模式接收的緩衝區。 Windows 驅動程式套件 (WDK) 範例中的 AVStream 模擬硬體範例驅動程式 (AVSHwS) 示範如何建置執行這種 DMA 類型的 AVStream 迷你驅動程式。

若要實作封包型 DMA 配置:

  1. 在相關KSPIN_DESCRIPTOR_EX結構的 Flags 成員中指定 KSPIN_FLAG_GENERATE_MAPPINGS 。 請注意,只有具有散佈/收集支援的匯流排主機才應該使用此旗標。

  2. (ISR) 註冊插斷服務常式,如 撰寫硬體的 AVStream Minidrivers中所述。

然後在 AVStrMiniDeviceStart 開始分派中:

  1. 使用 IoGetDmaAdapter 設定 DMA配接器物件。

  2. 呼叫 KsDeviceRegisterAdapterObject,向 AVStream 註冊 DMA 配接器物件。

minidriver 會在呼叫KsDeviceRegisterAdapterObject時提供MaxMappingByteCount參數,以指定單一散佈/收集對應的大小上限。

如果有任何散佈/收集對應超過此大小上限,AVStream 會自動將對應分成數個散佈/收集對應,每個對應都不超過 MaxMappingByteCount中指定的大小。

您也必須提供 AVStrMiniPinProcess 回呼常式。 驅動程式寫入器應該為此回呼選擇適當的功能。 例如,您可以執行下列動作:

  1. 呼叫 KsPinGetLeadingEdgeStreamPointer

  2. 呼叫 KsStreamPointerClone以複製前置邊緣。

  3. 根據複製來程式 DMA 硬體。

  4. 呼叫 KsStreamPointerAdvanceOffsetsKsStreamPointerAdvance 以前進前置邊緣。

  5. 視需要針對其他畫面格重複步驟 2。

當硬體中斷 DMA 完成時,核心會呼叫廠商先前註冊的 ISR。 在 ISR 中,迷你驅動程式會將延遲程序呼叫排入佇列, (DPC) 。

您的 DPC 應該更新 DataUsed ,而且可能更新 KSSTREAM_HEADER 結構的其他成員。 DPC 接著可能會呼叫 KsStreamPointerDelete 來刪除複製並釋放相關聯的框架。

或者,如果只有框架的一部分完成,DPC 可以前進複製指標。 若要這樣做,請呼叫 KsStreamPointerAdvanceOffsets

如果需要繼續處理,請呼叫 KsPinAttemptProcessing

注意

如果對應長度小於一個實體頁面,則不保證位於單一實體頁面上。