SerCx2 I/O 事务概述
SerCx2 通过向串行控制器驱动程序发出一个或多个 I/O 事务来处理来自客户端的读取或写入请求。 此驱动程序将每个事务视为在串行控制器与请求中的数据缓冲区之间传输数据的自包含 I/O 操作。
芯片 (SoC) 集成电路上的系统通常包括串行控制器 (或 UART) ,以实现与焊接到同一印刷线路板的其他集成电路的高速串行通信。 这些 SoC 上的处理器可以使用编程的 I/O (PIO) 直接向/从这些串行控制器中的内存映射数据寄存器传输数据。 此外,这些 SoC 通常提供高级 DMA 硬件,用于在串行控制器和内存之间移动数据。
PIO 对于短时间数据传输可能已足够,但在高数据速率下使用 PIO 进行较长的传输会给处理器带来太大的负担。 需要 DMA 才能从处理器卸载此类传输。
I/O 事务的类型
SerCx2 定义以下三种常规类型的 I/O 事务:
- PIO
- 系统 DMA
- 自定义
所有串行控制器驱动程序都必须支持使用 PIO 传输数据的 I/O 事务。 串行控制器驱动程序可能还支持使用系统 DMA 或自定义数据传输机制的 I/O 事务,具体取决于串行控制器和关联硬件的功能。 驱动程序可以支持系统 DMA 事务或自定义事务,但不能同时支持这两者。
对于串行控制器硬件支持的每种 I/O 事务类型,串行控制器驱动程序会向 SerCx2 注册支持包。 此包描述相关的硬件功能,并包括一组驱动程序实现的事件回调函数,SerCx2 调用这些函数来启动和控制这种类型的 I/O 事务。
如果串行控制器可以使用系统 DMA 控制器(可能与其他设备共享),则串行控制器驱动程序可能支持系统 DMA 事务。 对于这些事务,SerCx2 设置系统 DMA 控制器并启动 DMA 传输。 在系统 DMA 事务期间,串行控制器驱动程序执行的工作相对较少。
如果串行控制器具有用于传输数据的自定义硬件机制,则串行控制器驱动程序可能支持使用此机制的自定义事务。 例如,如果串行控制器硬件具有内置的总线-主机 DMA 功能,则串行控制器驱动程序可以支持自定义事务,使此功能可用于 SerCx2。
自定义事务在可以支持的数据传输机制类型方面是灵活的。 但是,这些事务比 PIO 事务或系统 DMA 事务更难实现。 若要支持自定义事务,串行控制器驱动程序通常必须设置和初始化用于传输数据的硬件。 此外,如果在关联的自定义接收或自定义传输事务完成之前取消了挂起的读取或写入请求,驱动程序必须终止该事务并完成请求。
每个 I/O 事务都是相对简单的操作。 I/O 事务从串行控制器读取数据或将数据写入控制器,并且从不混合读取和写入。 I/O 事务使用单一传输模式(PIO、系统 DMA 或自定义),并且从不混合传输模式。
SerCx2 可以智能地决定是使用 PIO 还是 DMA 来满足读取或写入请求。 例如,SerCx2 可能会选择将非常短的读取或写入请求作为 PIO 事务呈现给串行控制器驱动程序。 或者,SerCx2 可能会向串行控制器提供较长的读取或写入请求作为 DMA 事务。
将读取或写入请求分解为多个事务
某些系统 DMA 控制器可能存在一些限制,要求 SerCx2 将较长的读取或写入请求分解为两个或更多 I/O 事务。 例如,如果系统 DMA 控制器要求 DMA 传输在内存中的偶数字节边界上开始和结束,但读取请求中的数据缓冲区在奇数字节边界上开始和结束,则 SerCx2 可能会使用 PIO 将第一个和最后一个字节传输到缓冲区,并使用系统 DMA 传输第一个和最后一个字节之间的所有数据。 在本示例中,SerCx2 按所示顺序向串行控制器驱动程序发出以下三个 I/O 事务:
- 第一个字节的 PIO 接收事务。
- 两者之间字节的 system-DMA-receive 事务。
- 最后一个字节的 PIO 接收事务。
同样,如果自定义数据传输机制可以在内存中的任意字节边界上启动和结束自定义传输事务,但写入请求中的缓冲区大小超过了自定义传输事务的最大传输长度,则 SerCx2 会将写入请求分区为两个 (或更多) 自定义传输事务,其中每个事务不超过最大传输长度。
如果 SerCx2 需要将读取或写入请求拆分为两个或更多个 I/O 事务,串行控制器驱动程序可以安全地忽略这些事务彼此之间以及与请求的关系。 SerCx2 序列化事务,以确保按正确的顺序接收或传输数据。
当串行控制器驱动程序注册一组回调函数以支持系统-DMA 事务或自定义事务时,驱动程序将提供参数值,用于描述将执行这些事务的硬件的功能。 例如,对于系统-DMA 事务,参数包括对齐要求以及系统 DMA 控制器支持的最小和最大传输长度。 SerCx2 使用这些参数来决定是将读取或写入请求作为 PIO 事务处理还是作为系统-DMA 事务进行处理,以及是将请求拆分为两个还是更多个 I/O 事务。
但是,串行控制器可能具有无法通过串行控制器驱动程序提供给 SerCx2 的参数充分描述的特殊硬件功能。 因此,驱动程序可能有权访问硬件相关的信息,使驱动程序能够比 SerCx2 更明智的决策,了解如何将读取或写入请求分区到一个或多个 I/O 事务中。 作为一个选项,此类驱动程序可以实现 EvtSerCx2SelectNextReceiveTransactionType 和 EvtSerCx2SelectNextTransmitTransactionType 事件回调函数。 SerCx2 调用这些函数(如果已实现),以便驱动程序决定使用哪些 I/O 事务来满足读取或写入请求。