Неправильные временные метки 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 с помощьюк текущему системному времени. Таким образом, часы PTP фактически отличались друг от друга в пределах нескольких секунд.

Каждый раз, когда ptp4l сообщает «главное смещение s1...», он переводит часы PTP назад на 40 минут (проверяется с помощью). Тем не менее, заявленное смещение меняется всего лишь примерно на 10 долларов США.

Я также просмотрел сетевой трафик с помощью 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);
}
Другие вопросы по тегам