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] [参考译文] [FAQ]如何将 PRU IEP 计时器与 Linux 系统时间同步?

Guru**** 1578975 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1252399/faq-how-to-synchronize-the-pru-iep-timer-with-linux-system-time

我使用的 Sitara 处理器有 Linux 内核、时间同步路由器和 PRU 子系统(AM62x、AM64x、AM65x)。 我想将 Linux 系统时间与 PRU 子系统中的 IEP 计时器同步。 我该怎么做?

对于此示例、我们将使用 AM64x、但相同的概念适用于所有处理器。

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

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

有关其他 Sitara 多核主题的更多信息、请参考 [FAQ] Sitara 多核开发和文档。 有关 PRU 的更多具体信息、请参阅 PRU 开发小节。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    总体设计

    假设您正在通过以太网 PTP 将 Linux 系统时间与外部时钟源同步。

    然后、您需要使用来自 CPTS (在 CPSW 内部)的 PPS 信号将 Linux 系统时间与 IEP 计数器同步。

    在对 Linux 系统时间进行初始读取后、PRU 可以等待 PPS 信号的上升沿或下降沿、每秒将自身重新同步到 Linux 系统时间。

    请查看 AM64x 技术参考手册(TRM)图"SoC 时间同步架构"。 这是 PPS 信号从 CPTS 到 PRU 子系统的路径:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    步骤1:从 CPTS 获取 PPS 信号并将其路由到某个位置

    从 SDK 9.0版开始、有更新的文档说明如何获取 PPS 信号从 CPTS 返回其自身以便在 SDK 文档中生成 CPTS 时间戳: https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/09_00_00_03/exports/docs/linux/Foundational_Components/Kernel/Kernel_Drivers/Network/CPSW-PTP.html

     *章节"时间戳外部事件"讨论如何设置回送

     *"PPS 每秒脉冲支持"部分讨论如何设置 PPS

    让我们从 SDK 9.0 K3-am642-sk.dts 中查看 AM64x SK EVM 文件:

    #define TS_OFFSET(pa, val)     (0x4+(pa)*4) (0x10000 | val)
    
    &timesync_router {
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <&cpsw_cpts_pps>;
    
            /*
             * Use Time Sync Router to map GENF1 input to HW8_TS_PUSH output as well
             * as the PRU ICSSG0 SYNC1 output.
             */
            cpsw_cpts_pps: cpsw-cpts-pps {
                    pinctrl-single,pins = <
                            /* pps [cpts genf1] in22 -> out37 [cpts hw8_push] */
                            TS_OFFSET(37, 22)
                            /* pps [cpts genf1] in22 -> out26 [SYNC1_OUT pin] */
                            /* Note: NOT actually SYNC1_OUT. See Step 2 for details */
                            TS_OFFSET(26, 22)
                            >;
            };
    };

    时间同步路由器的一个输入信号可以路由到多个输出端。 CPTS PPS 信号也会路由到外部 SYNC_OUT 引脚、可在此处通过示波器观察此信号。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    步骤2:配置时间同步路由器以将 PPS 信号发送到 PRU  

    在 Linux devicetree 中的时间同步路由器中添加一个条目、该条目会进入其中一个 PRU 信号。

    对于每个处理器、时间同步路由器的输入和输出都不同。

    TISCI 文档、相关的 e2e 常见问题解答或技术参考手册(TRM)中列出了时间同步路由器的输入和输出。 不同来源的信息略有不同:

    TISCI 文档、AM64x 时间同步路由器输入

    TISCI 文档、AM64x 时间同步路由器 输出

    [常见问题解答] AM64x:时间同步路由器有什么用? 如何使用它?

    让我们再看看 SDK 9.0、K3-am642-sk.dts 中的 AM64x SK EVM 文件。 我们将检查当前配置了哪些输入和输出:

    1个输入信号、来自输入22
    TISCI 文档指出、这是来自 CPSW 子系统的 CPTS (而非主域 CPTS)的 CPTS_genF1信号

    2个输出信号:
    输出37:TISCI 文档 指出 CPTS_hw8_push 返回至 CPSW CPTS 的时间戳
    输出26: TISCI 文档并未说明这是什么、所以我们必须参考 e2e 常见问题解答或 TRM。 它实际上是 SYNC2_OUT 引脚(不是 SDK 9.0 devicetree 文件中注释的 SYNC1_OUT 引脚)。 SYNC2_OUT 未路由到 AM64x EVM 上的接头引脚。 若要在接头引脚上查看 PPS 信号、请尝试改为 SYNC0_OUT、并将 D18的引脚多路复用从 ECAP 更改为 SYNC0_OUT。

    因此、如果我们希望信号进入 PRU 子系统、我们必须配置另一个输出。

    使用其中一个 PR1_EDC [0:1]_LATCH[0:1]_IN 输出将信号路由到其中一个 PRU 子系统实例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    步骤3:配置 PRU 以接收 PPS 信号  

    让我们详细了解一下传输到 PRU 子系统的 AM64x 时间同步路由器输出:
    TISCI 文档、AM64x 时间同步路由器输入

    目标名称 目标接口
    AM64X_DEV_PRU_ICSSG0 pr1_edc0_latch0_in
    AM64X_DEV_PRU_ICSSG0 pr1_edc0_latch1_in
    AM64X_DEV_PRU_ICSSG0 pr1_edc1_latch0_in
    AM64X_DEV_PRU_ICSSG0 pr1_edc1_latch1_in
    AM64X_DEV_PRU_ICSSG1 pr1_edc0_latch0_in
    AM64X_DEV_PRU_ICSSG1 pr1_edc0_latch1_in
    AM64X_DEV_PRU_ICSSG1 pr1_edc1_latch0_in
    AM64X_DEV_PRU_ICSSG1 pr1_edc1_latch1_in

    每个 ICSSG 实例都有4个来自时间同步路由器的输入。 每个 ICSSG 实例都有2个 IEP 计时器、每个 IEP 计时器都有两个 EDC 锁存输入。 因此、 pr1_ 记录0 _LATCH[0:1]_IN 进入 IEP0、且 pr1_ 记录1 _LATCH[0:1]_IN 进入 IEP1。

    根据 TRM 表"IEP 计时器模式映射"、这4个信号映射到这些捕获输入寄存器

    要配置 IEP 计时器来捕获这些锁存输入、请按照 TRM "PRU_ICSSG IEP 计时器基本编程序列">"Capture 功能"部分中的步骤操作。

    现在我们有 PRU 输入。 当检测到上升沿或下降沿时、IEP 捕获寄存器将包含检测到上升沿的确切时间内的 IEP 时间戳。 然后、全局捕获事件将在 PRU INTC 中触发。 但是、哪个事件将被触发?

    参考 TRM 部分"PRU_ICSSG 中断请求映射"

    事件#56 PR0_iep1_ANY_CMP_CAP_PEND IEP1中的全局捕获事件
    事件#7 PR0_IEP_TIM_CAP_CMP_PEND 复用 IEP0的全局捕获事件

    由于 PPS 信号预计会每秒出现一次、因此 PRU 内核可以测量 IEP 捕获时间戳和预期 IEP 时间之间的差异、然后相应地调整 IEP 计数器。