启用 DMA 事务

[仅适用于 KMDF]

如果基于框架的驱动程序处理 DMA 设备的 I/O 操作,则驱动程序必须为每个 DMA 设备启用框架的 DMA 功能。 若要启用这些功能,驱动程序的 EvtDriverDeviceAddEvtDevicePrepareHardware 回调函数必须:

  1. 调用 WdfDeviceSetAlignmentRequirement 以指定设备的缓冲区对齐要求。

  2. 调用 WdfDmaEnablerCreate 以指定 DMA 操作的类型 (单个数据包或散点/收集) 以及设备支持的最大传输大小。 从 KMDF 版本 1.11 开始,该框架支持在操作系统的 Windows 8 或更高版本上运行的基于芯片 (SoC) 的系统上的系统模式 DMA

  3. 调用 WdfDmaEnablerSetMaximumScatterGatherElements 以指定设备可在散点/收集列表中支持的最大元素数(如果设备支持散点/收集操作)。

PLX9x5x 示例中的以下代码示例演示了如何启用框架的 DMA 功能。 此代码显示在 Init.c 文件中

WDF_DMA_ENABLER_CONFIG   dmaConfig;

WdfDeviceSetAlignmentRequirement( DevExt->Device, PCI9656_DTE_ALIGNMENT_16 );
WDF_DMA_ENABLER_CONFIG_INIT( &dmaConfig,
                             WdfDmaProfileScatterGather64Duplex,
                             DevExt->MaximumTransferLength );
status = WdfDmaEnablerCreate( DevExt->Device,
                              &dmaConfig, 
                              WDF_NO_OBJECT_ATTRIBUTES,
                              &DevExt->DmaEnabler );

如果驱动程序需要通用缓冲区,驱动程序的 EvtDriverDeviceAdd 回调函数通常会设置它们。 有关这些缓冲区的详细信息,请参阅 使用通用缓冲区

驱动程序调用 WdfDmaEnablerCreate 后,它可以调用 WdfDmaEnablerWdmGetDmaAdapter 以获取指向框架为设备的输入和输出方向创建的 WDM DMA_ADAPTER 结构的指针。 但是,大多数基于框架的驱动程序不需要访问这些结构。