![不正确的 PTP 时间戳](https://linux22.com/image/772935/%E4%B8%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%20PTP%20%E6%97%B6%E9%97%B4%E6%88%B3%20.png)
我无法使用 PTP 同步到 Linux 系统。
设置:
两个带有 BegleCore 模块和 DP83640 PHY 的 PCB 通过以太网相互连接。一个板应充当 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 之前,我已将 PHY 中的 PTP 时钟设置为testptp -s
当前系统时间。因此,PTP 时钟实际上相差几秒钟。
每次 ptp4l 报告“主偏移 s1 ...”时,它都会将 PTP 时钟调慢 40 分钟(使用 进行检查testptp -g
)。但报告的偏移仅变化了约 10 微秒。
我还使用 Wireshark 查看了网络流量,发现来自主设备的后续消息包含一个时间戳,该时间戳与 PHY 中设置的 PTP 时钟相差约 69 分钟。在将调试输出添加到 ptp4l 后,我发现在从设备上,它从套接字返回的 cmsgs 中提取的时间戳与客户端 PTP 时钟的实际值相差约 -27 分钟。
主机发送的错误时间戳(+69 分钟)与客户端错误读取的时间戳(-27 分钟)之间的差异导致主机时钟和客户端时钟之间假设有 40 分钟的偏移。
答案1
我通过以下方式解决了该问题:在内核选项中禁用 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);
}