Linux-Networking
PTP 時間戳不正確
我無法使用 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); }