This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] AM6421: 时间同步路由器有什么用?如何使用它?

Part Number: AM6421

就像任何其他处理器一样,AM64x 具有中断路由器。但它还有一个称为时间同步路由器 (TSR) 的中断路由器,旨在将输入中断路由到多个输出中断。TSR 有什么用?它的相关文档目前不是很清晰,那如何使用它呢?

  • 时间同步路由器 (TSR):概述

    根据设计,TSR 可向多个接收者发送一个同步信号。此同步信号允许处理器内的多个外设或内核将其计数器同步到单个“主时钟”。如果处理器外部的某个器件也需要接收同步信号,则甚至可以将 TSR 信号路由到处理器引脚。

    此处有 2 个重要的延迟:

    1. 信号从信号源(例如 in1)传输到 TSR 输入端的延迟。我们称之为输入延迟
    2. 信号从 TSR 输入端传输到 TSR 输出端再到目标输入端(例如 out1、out2)的延迟。我们称之为路由器 + 输出延迟

    AM64x 的输入延迟将小于 9ns。

    我们在测试路由器 + 输出延迟时,将其分为两种情况:

    情况 1:测试 AM64x 处理器内部的所有 TSR 输出(例如,PRU 和 CPTS 位于 AM64x 处理器内部)

    情况 2:测试所有可能的 TSR 输出,包括 SYNC_OUT 处理器引脚

    在情况 1 中,路由器 + 输出延迟大于 0ns 但小于 4ns。因此,单个输入到达处理器内部两个不同输出端的时间差将始终小于 4ns。

    在情况 2 中,路由器 + 输出延迟大于 0ns 但小于 14ns。因此,当其中一个输出端为处理器引脚时,单个输入到达两个不同输出端的时间差将始终小于 14ns。

    那么,这意味着什么呢?假设我们将 GTC 推送事件发送到 CPTS、PRU 和 SYNC_OUT 引脚。GTC 推送事件需要 0 到 13ns 内的时间到达 CPTS,需要 0 到 13ns 内的时间到达 PRU,需要 0 到 23ns 内的时间才能出现在 SYNC_OUT 引脚上。由于这是单个输入信号,因此所有这些目标的输入延迟是相同的。所以,如果我们只是想了解到达时间的差异,我们可以忽略输入延迟。推送事件将在先后间隔 4ns 内到达 CPTS 和 PRU 内核,在到达 CPTS 和 PRU 内核后的 14ns 内到达 SYNC_OUT 引脚。

    还会有额外的延迟。例如,一旦信号到达 SYNC_OUT 引脚,信号将需要额外的时间沿电路板布线传输,并进入用户想要同步的任何外部器件。如果同步信号路由到 A53、R5F 或 M4F 内核,则该信号必须首先通过中断聚合器,如下面的“TSR 硬件文档”部分所述。如果同步信号会中断某个运行更高级别操作系统的内核,则该内核需要额外的时间来切换上下文并解决中断问题。关于向处理器内核发送同步信号的注意事项:如果需要高精度/低延迟,我通常会建议使用 RTOS 或 NORTOS(即裸机)内核,而不是 Linux 内核。

    TSR 软件:仍在开发中

    目前,我们仍在整理时间同步路由器代码。我上次检查时发现,Linux 和 RTOS 软件都会错误地阻止用户根据线程为单个输入设置多个输出https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1011433/processor-sdk-am64x-routing-timesync-event-to-multiple-outputs-not-supported-on-am64x-sciclient-and-sysfw。因此,目前用户需要执行直接的寄存器写入来配置时间同步路由器。请参阅下面的“TSR 硬件文档”部分。

    TSR 硬件文档:仍在编制中

    目前,我们仍在整理技术参考手册 (TRM) 中的时间同步路由器文档。

    TSR 寄存器

    从 TRM 存储器映射中,我们知道

    TIMESYNC_EVENT_INTROUTER0_CFG 的起始地址是 0x000A40000

    偏移量

     缩写

     寄存器名称

    TIMESYNC_EVENT_INTROUTER0_CFG

    物理地址

    0h

    TIMESYNC_EVENT_INTROUTER0_PID

     外设标识寄存器

     00A4 0000h

    4h + 公式

    TIMESYNC_EVENT_INTROUTER0_INTR_MUXCNTL_n

     中断多路复用器控制寄存器

     00A4 0004h + 公式

    寄存器定义当前未包含在 TRM 中。但是,我在查看设计文件时发现,TSR 寄存器的格式类似于 MAIN_GPIOMUX_INTROUTER0_CFG 寄存器。因此,TSR 寄存器如下所示:

    MUXCNTL 寄存器定义如下所示:

    中断多路复用器控制寄存器。偏移量 = 4h + (n * 4h);其中 n = 0h 至 28h。(即总共有 41 个 TSR 输出)

    GPIOMUX_INTRTR0_MUXCNTL_n 寄存器字段说明

     字段

     类型

     复位

     说明

    31-17

     RESERVED

     R

     0h

     保留

    16

     INT_ENABLE

     读/写

     0h

     启用中断输出 N。0h = 禁用。1h = 启用

    15-6

     RESERVED

     R

     0h

     保留

    5-0

     ENABLE

     读/写

     0h

     中断输出 N 的多路复用器控制。根据 TIMESYNC_INTRTR0

    中断映射对该字段进行编程。

    注意:当输入中断为有效状态时,请避免对该寄存器进行

    编程。这可能会导致虚假的异步输出切换,

    从而导致不可预知的行为。

     

    TSR 输入

    从 AM64x TRM 版本 C 开始,“Time Sync > Time Sync and Compare Events”仍然为空。您可以在“Interrupts > Time Sync and Compare Interrupt Events >

    TIMESYNC_INTRTR0 Interrupt Map”部分中找到 TSR 的输入列表。

    TSR 输出

    从 AM64x TRM 版本 C 开始,还没有这方面的详细文档。如果您使用不同的输出源,通常会在信号列表或图表中找到记载的 TSR 输出。但是,目前还没有包含所有输出的单个整合列表。下面是我从设计文件中整理出来的粗略列表:

    timesync_event_introuter_out_0

    l2g_event_pend.8

    timesync_event_introuter_out_1

    l2g_event_pend.9

    timesync_event_introuter_out_2

    l2g_event_pend.10

    timesync_event_introuter_out_3

    l2g_event_pend.11

    timesync_event_introuter_out_4

    l2g_event_pend.12

    timesync_event_introuter_out_5

    l2g_event_pend.13

    timesync_event_introuter_out_6

    l2g_event_pend.14

    timesync_event_introuter_out_7

    l2g_event_pend.15

    timesync_event_introuter_out_8

    icssg_0.pr1_edc0_latch0_in

    timesync_event_introuter_out_9

    icssg_0.pr1_edc0_latch1_in

    timesync_event_introuter_out_10

    icssg_0.pr1_edc1_latch0_in

    timesync_event_introuter_out_11

    icssg_0.pr1_edc1_latch1_in

    timesync_event_introuter_out_12

    icssg_1.pr1_edc0_latch0_in

    timesync_event_introuter_out_13

    icssg_1.pr1_edc0_latch1_in

    timesync_event_introuter_out_14

    icssg_1.pr1_edc1_latch0_in

    timesync_event_introuter_out_15

    icssg_1.pr1_edc1_latch1_in

    timesync_event_introuter_out_16

    main_cpts.cpts_hw1_push

    timesync_event_introuter_out_17

    main_cpts.cpts_hw2_push

    timesync_event_introuter_out_18

    main_cpts.cpts_hw3_push

    timesync_event_introuter_out_19

    main_cpts.cpts_hw4_push

    timesync_event_introuter_out_20

    main_cpts.cpts_hw5_push

    timesync_event_introuter_out_21

    main_cpts.cpts_hw6_push

    timesync_event_introuter_out_22

    main_cpts.cpts_hw7_push

    timesync_event_introuter_out_23

    main_cpts.cpts_hw8_push

    timesync_event_introuter_out_24

    SYNC0_OUT 引脚

    timesync_event_introuter_out_25

    SYNC1_OUT 引脚

    timesync_event_introuter_out_26

    SYNC2_OUT 引脚

    timesync_event_introuter_out_27

    SYNC3_OUT 引脚

    timesync_event_introuter_out_28

     

    timesync_event_introuter_out_29

    pcie.pcie_cpts_hw2_push

    timesync_event_introuter_out_30

    cpsw.cpts_hw1_push

    timesync_event_introuter_out_31

    cpsw.cpts_hw2_push

    timesync_event_introuter_out_32

    cpsw.cpts_hw3_push

    timesync_event_introuter_out_33

    cpsw.cpts_hw4_push

    timesync_event_introuter_out_34

    cpsw.cpts_hw5_push

    timesync_event_introuter_out_35

    cpsw.cpts_hw6_push

    timesync_event_introuter_out_36

    cpsw.cpts_hw7_push

    timesync_event_introuter_out_37

    cpsw.cpts_hw8_push

    timesync_event_introuter_out_38

    epwm0_sync.input2

    timesync_event_introuter_out_39

    epwm3_sync.input2

    timesync_event_introuter_out_40

    epwm6_sync.input2

     

    这些事件中的大多数直接发送到目标,如 ICSSG、位于主域或 CPSW 中的 CPTS、PCIE、EPWM 或处理器 SYNCn_OUT 引脚。但是,任何发送到 A53(通过 GIC)、R5F 内核或 M4 内核的 TSR 事件都会首先经过 L2G,然后经过事件传输通道 (ETL),然后最终到达中断聚合器 (IA)。然后,中断聚合器可以中断任何这些内核。

    目前,我还没有对 TSR 通过中断聚合器向 GIC/R5F/M4 发送中断进行过多研究。我在上面提供的延迟是从 TSR 的输入到 L2G 逻辑的输入测得的。因此,信号通过中断聚合器并到达这些内核所需的额外时间(纳秒)未知。任何想要深度了解上述 TSR 输出的用户,都可以先参考 TRM 中的“DMSS L2G 中断输入”、“DMSS 中断请求”和“数据移动子系统 (DMSS)”部分。

     

     

  • 问题 2

    TSR 允许将单个输入中断信号路由到多个输出端。但是,我能否使用 TSR 将多个输入中断路由到单个输出端?

     

    2

    不可以。

    时间同步路由器旨在实现一对多映射。但是,每个输出只能对应一个输入。这出于寄存器控制方案的限制。每个输出都有一个寄存器。映射到该输出的输入数量会编程为十六进制值。由于只有一个十六进制字段,因此每个输出只能有一个输入。更多详细信息,请参阅上面的“TSR 寄存器”部分。