启用 DMA 事务
[仅适用于 KMDF]
如果基于框架的驱动程序处理 DMA 设备的 I/O 操作,则驱动程序必须为每个 DMA 设备启用框架的 DMA 功能。 若要启用这些功能,驱动程序的 EvtDriverDeviceAdd 或 EvtDevicePrepareHardware 回调函数必须:
调用 WdfDeviceSetAlignmentRequirement 以指定设备的缓冲区对齐要求。
调用 WdfDmaEnablerCreate 以指定 DMA 操作的类型 (单个数据包或散点/收集) 以及设备支持的最大传输大小。 从 KMDF 版本 1.11 开始,该框架支持在操作系统的 Windows 8 或更高版本上运行的基于芯片 (SoC) 的系统上的系统模式 DMA。
调用 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 结构的指针。 但是,大多数基于框架的驱动程序不需要访问这些结构。