SerCx2 System-DMA-Transmit 事务

某些串行控制器驱动程序实现对使用系统 DMA 控制器的传输事务的支持。 此类支持是可选的,但可以通过减轻main处理器对使用编程 I/O (PIO) 进行长时间数据传输的需求来提高性能。 SerCx2 通过设置系统 DMA 控制器并代表串行控制器驱动程序启动必要的 DMA 传输来执行系统 DMA 传输事务。

当串行控制器驱动程序创建 system-DMA-transmit 对象时,驱动程序将提供 SerCx2 将用于为系统 DMA 传输事务设置系统 DMA 适配器的参数。

在事务开始之前,串行控制器驱动程序可以选择对事务所需的串行控制器硬件或 DMA 适配器执行任何特殊设置。 事务完成后,驱动程序可以选择排出传输 FIFO,并在必要时清理串行控制器硬件状态。

创建 system-DMA-transmit 对象

在 SerCx2 可以调用串行控制器驱动程序的任何 EvtSerCx2SystemDmaTransmitXxx** 函数之前,驱动程序必须调用 SerCx2SystemDmaTransmitCreate 方法以将这些函数注册到 SerCx2。 此方法接受指向 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG 结构的指针作为输入参数,该结构包含指向驱动程序的 EvtSerCx2SystemDmaTransmitXxx** 函数的指针。

作为一个选项,驱动程序可以实现以下任何或所有函数:

作为选项,驱动程序可以实现以下函数:

实现上述列表中任何函数的驱动程序必须实现所有三个函数。

SerCx2SystemDmaTransmitCreate 方法创建 system-DMA-transmit 对象,并为调用驱动程序提供此对象的 SERCX2SYSTEMDMATRANSMIT 句柄。 驱动程序的 EvtSerCx2SystemDmaTransmitXxx** 函数都将此句柄作为其第一个参数。 以下 SerCx2 方法将此句柄作为其第一个参数:

硬件初始化和清理

某些串行控制器驱动程序可能需要在系统 DMA 传输事务开始时初始化串行控制器硬件,或者在事务结束时清理串行控制器的硬件状态。

如果驱动程序实现 EvtSerCx2SystemDmaTransmitInitializeTransaction 事件回调函数,SerCx2 将调用此函数来初始化串行控制器,然后再开始事务中的第一个 DMA 传输。 如果实现, EvtSerCx2SystemDmaTransmitInitializeTransaction 函数必须调用 SerCx2SystemDmaTransmitInitializeTransactionComplete 方法,以在驱动程序完成串行控制器初始化时通知 SerCx2。

如果驱动程序实现 EvtSerCx2SystemDmaTransmitCleanupTransaction 事件回调函数,则 SerCx2 调用此函数以在事务中最终 DMA 传输结束后清理硬件状态。 如果实现, EvtSerCx2SystemDmaTransmitInitializeTransaction 函数必须调用 SerCx2SystemDmaTransmitCleanupTransactionComplete 方法,以在驱动程序完成清理串行控制器时通知 SerCx2。

需要在系统-DMA 传输事务开始时执行系统 DMA 控制器的任何特殊配置的串行控制器驱动程序应实现 EvtSerCx2SystemDmaTransmitConfigureDmaChannel 事件回调函数。 此函数可以调用 SerCx2SystemDmaTransmitGetDmaEnabler 方法,以获取用于事务的系统 DMA 适配器的 DMA 启用器。 SerCx2 在事务中启动第一个 DMA 传输之前调用此函数。 有关 DMA 启用程序的详细信息,请参阅 启用 DMA 事务

排出和清除传输 FIFO

如果驱动程序可以检测到传输 FIFO 何时空出,则支持系统-DMA 传输事务的串行控制器驱动程序应实现 EvtSerCx2SystemDmaTransmitDrainFifo 事件回调函数。 如果实现,SerCx2 会在系统 DMA 传输事务中最后一字节的数据写入传输 FIFO 后调用此函数。 在此调用期间, EvtSerCx2SystemDmaTransmitDrainFifo 函数通常启用在传输 FIFO 清空时触发的中断,然后在不等待中断的情况下返回。 当 FIFO 清空时,驱动程序调用 SerCx2SystemDmaTransmitDrainFifoComplete 方法来通知 SerCx2。 只有在收到此通知后,SerCx2 才会完成挂起的写入 (IRP_MJ_WRITE 与 system-DMA-传输事务关联的) 请求。

如果串行控制器驱动程序未实现 EvtSerCx2SystemDmaTransmitDrainFifo 函数,则 SerCx2 必须完成挂起的写入请求,而无需先验证传输 FIFO 是否已清空。 无法保证写入 FIFO 的数据不会有明显延迟地传输。 写入请求完成后保留在 FIFO 中的任何数据在传输之前都可能会丢失。 在成功完成的写入请求中,这种意外的数据丢失可能会给发送请求的外围驱动程序造成可靠性问题。

实现 EvtSerCx2SystemDmaTransmitDrainFifo 函数的驱动程序还必须实现 EvtSerCx2SystemDmaTransmitCancelDrainFifoEvtSerCx2SystemDmaTransmitPurgeFifo 事件回调函数。

EvtSerCx2SystemDmaTransmitCancelDrainFifo 函数允许 SerCx2 在操作完成之前取消正在进行的 FIFO 排出操作。 如果写入请求被取消,或者串行控制器即将退出 D0 设备电源状态以进入低功耗状态,SerCx2 可能会取消此操作。 如果 EvtSerCx2SystemDmaTransmitCancelDrainFifo 函数成功取消 FIFO-drain 操作,则此函数返回 TRUE。 返回值为 TRUE 可保证 EvtSerCx2SystemDmaTransmitDrainFifo 函数将返回,而无需先调用 SerCx2SystemDmaTransmitDrainFifoComplete。 返回值为 FALSE 表示 EvtSerCx2SystemDmaTransmitDrainFifo 函数已调用或将调用 SerCx2SystemDmaTransmitDrainFifoComplete

如果与 system-DMA-传输事务关联的写入请求在完成之前被取消或超时,SerCx2 会调用 EvtSerCx2SystemDmaTransmitPurgeFifo 函数(如果已实现),以放弃可能保留传输 FIFO 的任何未发送数据。 清除 FIFO 时, EvtSerCx2SystemDmaTransmitPurgeFifo 函数调用 SerCx2SystemDmaTransmitPurgeFifoComplete 方法来通知 SerCx2。 只有在收到此通知后,SerCx2 才会启动新的 I/O 事务。