你好
我正在开发 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" 供电(图中虚线)。
要应用此配置(如本章所述),我将三台设备(使用 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 固件中是否有需要重新编译的地方?
你好,@NidasioAlberto、
太好了,这正是我得出的结论。
如果您需要更多支持,请告诉我,我会尽最大努力帮助您。
鉴于这篇文章的长度,如果你需要关注这个话题,请创建一个新帖子,你可以参考这篇文章来跟踪上下文。
谢谢!
谢谢@alejandro_e,我会尝试修补 PFE 驱动程序。
你好,@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 中,每个接口的时钟寄存器过程都会重复进行。
您可以修改源代码,使所有接口使用相同的虚拟时钟。这与我之前分享的信息有关:
如果所有 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。
如果这些信息对您有帮助,请告诉我
感谢@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
...
你好,@NidasioAlberto、
我从内部团队收到了以下反馈意见:
”
如果 PFE_EMAC1 和 PFE_EMAC2 共享来自 PFE_EMAC0 的时间戳,则不支持调整 PFE_EMAC1 和 PFE_EMAC2 的 PTP 时间,可以认为 PTP 时间寄存器以只读模式工作。并反映 PFE_EMAC0 的 PTP 时间。在这种情况下,为了同步时间,应使用 PFE_EMAC0。
“
如果这些信息对您的问题有帮助,请告诉我
感谢@alejandro_e的跟进和将问题升级。我会等待反馈的。
您在时钟方面遇到的问题,即使用"外部时间戳模式" 和使用 ptp4l 获得错误配置的问题,不在我的专业范围之内。我将与内部团队联系,以便在此问题上获得更好的支持。这可能需要一些时间,感谢您的耐心等待。
关于 ptp4l 文档,请查看以下内容:
第20章 使用 ptp4l 配置 PTP | 系统管理员指南 | Red Hat Enterprise Linux | 7 | Red Hat 文档
不过,这与恩智浦不提供的 ptp4l 程序有关,因此除了我们目前提供的支持外,我们无法提供更多支持。不便之处,敬请原谅。
关于本回复的第一个主题,我会给您回复。
从GitHub 上的 PFE 驱动程序软件仓库中,我看到管理外部时间戳模式的代码是由@jpetrous 提交的,也许他能帮上忙
通过运行两个独立的 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的帮助。
你好,@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),否则可能会出现一些错误日志。
请告诉我这是否解决了你的问题。
感谢@alejandro_e 的回答,但我的问题仍然存在。我试着进一步解释一下。
S32G3 的 PFE 外设有 3 个接口,一个连接到 SJA1110 交换机,另外两个公开在板上(图中的 PFE_MAC0 和 PFE_MAC1)。
我的目标应用程序包括通过两个接口将客户端连接到板,并通过PTP与它们同步。因此,我需要 ptp4l 同时运行两个接口,而不是只分别运行 pfe1 或 pfe2。
从ptp4l 工具的 LinuxPTP 文档中,如果我想使用硬件时间戳,我读到了这一点。
由 -i 选项和配置文件指定的所有端口必须连接到同一个 PTP 硬件时钟 (PHC)。
因此,出于这个原因,我需要配置板,使两个接口使用相同的硬件时钟。
你好,@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
我把它连接到我的 Window 11 电脑上。
如果使用 PFE1,应该会得到相同的结果:
ptp4l -2 -H -i pfe1 -m -s
请告诉我是否正确理解了您的问题