AM5728: AM5728实现IEEE1588协议的一些疑问

Part Number: AM5728
Other Parts Discussed in Thread: 66AK2G12, SYSBIOS, AM5729

看了AM5728的手册,EAMC支持IEEE1588协议,但是在TRM上第24.11.4.10章节里,关于CPTS的介绍感觉比较浅,比如下面两个截图,看样子时间戳的时间应该来至定时器TIMER13--16中的一个,但是怎么配置相关的定时器,以及截图二中portimerpwm,是什么样的接口,都没有进一步说明。然后协议层面,时间戳值是如何从选择的定时器加载到数据包里面的,似乎也没有相关介绍。最后,我在网上搜索了下,好像说是AM5728对IEEE1588的支持,只是支持AVB音视频桥接方面,要真正完整支持IEEE1588,是要在PRU-ICSS端去实现的,不知道是不是这样。

image.png

image.png

  • 您好,
    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 你好,我的问题有进展了吗

  • 你好 ?,

    SDK 页面上还有一些其他信息,网址是https://software-dl.ti.com/processor-sdk-linux/esd/AM57X/11_01_02_01/exports/docs/linux/Foundational_Components/Kernel/Kernel_Drivers/Network/CPSW.html#common-platform-time-sync-cpts-module 。

    还有一些其他现有的主题AM5728:AM572x-IDK 中的 IEEE 1588 PTP 时间同步。

    该协议使用 ptp4l 提供支持。请查看最新 SDK 中的源代码以获取更多指导。

    快速入门:

    文件 目的
    drivers/net/ethernet/ti/cpts.c CPTS驱动程序 - PTP时钟注册、TX/RX时间戳、FIFO事件处理
    drivers/net/ethernet/ti/cpts.h CPTS寄存器布局(cpsw_cpts)、事件类型、rftclk_sel字段
    drivers/net/ethernet/ti/icssm/icssm_prueth_ptp.h PRU-ICSS 共享内存偏移量,用于 PTP 时间戳(每个端口和消息类型的 TX/RX)
    驱动程序/net/ethernet/ti/icssg/icss_iep.c IEP(工业以太网外设)驱动程序 - 64 位计数器、PTP 时钟操作、捕获/比较
    驱动程序/net/ethernet/ti/icssg/icss_iep.h IEP寄存器枚举,平台数据结构
    拱门/arm/boot/dts/ti/omap/am57-pruss.dtsi PRU-ICSS1/2 设备树 - IEP 节点位于 0x4b2e000,IEP 时钟多路复用器源
    拱/臂/启动/dts/ti/omap/dra7-l4.dtsi:3120 CPSW 下的 CPTS 子节点 - 时钟源为 gmac_clkctrl 位 25
    drivers/clk/ti/clk-7xx.c:446 dra7_gmac_rft_clk_mux_parents - 列出所有有效的 CPTS 参考时钟源
    arch/arm/boot/dts/ti/omap/am57xx-idk-common.dtsi 板级 pruss2_iep 绑定,带中断功能,用于 IEP 捕获/比较

    -约书亚

  • 看了你发的资料链接,基本都是linux环境下的,我看了电脑上安装的RTOS的PDK,里面只有EMAC和CPSW的一些源码,没有关于PTP、CPTS方面的,TI没有提供裸机或者说是RTOS的PTP相关资料吗。

  • 没错,Linux 明确支持这一点,但 RTOS 则没有明确支持。

    查看 RTOS SDK,你会找到一些所需的工具。

    请查看:

    • CSL 头文件和 API:csl_cpts.h、csl_cptsAux.h 和 cslr_cpts 中的寄存器定义。
    • 两个应用示例:
      • CPTS 事件处理 (cptsEventExample/) - 演示如何通过以太网交换机处理 IEEE 1588 事件包和生成 CPTS 事件。
      • CPTS 时间戳比较 (cptsTsCmpExample/) - 显示时间戳比较事件、TS_COMP 输出脉冲生成以及使用 NUDGE 进行相位调整

    您还可以通过 RTOS SDK 进行了解:

    https://software-dl.ti.com/processor-sdk-rtos/esd/AM57X/11_01_00_00/exports/docs/rtos/index_Foundational_Components.html#timesync-ptp

    最好的,

    约书亚

  • cptsEventExample/    cptsTsCmpExample/,这两个应用示例,是在PDK的路径里面吗,我找了,没看到有呢

  • 哦,看到了,在drv文件夹下面,我先看看代码,有搞不懂的再来请教,谢谢

  • 这几个C源码,都看了,应该都是匹配的类似66AK2G12这类CPU的,因为AM572x系列的EMAC,我在TRM里面没有看到有QMSS队列管理子系统这类的概念,Keystone系列里面倒是有这种硬件和对应的概念,所以这几个C文件应该对AM5728不适用。我说说我目前的情况,我的AM5728代码是裸机形式的,千兆网的基本收发都没有问题。TRM里面,PTP的时间同步事件中断属于EMAC里面的杂项类中断,因此我在中断处理函数中加入了杂项类的时间同步事件处理中断

     截图一

     截图二

    根据截图一和二,我在代码中手动设置中断触发,进了杂项类的时间同步事件中断,证明中断这块没有问题。接下来,再根据TRM中对PTP数据包的要求,如下截图

     截图三

    外部发往AM5728的PTP数据包,需要这三种格式,我尝试了第一和第二种,

     截图四

    通过wireshark抓包分析,发往AM5728的数据包格式,应该是没有问题的。之后我按TRM的要求,配置了EMAC中的CPTS、PORT、等寄存器,代码如下:

    void Init_CPTS(void)
    {
    CPTSRegs.CONTROL.bit.CPTS_EN = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_RX_EN = 1;//时间同步接收使能
    CPSW_PORT_Regs.P1_CTRL.bit.TS_TX_EN = 1;//时间同步发送使能
    CPSW_PORT_Regs.P1_CTRL.bit.TS_LTYPE1_EN = 1;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_LTYPE2_EN = 1;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_ANNEX_D_EN = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_ANNEX_E_EN = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_ANNEX_F_EN = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_UNI_EN = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_TTL_NONZERO = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_319 = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.TS_320 = 0;
    CPSW_PORT_Regs.P1_CTRL.bit.VLAN_LTYPE1_EN = 1;
    CPSW_PORT_Regs.P1_CTRL.bit.VLAN_LTYPE2_EN = 1;


    CPSW_PORT_Regs.P2_CTRL.bit.TS_RX_EN = 1;//时间同步接收使能
    CPSW_PORT_Regs.P2_CTRL.bit.TS_TX_EN = 1;//时间同步发送使能
    CPSW_PORT_Regs.P2_CTRL.bit.TS_LTYPE1_EN = 1;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_LTYPE2_EN = 1;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_ANNEX_D_EN = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_ANNEX_E_EN = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_ANNEX_F_EN = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_UNI_EN = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_TTL_NONZERO = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_319 = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.TS_320 = 0;
    CPSW_PORT_Regs.P2_CTRL.bit.VLAN_LTYPE1_EN = 1;
    CPSW_PORT_Regs.P2_CTRL.bit.VLAN_LTYPE2_EN = 1;

    CPSW_SS_Regs.TS_LTYPE.bit.LTYPE1 = 0x88F7;
    CPSW_SS_Regs.TS_LTYPE.bit.LTYPE2 = 0x88F7;
    CPSW_SS_Regs.VLAN_LTYPE.bit.LTYPE1 = 0x8100;
    CPSW_SS_Regs.VLAN_LTYPE.bit.LTYPE2 = 0x8100;

    CPSW_PORT_Regs.P1_TS_SEQ_MTYPE.bit.TS_SEQ_ID_OFFSET = 30;
    CPSW_PORT_Regs.P1_TS_SEQ_MTYPE.bit.TS_MSG_TYPE_EN = 0xFFFF;

    CPSW_PORT_Regs.P2_TS_SEQ_MTYPE.bit.TS_SEQ_ID_OFFSET = 30;
    CPSW_PORT_Regs.P2_TS_SEQ_MTYPE.bit.TS_MSG_TYPE_EN = 0xFFFF;

    CPTSRegs.TS_LOAD_EN.bit.LOAD = 1;
    CPTSRegs.CONTROL.bit.HW1_TS_PUSH_EN = 1;
    CPTSRegs.CONTROL.bit.HW2_TS_PUSH_EN = 1;
    CPTSRegs.CONTROL.bit.HW3_TS_PUSH_EN = 1;
    CPTSRegs.CONTROL.bit.HW4_TS_PUSH_EN = 1;
    CPTSRegs.CONTROL.bit.CPTS_EN = 1;
    }

    对应的定时器TIMER14---16都配置了,调试模式下,也看到定时器在运行。目前的情况是,EMAC的接收依然只触发常规的接收中断,时间同步事件不会触发。

     截图五

    根据截图五所述,只要数据包是有效的PTP数据包,CPTS模块在硬件层面就会根据0x88F7、0x8100这两个协议关键字,对数据包进行解码,而我在调试模式下,没有看到CPTS中的相关寄存器有任何变化。

  • 您好,工程师 x,

    首先,我不是这方面的专家,所以我把其中一位添加到了通知列表中。

    您说得对,我分享的那个示例 ti/drv/emac/example/cptsEventExample 仅适用于 K2 设备。您可以参考以下示例:ti/drv/emac/cpsw/example/src/c66x/bios/cpsw_mgmt.c,其中包含 Init_CPTS() 和每个端口的 CSL_CPSW_setPortTimeSyncConfig() 调用。

    再次强调,我需要找到一位在撰写此文档时参与 EMAC LLD 团队的成员来确认(可能性很小)TI Sysbios 是否已停止开发且不再有任何活跃的开发工作。但 README 文件表明这是一个资源:我认为“what”应该是“that”。

    pdk_am57xx_1_0_21/packages/ti/drv/emac/cpsw/example$ cat README.txt
    Contains source code for ethernet related examples (CPSW/CPTS) what do not use the emac-lld driver for SOC_K2G.
    josue@jz-ws:~/data/sdk_s/am57x/processor_sdk_rtos_am57xx_11_01_00_00/pdk_am57xx_1_0_21/packages/ti/drv/emac/cpsw/example$ tree src
    src
    ├── c66x
    │   └── bios
    │       ├── cpsw_linker.cmd
    │       ├── cpsw_mgmt.c
    │       ├── cpsw_mgmt.h
    │       ├── framework.c
    │       └── fw_main.c
    ├── cppi_qmss_mgmt.c
    ├── cppi_types.h
    ├── cpsw_singlecore.c
    ├── cpsw_singlecore.h
    ├── qmss_types.h
    ├── setuprm.c
    └── view_ale_table.c

    如果你查看这段代码,会发现它与你的配置有一些差异,这可能会造成问题:

    具体来说

    tsCfg.tsRxAnnexDEnable = 1;
    tsCfg.tsRxAnnexEEnable = 1;
    tsCfg.tsRxAnnexFEnable = 1;
    //Also
    tsCfg.tsUniEnable = 1; /* All addresses are enabled, including multicast */

    检查一下这些措施是否有效。

    我会看看SW团队里有没有人能对此发表评论。

    -约书亚

  • 我还应该指出一点,文档明确指出 AM57x 上的 TimeSync 示例是基于使用 Sysbios 的 PRU-ICSS 实现。

    它确实自带一个例子:

    也就是说,你正在走一条我认为从未在 RTOS SDK 中验证过的道路,因此我们的支持将受到限制。

    -约书亚

  • 非常感谢你的帮助。确实我使用AM5728和AM5729的开发方式有点另类,没有使用liunx,也没有使用TI的RTOS,我用的是CCS环境下的纯裸机开发方式,目的是想打造一个以AM5728或者AM5729为核心的算法验证平台,所有代码、片内外设的寄存器全部手动可控。IEEE1588,我是打算用在工业自动化方向上,现在就遇到了这个CPTS模块没有识别到PTP数据包的问题。如果后面证明AM5728在EMAC上的PTP协议支持有问题的话,可能就只有考虑使用完整支持IEEE1588的PHY了,看了下,TI也有几款比较适合。

  • 很高兴能帮到你。

    我的建议没有起到帮助吗?

    请解释一下以下问题:

    但我目前遇到了 CPTS 模块无法识别 PTP 数据包的问题

    我可以再向我们现有的团队确认一下,看看有没有人能帮忙。

    祝你好运!

    -约书亚

  • 你建议的配置方法,实际上我在发这个帖子之前就都尝试过了的,都没有任何作用,看了你的截图,我又按截图里的参数配置,也没有效果

  • 内部正在核实情况。如果有任何有用的信息,我会及时更新。

    -约书亚

  • CPTS 时间戳事件存储在硬件 FIFO 中,需要从中取出。时间戳事件有多种类型(发送和接收数据包、软件推送、硬件推送),但它们都存储在同一个 FIFO 中。在发送和接收数据包中,当数据包的 EtherType 与您设置的 LTYPE1 值(RX 或 TX)匹配时,硬件将生成一个时间戳事件。

    你说它不起作用,是指 FIFO 中没有任何事件吗?

    CPTS 支持软件推送事件(通过 TS_PUSH 寄存器),当 TS_PUSH 位写入 1 时,CPTS 将生成一个时间戳事件并将其存储到 CPTS FIFO 中。如果仍然无效,则可能是您未启用 CPTS。

    CPTS RCLK 可以来自不同的信号源,通常会有一个多路复用器来选择具体信号源。根据 AM572x 技术参考手册:

    > CM_GMAC_GMAC_CLKCTRL[ 27:25 ] CLKSEL_RFT - 选择 CPTS_RFT_CLK 的源

    关于您原帖中提到的定时器问题,它们并非 CPTS 时间戳的来源。CPTS 可以捕获通过硬件推送输入传递给它的硬件事件的时间戳。一般来说,它可以是任何硬件事件(在较新的 TI 处理器中就是如此),但在 AM572x 中,它仅限于定时器的 PWM 输出事件。总之,我认为目前硬件推送事件并不重要。

    希望这能帮到你。

  • 是的,手动令TS_PUSH=1,也不能触发时间戳事件。如果这是因为没有启用CPTS导致的话,那么除了当前已有的初始化代码和令CPTSRegs.CONTROL.bit.CPTS_EN   = 1,还需要有其它什么必要的步骤才能真正的启用CPTS?,从TRM上,暂时没有看到有其它寄存器也在控制CPTS的使能或者禁止状态。对于CPTS RCLK,我的代码如下:

    目前唯一能让代码进入PTP时间戳事件中断的,就只有如下测试代码:

    CPTSRegs.CONTROL.bit.INT_TEST = 1;//开启中断测试
    CPTSRegs.INT_STAT_RAW.bit.TS = 1;//手动强制进入中断

  • 请查阅汽车行业相关版本,并参考 CPTS 文档以获取更详细的指导。本论坛不涉及从零开始编写裸机驱动程序。

    https://www.ti.com/tool/PROCESSOR-SDK-TDAX#downloads

    查找 /packages/ti/nsp/drv/gmacsw/cpts.c

    最好的,

    约书亚

  • 此 SDK 包含 Josue 在其之前的帖子中指出的 GMACSW 驱动程序: https://www.ti.com/tool/download/PROCESSOR-SDK-VISION/03.08.00.00 。

    我强烈建议您使用 NSP 驱动程序作为参考。

  • 非常感谢,我好好看看这些文档资料