SerCx2 System-DMA-Receive 事务

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

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

在开始系统-DMA-receive 事务之前,串行控制器驱动程序可以选择对事务可能需要的串行控制器硬件或 DMA 适配器进行任何特殊设置。 事务完成后,驱动程序可以在必要时对可能需要的串行控制器硬件状态执行任何清理。

创建 system-DMA-receive 对象

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

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

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

实现上述列表中的两个函数之一的驱动程序必须同时实现这两个函数。

SerCx2SystemDmaReceiveCreate 方法创建 system-DMA-receive 对象,并为调用驱动程序提供此对象的 SERCX2SYSTEMDMARECEIVE 句柄。 驱动程序的 EvtSerCx2SystemDmaReceiveXxx** 函数均将此句柄作为其第一个参数。 以下 SerCx2 方法将此句柄作为其第一个参数:

硬件初始化和清理

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

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

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

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

新数据通知

作为一个选项,串行控制器驱动程序可以实现 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 事件回调函数。 如果实现,SerCx2 使用此函数在处理作为系统-DMA 接收事务处理的读取请求期间有效地管理间隔超时。

如果串行控制器接收的两个连续字节之间的间隔超过客户端指定的最大时间,则会发生间隔超时。 在外围驱动程序向 SerCx2 发送读取请求后,除非从串行连接的外围设备收到至少一个字节的数据,否则无法发生间隔超时。 从读取请求到达到从外围设备接收第一个字节数据之间的时间可能明显长于在收到第一个字节后接收读取请求的其余数据所需的时间。 有关详细信息,请参阅 SERIAL_TIMEOUTS

SerCx2 调用 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 函数(如果已实现),以启用 新数据通知。 如果启用此通知,并且串行控制器从外围设备接收一个或多个字节的新数据,或者其接收 FIFO 中已有数据,则串行控制器驱动程序必须调用 SerCx2SystemDmaReceiveNewDataNotification 方法来通知 SerCx2。

为了检测可能的间隔超时,SerCx2 会定期调用系统 DMA 适配器的 ReadDmaCounter 例程,以检查在上述间隔期间是否收到任何数据。 SerCx2 如何检测第一个字节的数据接收取决于串行控制器驱动程序是否实现 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 函数。 如果实现了此函数,SerCx2 将调用该函数以启用新数据通知,并在收到数据的第一个字节时由驱动程序通知。 否则,SerCx2 会定期调用 ReadDmaCounter 来检测第一个字节的接收情况,并且可能需要定期唤醒处理器才能进行这些调用。 因此,实现 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 函数的驱动程序可以通过不要求处理器频繁唤醒来降低功耗。

注意 SerCx2 依赖于系统 DMA 适配器的 ReadDmaCounter 例程来监视系统 DMA 接收事务和系统 DMA 传输事务期间的超时。 硬件抽象层 (HAL) 必须为系统 DMA 控制器实现一个功能齐全的 ReadDmaCounter 例程,该控制器用于向串行控制器和从串行控制器传输数据。

支持 system-DMA-receive 事务的新数据通知的串行控制器驱动程序必须实现 EvtSerCx2SystemDmaReceiveCancelNewDataNotification 事件回调函数,以便 SerCx2 可以在发生已启用的新数据通知之前取消该通知。 如果在取消挂起的读取请求或发生总超时时启用了 new-data 通知,则 SerCx2 调用 EvtSerCx2SystemDmaReceiveCancelNewDataNotification 函数来取消通知。 如果此函数成功取消挂起的通知,则返回 TRUE。 返回值 TRUE 可保证串行控制器驱动程序不会调用 SerCx2SystemDmaReceiveNewDataNotification。 返回值 FALSE 表示驱动程序已调用或即将调用 SerCx2SystemDmaReceiveNewDataNotification。 有关总超时的详细信息,请参阅 SERIAL_TIMEOUTS