Linux-Networking

PTP 時間戳不正確

  • December 9, 2021

我無法使用 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 us。

我還使用 Wireshark 查看了網路流量,發現來自主設備的後續消息包含一個時間戳,該時間戳是 PHY 中 PTP 時鐘設置的大約 69 分鐘。在將調試輸出添加到 ptp4l 之後,我看到,在從站上,它從從套接字返回的 cmsgs 中提取的時間戳與客戶端 PTP 時鐘的實際值相比偏移了大約 -27 分鐘。

主時鐘發送的錯誤時間戳(+69 分鐘)和客戶端錯誤讀取的時間戳(-27 分鐘)之間的差異導致主時鐘和客戶端時鐘之間的假設偏移量為 40 分鐘。

我解決了這個問題:禁用核心選項中的 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