就像任何其他处理器一样,AM64x 具有中断路由器。但它还有一个称为时间同步路由器 (TSR) 的中断路由器,旨在将输入中断路由到多个输出中断。TSR 有什么用?它的相关文档目前不是很清晰,那如何使用它呢?
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.
就像任何其他处理器一样,AM64x 具有中断路由器。但它还有一个称为时间同步路由器 (TSR) 的中断路由器,旨在将输入中断路由到多个输出中断。TSR 有什么用?它的相关文档目前不是很清晰,那如何使用它呢?
时间同步路由器 (TSR):概述
根据设计,TSR 可向多个接收者发送一个同步信号。此同步信号允许处理器内的多个外设或内核将其计数器同步到单个“主时钟”。如果处理器外部的某个器件也需要接收同步信号,则甚至可以将 TSR 信号路由到处理器引脚。
此处有 2 个重要的延迟:
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)”部分。