SerCx2 PIO-Transmit 事务

SerCx2 要求所有串行控制器驱动程序实现对使用编程 I/O (PIO) 的传输事务的支持。 为了启动 PIO 传输事务,SerCx2 调用驱动程序的 EvtSerCx2PioTransmitWriteBuffer 事件回调函数,并提供写入缓冲区作为参数。

在此调用期间, EvtSerCx2PioTransmitWriteBuffer 函数将数据从写入缓冲区传输到串行控制器硬件中的传输 FIFO。 此数据传输会一直持续到写入缓冲区为空或传输 FIFO 无法立即接受更多数据为止。 传输结束时,函数返回从写入缓冲区成功传输到 FIFO 的字节数。

创建 PIO 传输对象

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

驱动程序需要实现以下所有三个函数:

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

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

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

SerCx2PioTransmitCreate 方法创建 PIO 传输对象,并为调用驱动程序提供此对象的 SERCX2PIOTRANSMIT 句柄。 驱动程序的 EvtSerCx2PioTransmitXxx** 函数都将此句柄作为其第一个参数。 以下 SerCx2 方法将此句柄作为其第一个参数:

硬件初始化和清理

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

如果驱动程序实现 EvtSerCx2PioTransmitInitializeTransaction 事件回调函数,SerCx2 将调用此函数以在启动事务的 EvtSerCx2PioTransmitWriteBuffer 调用之前初始化串行控制器。 如果实现, EvtSerCx2PioTransmitInitializeTransaction 函数必须调用 SerCx2PioTransmitInitializeTransactionComplete 方法,以在驱动程序完成串行控制器初始化时通知 SerCx2。

如果驱动程序实现 EvtSerCx2PioTransmitCleanupTransaction 事件回调函数,则 SerCx2 将调用此函数以在事务中最终 EvtSerCx2PioTransmitWriteBuffer 调用后清理硬件状态。 如果实现, EvtSerCx2PioTransmitInitializeTransaction 函数必须调用 SerCx2PioTransmitCleanupTransactionComplete 方法,以在驱动程序完成清理串行控制器时通知 SerCx2。

排出和清除传输 FIFO

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

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

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

EvtSerCx2PioTransmitCancelDrainFifo 函数使 SerCx2 能够在操作完成之前取消正在进行的 FIFO-drain 操作。 如果写入请求超时或已取消,SerCx2 可能会取消此操作。 如果 EvtSerCx2PioTransmitCancelDrainFifo 函数成功取消 FIFO-drain 操作,则此函数返回 TRUE返回值为 TRUE 可保证串行控制器驱动程序未调用且不会调用 SerCx2PioTransmitDrainFifoComplete。 返回值为 FALSE 表示 EvtSerCx2PioTransmitDrainFifo 函数已调用或即将调用 SerCx2PioTransmitDrainFifoComplete

如果与 PIO 传输事务关联的写入请求在完成之前被取消或超时,SerCx2 会调用 EvtSerCx2PioTransmitPurgeFifo 函数(如果已实现),以放弃可能保留传输 FIFO 的任何未发送数据。 SerCx2 使用它从此函数获取的信息来告诉外围驱动程序写入请求成功传输到外围设备的数据字节数。

就绪通知

EvtSerCx2PioTransmitWriteBuffer 调用由于传输 FIFO 无法立即接受更多数据而结束时,SerCx2 必须等待完成 PIO 接收事务,直到 FIFO 准备好接受更多数据。 在这种情况下,SerCx2 调用 EvtSerCx2PioTransmitEnableReadyNotification 事件回调函数,使串行控制器驱动程序能够发送就绪通知。 如果启用此通知,则串行控制器驱动程序会调用 SerCx2PioTransmitReady 方法,以便在驱动程序检测到传输 FIFO 准备就绪时通知 SerCx2 接受更多数据。 为了响应此通知,SerCx2 调用 EvtSerCx2PioTransmitWriteBuffer 函数将更多数据写入 FIFO。

如果在写入请求超时或取消时启用就绪通知,SerCx2 将调用 EvtSerCx2PioTransmitCancelReadyNotification 事件回调函数来取消挂起的通知。 如果此函数成功取消挂起的通知,则返回 TRUE。 返回值为 TRUE 可保证串行控制器驱动程序不会调用 SerCx2PioTransmitReady。 返回值为 FALSE 表示 EvtSerCx2PioTransmitDrainFifo 函数已调用或将调用 SerCx2PioTransmitReady