Part Number:AM6421
就像任何其他处理器一样,AM64x 具有中断路由器。但它还有一个称为时间同步路由器 (TSR) 的中断路由器,旨在将输入中断路由到多个输出中断。TSR 有什么用?它的相关文档目前不是很清晰,那如何使用它呢?
Annie Liu:
时间同步路由器 (TSR):概述
根据设计,TSR 可向多个接收者发送一个同步信号。此同步信号允许处理器内的多个外设或内核将其计数器同步到单个“主时钟”。如果处理器外部的某个器件也需要接收同步信号,则甚至可以将 TSR 信号路由到处理器引脚。
此处有 2 个重要的延迟:
信号从信号源(例如 in1)传输到 TSR 输入端的延迟。我们称之为输入延迟
信号从 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)”部分。
,
Annie Liu:
问题 2:
TSR 允许将单个输入中断信号路由到多个输出端。但是,我能否使用 TSR 将多个输入中断路由到单个输出端?
答 2:
不可以。
时间同步路由器旨在实现一对多映射。但是,每个输出只能对应一个输入。这出于寄存器控制方案的限制。每个输出都有一个寄存器。映射到该输出的输入数量会编程为十六进制值。由于只有一个十六进制字段,因此每个输出只能有一个输入。更多详细信息,请参阅上面的“TSR 寄存器”部分。