支援 System-Mode DMA
[僅適用于 KMDF]
系統模式 DMA 與 匯流排主機 DMA 相反,描述多個裝置共用單一通道 DMA 控制器的設定。
從 Kernel-Mode Driver Framework (KMDF) 1.11 版開始,架構支援在晶片 (SoC) 系統上的系統模式 DMA,這些系統是以 Windows 8 或更新版本的 Windows 作業系統執行。
本主題描述 KMDF 驅動程式在其事件回呼函式中必須提供的程式碼,以及可註冊的選擇性事件回呼函式,以處理系統模式 DMA 裝置的 I/O 要求。
如需 KMDF 和匯流排主機 DMA 的相關資訊,請參閱 處理適用于 Bus-Master DMA 裝置之 KMDF 驅動程式中的 I/O 要求。
下圖顯示驅動程式用來支援系統模式 DMA 的事件回呼函式:
建立 System-Mode DMA 啟用者
建立系統模式 DMA 設定檔是兩個步驟的程式。 下列步驟代表典型的案例:
通常在其 EvtDriverDeviceAdd 回呼函式中,驅動程式會呼叫 WDF_DMA_ENABLER_CONFIG_INIT,並將 Profile 參數設定為 SystemMode 或 SystemModeDuplex。 然後驅動程式會呼叫 WdfDmaEnablerCreate,並傳遞它剛收到的 WDF_DMA_ENABLER_CONFIG 結構。
驅動程式可能會在 EvtDevicePrepareHardware期間建立啟用程式。
驅動程式的 EvtDevicePrepareHardware 回呼函式會呼叫 WdfDmaEnablerConfigureSystemProfile 方法,將 DMA 啟用器與其 DMA 資源產生關聯。 針對雙工啟用程式,驅動程式會呼叫 WdfDmaEnablerConfigureSystemProfile 兩次,一次來設定每個傳輸方向。
驅動程式可以在EvtDevicePrepareHardware完成之後呼叫WdfDmaEnablerConfigureSystemProfile,但驅動程式必須先呼叫這個方法,才能初始化 DMA 交易。
提供選擇性回呼函式
一般而言,KMDF 驅動程式不會設定 DMA 通道。 不過,在某些情況下,驅動程式可能需要執行通道特定設定。 例如,驅動程式可能會使用下列步驟呼叫 DMA 控制器所實作的自訂函式:
- 在驅動程式的其中一個 要求處理常式中,驅動程式會呼叫 WdfDmaTransactionSetChannelConfigurationCallback 來註冊 EvtDmaTransactionConfigureDmaChannel 回呼函式。
- 驅動程式的 EvtDmaTransactionConfigureDmaChannel 回呼函式會呼叫 WdfDmaEnablerWdmGetDmaAdapter ,以擷取 WDM DMA_ADAPTER的指標。 這個結構是代表驅動程式系統模式 DMA 通道的配接器物件。
- 然後,驅動程式可以呼叫 ConfigureAdapterChannel ,以啟用 DMA 控制器所實作的自訂函式。 這個常式只能由 DMA_OPERATIONS結構中 傳回之位址的指標呼叫。
- 如果驅動程式成功設定 DMA 通道,驅動程式的 EvtDmaTransactionConfigureDmaChannel 回呼函式會傳回 TRUE。
- 架構會呼叫驅動程式的 EvtProgramDma 回呼函式。
接收傳送完成通知
不同于使用匯流排主控控制器的裝置,系統模式 DMA 裝置的硬體可能不會發出中斷來發出 DMA 傳輸完成訊號。
如果您的裝置未引發中斷以發出 DMA 傳輸完成的訊號,驅動程式可以提供當系統模式 DMA 傳輸完成時,架構呼叫的 EvtDmaTransactionDmaTransactionDmaTransferComplete 事件回呼函式。
若要註冊此回呼函式,驅動程式會從其中一個要求處理常式呼叫WdfDmaTransactionSetTransferCompleteCallback。