创建并初始化 DMA 事务
[仅适用于 KMDF]
在驱动程序可以将 I/O 请求发送到 DMA 设备之前,驱动程序必须:
调用 WdfDmaTransactionCreate 为请求创建 DMA 事务对象。
调用 WdfDmaTransactionInitializeUsingRequest、 WdfDmaTransactionInitialize 或 WdfDmaTransactionInitializeUsingOffset 来初始化事务对象。
通常,驱动程序会创建 DMA 事务 ,因为 请求处理程序 已收到 框架请求对象 ,并且必须将请求传递给硬件。 在这种情况下,驱动程序应调用 WdfDmaTransactionInitializeUsingRequest,后者接受请求对象句柄作为输入,并从请求对象中提取请求的地址参数。
如果驱动程序必须创建 不 基于驱动程序收到的框架请求对象的 DMA 事务,则驱动程序可以调用 WdfDmaTransactionInitialize 或 WdfDmaTransactionInitializeUsingOffset。 这两种方法都接受驱动程序提供的地址参数。
所有三种初始化方法都需要 EvtProgramDma 事件回调函数的地址作为输入参数。 此回调函数对设备进行程序,并且每次 DMA 传输 可用时,框架都会调用回调函数。
当驱动程序调用 WdfDmaEnablerCreate 来创建 DMA 启用程序对象时,驱动程序将提供包含设备最大传输长度的 WDF_DMA_ENABLER_CONFIG 结构。 框架使用此值作为所有 DMA 传输的默认最大长度。
对于某些类型的 DMA 事务,可能需要指定与设备的默认最大长度不同的最大传输长度。 可以使用 WdfDmaTransactionSetMaximumLength 设置单个事务的最大传输长度。 框架仅在处理指定的事务时使用指定的最大传输长度。
请注意,最大传输长度受操作系统提供给 DMA 启用程序对象的 映射寄存器 数的限制。 若要确定可用的最大传输长度,驱动程序可以调用 WdfDmaEnablerGetFragmentLength。 如果 WdfDmaEnablerGetFragmentLength 返回的值小于驱动程序提供给 WdfDmaEnablerCreate 的最大传输长度,则框架使用较小的值。
在驱动程序创建并初始化 DMA 事务后,驱动程序必须 启动该事务。