支持系统模式 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 的事件回调函数:
创建 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结构中 返回的地址中的指针调用。
- 如果驱动程序的 EvtDmaTransactionConfigureDmaChannel 回调函数成功配置 DMA 通道,则返回 TRUE。
- 框架调用驱动程序的 EvtProgramDma 回调函数。
接收传输完成通知
与使用总线主控控制器的设备不同,系统模式 DMA 设备的硬件可能不会通过发出中断来发出 DMA 传输完成的信号。
如果设备未引发中断以指示 DMA 传输完成,则驱动程序可以提供 EvtDmaTransactionDmaTransferComplete 事件回调函数,供框架在系统模式 DMA 传输完成时调用。
若要注册此回调函数,驱动程序从其请求处理程序之一调用 WdfDmaTransactionSetTransferCompleteCallback。