支持系统模式 DMA

[仅适用于 KMDF]

总线主 DMA 相比,系统模式 DMA 描述了一种配置,其中多个设备共享单个(通常是多通道)DMA 控制器。

从 Kernel-Mode Driver Framework (KMDF) 版本 1.11 开始,该框架支持在 Windows 8 或更高版本的 Windows 操作系统上运行的基于 Windows 8 或更高版本的基于系统的芯片 (So) C 上的系统上的系统模式 DMA。

本主题介绍 KMDF 驱动程序必须在其事件回调函数中提供的代码,以及它可以注册的可选事件回调函数,以处理系统模式 DMA 设备的 I/O 请求。

有关 KMDF 和总线主 DMA 的信息,请参阅 处理 Bus-Master DMA 设备的 KMDF 驱动程序中的 I/O 请求

下图显示了驱动程序用于支持系统模式 DMA 的事件回调函数:

显示 KMDF 驱动程序中系统模式 DMA 实现的事件回调函数的流程图。

创建 System-Mode DMA 启用程序

创建系统模式 DMA 配置文件的过程分为两步。 以下步骤表示一个典型方案:

  1. 通常,在其 EvtDriverDeviceAdd 回调函数中,驱动程序调用 WDF_DMA_ENABLER_CONFIG_INIT,将 Profile 参数设置为 SystemModeSystemModeDuplex。 然后,驱动程序调用 WdfDmaEnablerCreate,传递它刚刚收到的 WDF_DMA_ENABLER_CONFIG 结构。

    驱动程序还可以在 EvtDevicePrepareHardware 期间创建启用程序。

  2. 驱动程序的 EvtDevicePrepareHardware 回调函数通过调用 WdfDmaEnablerConfigureSystemProfile 方法将 DMA 启用程序与其 DMA 资源相关联。 对于双工启用器,驱动程序调用 WdfDmaEnablerConfigureSystemProfile 两次,一次以配置每个传输方向。

    EvtDevicePrepareHardware 完成后,驱动程序可以调用 WdfDmaEnablerConfigureSystemProfile,但驱动程序必须在初始化 DMA 事务之前调用此方法。

提供可选的回调函数

通常,KMDF 驱动程序不配置 DMA 通道。 但是,在某些情况下,驱动程序可能需要执行特定于通道的配置。 例如,驱动程序可以使用以下步骤调用由 DMA 控制器实现的自定义函数:

  1. 在驱动程序 的请求处理程序之一中,驱动程序调用 WdfDmaTransactionSetChannelConfigurationCallback 来注册 EvtDmaTransactionConfigureDmaChannel 回调函数。
  2. 驱动程序的 EvtDmaTransactionConfigureDmaChannel 回调函数调用 WdfDmaEnablerWdmGetDmaAdapter 以检索指向 WDM DMA_ADAPTER的指针。 此结构是表示驱动程序的系统模式 DMA 通道的适配器对象。
  3. 然后,驱动程序可以调用 ConfigureAdapterChannel 来启用由 DMA 控制器实现的自定义函数。 此例程只能由 DMA_OPERATIONS结构中 返回的地址中的指针调用。
  4. 如果驱动程序的 EvtDmaTransactionConfigureDmaChannel 回调函数成功配置 DMA 通道,则返回 TRUE。
  5. 框架调用驱动程序的 EvtProgramDma 回调函数。

接收传输完成通知

与使用总线主控控制器的设备不同,系统模式 DMA 设备的硬件可能不会通过发出中断来发出 DMA 传输完成的信号。

如果设备未引发中断以指示 DMA 传输完成,则驱动程序可以提供 EvtDmaTransactionDmaTransferComplete 事件回调函数,供框架在系统模式 DMA 传输完成时调用。

若要注册此回调函数,驱动程序从其请求处理程序之一调用 WdfDmaTransactionSetTransferCompleteCallback