2149232_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2149232_zh-CN

2149232_zh-CN

S32G3 PFE 外部时间戳模式

你好

我正在开发 S32G-VNP-RDB3 板,我想将其配置为 pfe1 和 pfe2 接口上的 PTP 边界时钟。

运行 `ptp4l -H -i pfe1 -i pfe2 -m` (使用 BSP44.0)就会出现这个错误:

ptp4l[2178.575]: selected /dev/ptp2 as PTP clock
ptp4l[2178.576]: port 2 (pfe2): PHC device mismatch
ptp4l[2178.576]: port 2 (pfe2): /dev/ptp2 requested, ptp3 attached
ptp4l[2178.576]: failed to open port pfe2
failed to create a clock

这没有问题,因为 ptp4l 要求接口使用相同的硬件时钟。S32G_PFE_LNX_DRV_UM 第 2.3.1.2 节解释了时钟树的配置,即"EMAC0 是时间源,为 GMAC、EMAC1 和 EMAC2" 供电(图中虚线)。

 

NidasioAlberto_1-1754658772398.png


要应用此配置(如本章所述),我将三台设备(使用 yocto 构建映像时)修改如下:

diff --git a/image/s32g-pfe.dtsi b/image/s32g-pfe-new.dtsi
index 94f886b..0a6ba1c 100644
--- a/arch/arm64/boot/dts/freescale/s32g-pfe.dtsi
+++ b/arch/arm64/boot/dts/freescale/s32g-pfe.dtsi
@@ -53,6 +53,7 @@
"pfe-shared-pool", "pfe-bdr-pool";
nxp,fw-class-name = "s32g_pfe_class.fw";
nxp,fw-util-name = "s32g_pfe_util.fw";
+ nxp,pfeng-emac-ts-ext-modes = , ;
nxp,pfeng-ihc-channel = ;
status = "disabled";

@@ -175,4 +176,3 @@
};
};
};
-

在引导日志中,我看到了这个:


[ 8.716896] pfeng 46000000.pfe pfe1 (uninitialized): Subscribe to HIF1
[ 8.723466] pfeng 46000000.pfe pfe1 (uninitialized): Host LLTX disabled
[ 8.730319] pfeng 46000000.pfe pfe1 (uninitialized): Enable HIF1
[ 8.736399] pfeng 46000000.pfe pfe1 (uninitialized): setting MAC addr: 00:04:9f:be:ef:01
[ 8.744584] pfeng 46000000.pfe pfe1 (uninitialized): PTP HW addend 0x80000000, max_adj configured to 46566128 ppb
[ 8.754886] pfeng 46000000.pfe: IEEE1588: Using external timestamp input
[ 8.761903] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1
[ 8.771626] pfeng 46000000.pfe pfe1: registered
[ 8.776283] pfeng 46000000.pfe pfe2 (uninitialized): Subscribe to HIF2
[ 8.782837] pfeng 46000000.pfe pfe2 (uninitialized): Host LLTX disabled
[ 8.789684] pfeng 46000000.pfe pfe2 (uninitialized): Enable HIF2
[ 8.795771] pfeng 46000000.pfe pfe2 (uninitialized): setting MAC addr: 00:04:9f:be:ef:02
[ 8.803945] pfeng 46000000.pfe pfe2 (uninitialized): PTP HW addend 0x80000000, max_adj configured to 46566128 ppb
[ 8.814257] pfeng 46000000.pfe: IEEE1588: Using external timestamp input
[ 8.821221] pfeng 46000000.pfe pfe2 (uninitialized): Registered PTP HW clock successfully on EMAC2
[ 8.830823] pfeng 46000000.pfe pfe2: registered

但是,`ethtool` 仍然为每个 pfe 接口报告不同的 ptp 硬件时钟:

root@s32g399ardb3:~# ethtool -T pfe0
...
PTP Hardware Clock: 1
...
root@s32g399ardb3:~# ethtool -T pfe1
...
PTP Hardware Clock: 2
...
root@s32g399ardb3:~# ethtool -T pfe2
...
PTP Hardware Clock: 3
...

我从 `ptp4l -H -i pfe1 -i pfe2 -m` 中得到了相同的输出结果。

我在配置中遗漏了什么?pfe 固件中是否有需要重新编译的地方?

Re: S32G3 PFE External Timestamp Mode

你好,@NidasioAlberto

太好了,这正是我得出的结论。

如果您需要更多支持,请告诉我,我会尽最大努力帮助您。

鉴于这篇文章的长度,如果你需要关注这个话题,请创建一个新帖子,你可以参考这篇文章来跟踪上下文。


谢谢!

Re: S32G3 PFE External Timestamp Mode

谢谢@alejandro_e,我会尝试修补 PFE 驱动程序。

Re: S32G3 PFE External Timestamp Mode

你好,@NidasioAlberto

我的理解是,ethtool输出中的时钟数是 “虚拟设备” 的ID,不一定反映模块的内部配置。

对于每台设备,都会注册不同的时钟设备,它发生在这里 linu x-pfeng/pfeng-ptp.c #L247

例如,使用基本 BSP44 映像,您可以看到所有 PFE_EMAC 实例都注册了 PTP 时钟:

root@s32g399ardb3:~# dmesg | grep "Registered PTP HW clock successfully on EMAC"
[    9.525257] pfeng 46000000.pfe pfe0 (uninitialized): Registered PTP HW clock successfully on EMAC0
[    9.593027] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1
[    9.653784] pfeng 46000000.pfe pfe2 (uninitialized): Registered PTP HW clock successfully on EMAC2

linux-pfeng/pfeng-netif.c#L1544 中,每个接口的时钟寄存器过程都会重复进行。

您可以修改源代码,使所有接口使用相同的虚拟时钟。这与我之前分享的信息有关:

alejandro_e_0-1755555300778.png

如果所有 PFE_EMAC 接口都注册了相同的时钟,那么就可以对所有感兴趣的接口使用一个 ptp4l 实例。

有关详细信息,您可以使用以下命令:

root@s32g399ardb3:~# ls -l /sys/class/ptp/
total 0
lrwxrwxrwx 1 root root 0 Oct  9 15:51 ptp0 -> ../../devices/platform/soc/46000000.pfe/ptp/ptp0
lrwxrwxrwx 1 root root 0 Oct  9 15:52 ptp1 -> ../../devices/platform/soc/46000000.pfe/ptp/ptp1
lrwxrwxrwx 1 root root 0 Oct  9 15:52 ptp2 -> ../../devices/platform/soc/46000000.pfe/ptp/ptp2
lrwxrwxrwx 1 root root 0 Oct  9 15:59 ptp3 -> ../../devices/platform/soc/4033c000.ethernet/ptp/ptp3

root@s32g399ardb3:~# ls /sys/class/ptp/
ptp0  ptp1  ptp2  ptp3
root@s32g399ardb3:~# ls /sys/class/ptp/ptp0/
clock_name  dev  device  max_adjustment  max_vclocks  n_alarms  n_external_timestamps  n_periodic_outputs  n_programmable_pins  n_vclocks  power  pps_available  subsystem  uevent
root@s32g399ardb3:~# cat /sys/class/ptp/ptp0/clock_name
pfeng ptp
root@s32g399ardb3:~# cat /sys/class/ptp/ptp0/dev
251:0
root@s32g399ardb3:~# cat /sys/class/ptp/ptp0/max_vclocks
20

最后一部分与以下结构相匹配linux/include/linux/ptp_clock_kernel.h#L166


如果这些信息对您有帮助,请告诉我

Re: S32G3 PFE External Timestamp Mode

感谢@alejandro_e这么快回复我。

我理解内部团队的意思。

我不明白的是,为什么在为 pfe1 和 pfe2 配置"外部时间戳模式" 时,与 pfe1 和 pfe2 相关的硬件时钟与 pfe0 不一样,而仍然是各自独立的时钟。我指的是 pfe 驱动程序向 Linux 以及 ptp4l 公开的内容。

我所期望的是,不要再看到这些了:

root@s32g399ardb3:~# ethtool -T pfe0
...
PTP Hardware Clock: 1
...
root@s32g399ardb3:~# ethtool -T pfe1
...
PTP Hardware Clock: 2
...
root@s32g399ardb3:~# ethtool -T pfe2
...
PTP Hardware Clock: 3
...

我看到了这个:

root@s32g399ardb3:~# ethtool -T pfe0
...
PTP Hardware Clock: 1
...
root@s32g399ardb3:~# ethtool -T pfe1
...
PTP Hardware Clock: 1
...
root@s32g399ardb3:~# ethtool -T pfe2
...
PTP Hardware Clock: 1
... 

Re: S32G3 PFE External Timestamp Mode

你好,@NidasioAlberto

我从内部团队收到了以下反馈意见:

如果 PFE_EMAC1 和 PFE_EMAC2 共享来自 PFE_EMAC0 的时间戳,则不支持调整 PFE_EMAC1 和 PFE_EMAC2 的 PTP 时间,可以认为 PTP 时间寄存器以只读模式工作。并反映 PFE_EMAC0 的 PTP 时间。在这种情况下,为了同步时间,应使用 PFE_EMAC0。


如果这些信息对您的问题有帮助,请告诉我

Re: S32G3 PFE External Timestamp Mode

感谢@alejandro_e的跟进和将问题升级。我会等待反馈的。

Re: S32G3 PFE External Timestamp Mode

你好@NidasioAlberto

您在时钟方面遇到的问题,即使用"外部时间戳模式" 和使用 ptp4l 获得错误配置的问题,不在我的专业范围之内。我将与内部团队联系,以便在此问题上获得更好的支持。这可能需要一些时间,感谢您的耐心等待。


关于 ptp4l 文档,请查看以下内容:

第20章 使用 ptp4l 配置 PTP | 系统管理员指南 | Red Hat Enterprise Linux | 7 | Red Hat 文档

alejandro_e_0-1755041461812.png


不过,这与恩智浦不提供的 ptp4l 程序有关,因此除了我们目前提供的支持外,我们无法提供更多支持。不便之处,敬请原谅。


关于本回复的第一个主题,我会给您回复。


Re: S32G3 PFE External Timestamp Mode

GitHub 上的 PFE 驱动程序软件仓库中,我看到管理外部时间戳模式的代码是由@jpetrous 提交的,也许他能帮上忙

Re: S32G3 PFE External Timestamp Mode

通过运行两个独立的 ptp4l 实例(使用 `-s` 选项更能启用客户端模式),两个接口可以同时成为客户端。在这种情况下,两个接口的外设硬件时钟同步后,phc2sys 应使用哪一个来同步系统时钟?

我想实现的是,在多个端口上运行一个 ptp4l 实例,同步一个硬件时钟。我想实现一个边界时钟,它在一个端口上与上游主端口同步,并在其他端口上作为主端口提供自己的时钟。

ptp4l 可在多个接口上运行。LinuxPTP 文档是这么说的,而且我也用 SJA1110 交换机实现了我想做的事情。我的做法是启用 SJA 的 DSA 驱动程序,并运行 `ptp4l -i p2 -i p3 -2 -m`。在 linux 中,DSA 驱动程序暴露了交换机接口,它们具有相同的硬件时钟(ethtool 也报告了这一点,显示时钟为 4)。由于这两个端口具有相同的硬件时钟,ptp4l 可以同时使用它们。在这个配置中,我看到ptp4l 通过两个接口中的一个选择一个主控程序,如果该主控程序失效,则从另一个接口选择新的主控程序。如果BMCA算法选择这样做,那么板本身就可以成为主板。有了这个,我还可以运行 `phc2sys -a -rr -m` 来自动将系统时钟同步到硬件时钟(如果板是从机),或者如果它充当特级主时钟,则硬件时钟与系统时钟同步。

由于我为 pfe1 和 pfe2 启用了"外部时间戳模式" (如我第一篇文章所述),因此 pfe1 和 pfe2 的硬件时钟由 pfe0 的硬件时钟产生。通过运行您提供的两个ptp4l 实例(仅客户端模式),当ptp4l 需要调整硬件时钟时,会出现错误。

root@s32g399ardb3:~# ptp4l -i pfe2 -2 -m
ptp4l[72513.760]: selected /dev/ptp3 as PTP clock
ptp4l[72513.796]: port 1 (pfe2): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[72513.796]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[72513.796]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[72514.342]: port 1 (pfe2): new foreign master 00049f.fffe.096f15-1
ptp4l[72518.342]: selected best master clock 00049f.fffe.096f15
ptp4l[72518.343]: port 1 (pfe2): LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[72520.342]: master offset -1593121442 s0 freq +227123 path delay 788
ptp4l[72521.349]: failed to adjust the clock: Operation not supported
ptp4l[72522.342]: master offset -1593112737 s0 freq +231478 path delay -211
ptp4l[72523.349]: failed to adjust the clock: Operation not supported

这确实是有感知,因为如果我告诉板 pfe1 和 pfe2 的硬件时钟源自 pfe0,那么我就无法修改它们。

我的问题是"外部时间戳模式" 启用 pfe1 和 pfe2 后,为什么在 Linux 中 pfe1 和 pfe2 外设与硬件时钟 1 无关,而是与它们的时钟(分别为 2 和 3)有关。我的意思是,在 SJA1110 的 DSA 驱动程序中,不同的接口与相同的硬件时钟(本例中为 `/dev/ptp4`)相关。详情请参阅我的第一个帖子。那么,这是一个错误,还是我需要配置其他东西?也许我缺少的设备树中还有其他东西要修改?

是否也可以参考一些文档?比如,如果 ptp4l 不支持多端口,我在哪里可以找到这方面的记录?


另外,非常感谢@alejandro_e的帮助。

Re: S32G3 PFE External Timestamp Mode

你好,@NidasioAlberto

谢谢你的澄清,我没有正确理解你的问题。

为方便起见,我在下面的示例中使用了 end0 和 pfe2,但使用 pfe1 和 pfe2 也能达到同样的效果。

每条 ptp4l 命令只能支持一个接口,因此需要运行两条命令,具体方法如下:

ptp4l -2 -H -i pfe2 -s -m > /var/log/ptp4l_pfe2.log & ptp4l -2 -H -i end0 -s -m > /var/log/ptp4l_end0.log &

每条命令末尾的&将把每条命令的执行发送到后台,因此你将获得终端的控制权。输出结果将保存在每条命令中指定的文件中,文件名可以随意命名,我选择这个名字是为了方便。


例如:

s32g399ardb3 login: root
root@s32g399ardb3:~# ip addr add 192.168.0.131/24 dev pfe2
root@s32g399ardb3:~# ip addr add 192.168.0.130/24 dev end0
root@s32g399ardb3:~# ptp4l -2 -H -i pfe2 -s -m > /var/log/ptp4l_pfe2.log & ptp4l -2 -H -i end0 -s -m > /var/log/ptp4l_end0.log &
[1] 455
[2] 456
root@s32g399ardb3:~# jobs
[1]-  Running                 ptp4l -2 -H -i pfe2 -s -m > /var/log/ptp4l_pfe2.log &
[2]+  Running                 ptp4l -2 -H -i end0 -s -m > /var/log/ptp4l_end0.log &
root@s32g399ardb3:~# cat /var/log/ptp4l_pfe2.log
ptp4l[79.716]: selected /dev/ptp2 as PTP clock
ptp4l[79.744]: port 1 (pfe2): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[79.744]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[79.745]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[85.948]: selected local clock 00049f.fffe.beef02 as best master
root@s32g399ardb3:~# cat /var/log/ptp4l_end0.log
ptp4l[79.716]: selected /dev/ptp3 as PTP clock
ptp4l[79.760]: port 1 (end0): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[79.760]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[79.760]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[85.911]: selected local clock b2ecbb.fffe.ef0375 as best master
root@s32g399ardb3:~#

首先,我为每个接口分配了一个 IP,然后为每个接口调用了 ptp4l,最后在终端上显示了日志文件的内容。

为此,我将设备同时连接到 P3B(PFE2)和 P3A(GMAC0),否则可能会出现一些错误日志。


请告诉我这是否解决了你的问题。

Re: S32G3 PFE External Timestamp Mode

感谢@alejandro_e 的回答,但我的问题仍然存在。我试着进一步解释一下。

S32G3 的 PFE 外设有 3 个接口,一个连接到 SJA1110 交换机,另外两个公开在板上(图中的 PFE_MAC0 和 PFE_MAC1)。

S32G-VNP-RDB3 ports simple diagram.png

我的目标应用程序包括通过两个接口将客户端连接到板,并通过PTP与它们同步。因此,我需要 ptp4l 同时运行两个接口,而不是只分别运行 pfe1 或 pfe2。

从ptp4l 工具的 LinuxPTP 文档中,如果我想使用硬件时间戳,我读到了这一点。

由 -i 选项和配置文件指定的所有端口必须连接到同一个 PTP 硬件时钟 (PHC)。

因此,出于这个原因,我需要配置板,使两个接口使用相同的硬件时钟。

Re: S32G3 PFE External Timestamp Mode

你好,@NidasioAlberto

感谢您与我们联系。我完成了 BSP44 用户指南中描述的步骤,我能够毫无问题地配置 PTP 时间戳,我使用了预编译的映像,它应该与 yocto 版本相同。虽然命令语法不同,但我使用了

ptp4l -2 -H -i end0 -m -s

输出结果如下

root@s32g399ardb3:~#  ptp4l -2 -H -i pfe2 -m -s
ptp4l[331.563]: selected /dev/ptp2 as PTP clock
ptp4l[331.600]: port 1 (pfe2): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[331.600]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[331.600]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[337.781]: selected local clock 00049f.fffe.beef02 as best master
ptp4l[385.758]: port 1 (pfe2): link down
ptp4l[385.758]: port 1 (pfe2): LISTENING to FAULTY on FAULT_DETECTED (FT_UNSPECIFIED)
ptp4l[385.788]: port 1 (pfe2): assuming the grand master role
ptp4l[385.788]: port 1 (pfe2): master state recommended in slave only mode
ptp4l[385.788]: port 1 (pfe2): defaultDS.priority1 probably misconfigured

断开以太网电缆连接后,出现链接中断信息。

在此之前,我只需要用下面的方法配置 P3A 端口的 IP:

ip addr add 192.168.0.131/24 dev pfe2

alejandro_e_0-1754696762765.png


我把它连接到我的 Window 11 电脑上。

如果使用 PFE1,应该会得到相同的结果:

ptp4l -2 -H -i pfe1 -m -s


请告诉我是否正确理解了您的问题

标记 (1)
无评分
版本历史
最后更新:
‎11-21-2025 01:01 AM
更新人: