我在使用PTP与Linux系统同步时遇到了困难。
设置:
两个带有BegleCore模块和DP83640物理层的多氯联苯通过以太网相互连接。一个董事会应充当PTP的主人,另一个应充当奴隶。Debian 10,内核: 4.19.94驱动程序的Phy被加载。使用linuxptp v3.1
在主系统上,我运行以下命令:
sudo ptp4l -i eth0 -f linuxptp/configs/configMaster.cfg -m
在我运行的客户端系统上:
sudo ptp4l -i eth0 -f linuxptp/configs/configslave.cfg -m
ConfigMaster.cfg的内容:
[global]
serverOnly 1
BMCA noop
ConfigSlave.cfg的内容:
[global]
clientOnly 1
BMCA noop
step_threshold 1
这将在从服务器上产生以下输出:
ptp4l[438753.396]: selected /dev/ptp0 as PTP clock
ptp4l[438753.409]: port 1 (eth0): INITIALIZING to SLAVE on INIT_COMPLETE
ptp4l[438753.414]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[438753.418]: port 0 (/var/run/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[438754.075]: port 1 (eth0): new foreign master 304511.fffe.0ff048-1
ptp4l[438758.074]: selected best master clock 304511.fffe.0ff048
ptp4l[438762.072]: master offset 2426120726467 s0 freq -261066 path delay 15040
ptp4l[438762.074]: selected best master clock 304511.fffe.0ff048
ptp4l[438765.074]: master offset 2426120697575 s1 freq -270698 path delay 15156
ptp4l[438767.072]: master offset 2426120678191 s0 freq -270698 path delay 15156
ptp4l[438768.075]: master offset 2426120668273 s1 freq -280618 path delay 15830
ptp4l[438769.072]: master offset 2426120658469 s0 freq -280618 path delay 15830
ptp4l[438770.073]: master offset 2426120648789 s0 freq -280618 path delay 16022
ptp4l[438771.076]: master offset 2426120639057 s1 freq -290350 path delay 16022
...
报道的偏移量约为40分钟。在运行ptp4l之前,我已经用testptp -s
将PHYs中的PTP时钟设置为当前系统时间。因此,PTP时钟实际上是在几秒钟内彼此之间的。
每次ptp4l报告一个“主偏移量s1 .”它确实使PTP时钟倒退了40分钟(用testptp -g
检查)。然而,这一报道只抵消了大约10美元的变化。
我还用Wireshark查看了网络流量,并看到来自主机的后续消息包含一个时间戳,大约是PHY中PTP时钟设置的69分钟。在向ptp4l添加调试输出后,我看到,在从套接字返回的cmsgs中提取的时间戳上,它从从套接字返回的cmsgs中提取的时间戳与客户端PTP时钟的实际值相差约-27分钟。
与主时钟发送的假时间戳(+69分钟)和客户端错误读取时间戳(-27分钟)的差异导致主时钟和客户端时钟之间假定偏移时间为40分钟。
发布于 2021-12-09 09:16:52
我解决了以下问题:禁用内核选项中的CPTS支持,并以下列方式修改文件cpsw.c:
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index fc8e3ed383a2..d4d70706e86c 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -2490,15 +2490,22 @@ static int cpsw_ndo_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
struct cpsw_priv *priv = netdev_priv(dev);
struct cpsw_common *cpsw = priv->cpsw;
int slave_no = cpsw_slave_index(cpsw, priv);
+ int err = 0;
if (!netif_running(dev))
return -EINVAL;
switch (cmd) {
case SIOCSHWTSTAMP:
- return cpsw_hwtstamp_set(dev, req);
+ err = cpsw_hwtstamp_set(dev, req);
+ if(err != -EOPNOTSUPP)
+ return err;
+ break;
case SIOCGHWTSTAMP:
- return cpsw_hwtstamp_get(dev, req);
+ err = cpsw_hwtstamp_get(dev, req);
+ if(err != -EOPNOTSUPP)
+ return err;
+ break;
case SIOCSWITCHCONFIG:
return cpsw_switch_config_ioctl(dev, req, cmd);
}
https://serverfault.com/questions/1085555
复制相似问题