Неправильные временные метки PTP
У меня проблемы с синхронизацией с системами Linux с помощью PTP.
Настраивать:
Две платы с модулем BegleCore и PHY DP83640 соединены друг с другом через Ethernet. Одна плата должна действовать как ведущая 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 я установил часы PTP в PHY с помощью
Каждый раз, когда ptp4l сообщает «главное смещение s1...», он переводит часы PTP назад на 40 минут (проверяется с помощью
Я также просмотрел сетевой трафик с помощью Wireshark и увидел, что последующие сообщения от ведущего устройства содержат временную метку, которая примерно на 69 минут больше той, на которую установлены часы PTP в PHY. После добавления выходных данных отладки в ptp4l я увидел, что на ведомом устройстве временная метка, которую он извлекает из cmsgs, возвращаемых из сокета, смещена примерно на -27 минут от фактического значения часов PTP клиента.
Разница между ложными временными метками (+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);
}