SerCx2SystemDmaTransmitCreate 函数 (sercx.h)

SerCx2SystemDmaTransmitCreate 方法创建 SerCx2 system-DMA-transmit 对象,该对象是串行框架扩展版本 2(SerCx2)用于执行系统-DMA 传输事务。

语法

NTSTATUS SerCx2SystemDmaTransmitCreate(
  [in]           WDFDEVICE                          Device,
  [in]           PSERCX2_SYSTEM_DMA_TRANSMIT_CONFIG SystemDmaTransmitConfig,
  [in, optional] PWDF_OBJECT_ATTRIBUTES             Attributes,
  [out]          SERCX2SYSTEMDMATRANSMIT            *SystemDmaTransmit
);

参数

[in] Device

表示串行控制器的框架设备对象的 WDFDEVICE 句柄。 串行控制器驱动程序在其 EvtDriverDeviceAdd 回调函数中创建此对象。 有关详细信息,请参阅 SerCx2InitializeDevice

[in] SystemDmaTransmitConfig

指向 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG 结构的指针。 调用此方法之前,调用方必须调用 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG_INIT 函数来初始化结构。 此结构包含指向由串行控制器驱动程序实现的一组事件回调例程的指针。 SerCx2 调用这些函数来执行系统 DMA 传输事务。

[in, optional] Attributes

指向 WDF_OBJECT_ATTRIBUTES 结构的指针,该结构描述要分配给新的 system-DMA 传输对象的属性。 调用此方法之前,调用方必须调用 WDF_OBJECT_ATTRIBUTES_INIT 函数来初始化结构。 此参数是可选的,如果串行控制器驱动程序不需要向对象分配属性,则可以指定为WDF_NO_OBJECT_ATTRIBUTES。 有关详细信息,请参阅“备注”。

[out] SystemDmaTransmit

指向此方法将 SERCX2SYSTEMDMATRANSMIT 句柄写入到新创建的 system-DMA 传输对象的位置的指针。 SerCx2 和串行控制器驱动程序在后续调用中使用此句柄来引用此对象。

返回值

如果调用成功,此方法将返回STATUS_SUCCESS。 可能的错误返回值包括以下状态代码。

返回代码 描述
STATUS_INVALID_DEVICE_REQUEST
系统-DMA 传输对象已存在于以前的 SerCx2SystemDmaTransmitCreate 调用中;或从先前对 SerCx2CustomTransmitCreate 方法的调用存在自定义传输对象;或自定义接收对象存在于对 SerCx2CustomReceiveCreate 方法的上一次调用中;或 SerCx2PioTransmitCreate 尚未调用以创建 PIO 传输对象。
STATUS_INFO_LENGTH_MISMATCH
ConfigSize 值不等于sizeof (SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG)。
STATUS_INVALID_PARAMETER
参数值无效。
STATUS_INSUFFICIENT_RESOURCES
资源不足,无法创建 system-DMA-transmit 对象。

言论

串行控制器驱动程序可以通过此方法创建 system-DMA-transmit 对象。 SerCx2 使用此对象执行 system-DMA 传输事务,即使用系统 DMA 控制器将数据写入要传输的串行控制器的事务。

通常,串行控制器驱动程序从其 EvtDevicePrepareHardware 回调函数调用 SerCx2SystemDmaTransmitCreate。 此函数接收硬件资源列表,其中包括系统 DMA 通道。

串行控制器驱动程序必须在调用 SerCx2SystemDmaTransmitCreate之前成功调用 SerCx2InitializeDeviceSerCx2PioTransmitCreate 方法。

在调用 SerCx2SystemDmaTransmitCreate之前,串行控制器驱动程序必须调用 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG_INIT 函数来初始化由 SystemDmaTransmitConfig指向的 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG 结构。 此函数将结构的以下成员设置为零:

  • MaximumScatterGatherFragments
  • MinimumTransferUnitOverride
  • DmaAlignment
  • MinimumTransactionLength
  • 独占
如有必要,串行控制器驱动程序可以在初始化函数返回后将这些成员中的任何一个设置为非零值。 但是,为方便起见,SerCx2SystemDmaTransmitCreate 如果这些成员为零,则使用以下默认值:
  • 如果 MaximumScatterGatherFragments 为零,则 SerCx2 会将散点/收集列表中的最大元素数设置为 (ULONG)-1。
  • 如果 MinimumTransferUnitOverride 为零,则 SerCx2 会将最小传输单元设置为其默认值,该值在系统 DMA 控制器的 DMA_ADAPTER 结构中指定。 有关此结构的详细信息,请参阅 WdfDmaEnablerWdmGetDmaAdapter
  • 如果 DmaAlignment 为零,则 SerCx2 会将对齐值设置为最小传输单位。 如果 MinimumTransferUnitOverride 为零,则使用默认最小传输单位。
  • 如果 MinimumTransactionLength 为零,则 SerCx2 会将最小事务长度设置为一个字节。
  • 如果 独占 为零(FALSE),则禁用排他模式。
如果调用驱动程序 将独占 设置为 TRUE,则 MinimumTransferUnitOverrideDmaAlignmentMinimumTransactionLength 成员必须为零。 有关详细信息,请参阅 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG

如果实现的回调函数的指定组合无效,SerCx2SystemDmaTransmitCreate 失败并返回STATUS_INVALID_PARAMETER。 驱动程序必须实现 EvtSerCx2SystemDmaTransmitDrainFifoEvtSerCx2SystemDmaTransmitCancelDrainFifoEvtSerCx2SystemDmaTransmitPurgeFifo 函数的所有三个或三个都不实现。

作为一个选项,串行控制器驱动程序可以使用 Attributes 参数为 system-DMA 传输对象创建上下文,并提供指向 EvtCleanupCallbackEvtDestroyCallback 函数的指针,这些函数被调用以准备要删除的对象。 有关详细信息,请参阅 WDF_OBJECT_ATTRIBUTES

如果 属性 参数指向 WDF_OBJECT_ATTRIBUTES 结构,则调用方不得覆盖 WDF_OBJECT_ATTRIBUTES_INIT 初始化函数写入 ParentObjectExecutionLevel以及 SynchronizationScope 成员的值。

有关创建系统-DMA 传输对象的详细信息,请参阅 SERCX2SYSTEMDMATRANSMIT。 有关系统-DMA 传输事务的详细信息,请参阅 SerCx2 System-DMA-Transmit 事务

要求

要求 价值
最低支持的客户端 从Windows 8.1开始可用。
目标平台 普遍
标头 sercx.h
IRQL PASSIVE_LEVEL

另请参阅

DMA_ADAPTER

EvtCleanupCallback

EvtDestroyCallback

EvtDevicePrepareHardware

EvtDriverDeviceAdd

EvtSerCx2SystemDmaTransmitCancelDrainFifo

EvtSerCx2SystemDmaTransmitCleanupTransaction

EvtSerCx2SystemDmaTransmitDrainFifo

EvtSerCx2SystemDmaTransmitInitializeTransaction

EvtSerCx2SystemDmaTransmitPurgeFifo

SERCX2SYSTEMDMATRANSMIT

SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG

SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG_INIT

SerCx2InitializeDevice

SerCx2PioTransmitCreate

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT

WdfDmaEnablerWdmGetDmaAdapter