共用方式為


建立和初始化 DMA 交易

[僅適用于 KMDF]

在驅動程式可以將 I/O 要求傳送至 DMA 裝置之前,驅動程式必須:

  1. 呼叫 WdfDmaTransactionCreate 以建立要求的 DMA 交易對象。

  2. 呼叫 WdfDmaTransactionInitializeUsingRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingOffset 來初始化交易對象。

一般而言,您的驅動程式會建立 DMA 交易 ,因為 要求處理常式 已收到 架構要求物件 ,而且必須將要求傳遞至硬體。 在此情況下,驅動程式應該呼叫 WdfDmaTransactionInitializeUsingRequest,以接受要求物件控制碼做為輸入,並從要求物件擷取要求的位址參數。

如果您的驅動程式必須建立 不是 以驅動程式收到的架構要求物件為基礎的 DMA 交易,驅動程式可以呼叫 WdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingOffset。 這兩種方法都接受驅動程式提供的位址參數。

這三個初始化方法都需要 EvtProgramDma 事件回呼函式的位址作為輸入參數。 此回呼函式會程式設計裝置,而架構會在每次有 DMA 傳輸 可用時呼叫回呼函式。

當您的驅動程式呼叫 WdfDmaEnablerCreate 以建立 DMA 啟用器物件時,驅動程式會提供包含裝置最大傳輸長度 的WDF_DMA_ENABLER_CONFIG 結構。 架構會使用此值作為所有 DMA 傳輸的預設最大長度。

針對某些類型的 DMA 交易,您可能需要指定與裝置預設最大長度不同的傳輸長度上限。 您可以使用 WdfDmaTransactionSetMaximumLength 來設定個別交易的最大傳輸長度。 架構只會在處理指定的交易時使用指定的傳輸長度上限。

請注意,傳輸長度上限受限於作業系統提供給 DMA 啟用者物件的 地圖暫存器 數目。 若要判斷可用的傳輸長度上限,您的驅動程式可以呼叫 WdfDmaEnablerGetFragmentLength。 如果 WdfDmaEnablerGetFragmentLength 傳回的值小於驅動程式提供給 WdfDmaEnablerCreate的最大傳輸長度,架構會使用較小的值。

在驅動程式建立並初始化 DMA 交易之後,驅動程式必須 啟動交易