Рейтинг:1

Неверные временные метки PTP

флаг bd

У меня проблемы с синхронизацией с системами Linux с использованием PTP.

Настраивать:

Две печатные платы с модулем BegleCore и DP83640 PHY связаны друг с другом через 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:

[Глобальный]
серверТолько 1
BMCA ноуп

Содержимое configSlave.cfg:

[Глобальный]
clientOnly 1
BMCA ноуп
step_threshold 1

Это приводит к следующему выводу на подчиненном устройстве:

ptp4l[438753.396]: выбран /dev/ptp0 в качестве часов PTP
ptp4l[438753.409]: порт 1 (eth0): ИНИЦИАЛИЗАЦИЯ в ПОДЧИНЕННЫЙ на INIT_COMPLETE
ptp4l[438753.414]: порт 0 (/var/run/ptp4l): ИНИЦИАЛИЗАЦИЯ для ПРОСЛУШИВАНИЯ при INIT_COMPLETE
ptp4l[438753.418]: порт 0 (/var/run/ptp4lro): ИНИЦИАЛИЗАЦИЯ для ПРОСЛУШИВАНИЯ при INIT_COMPLETE
ptp4l[438754.075]: порт 1 (eth0): новый внешний мастер 304511.fffe.0ff048-1                                                                                       
ptp4l[438758.074]: выбраны лучшие главные часы 304511.fffe.0ff048
ptp4l[438762.072]: основное смещение 2426120726467 с0 частота -261066 задержка пути 15040
ptp4l[438762.074]: выбраны лучшие главные часы 304511.fffe.0ff048
ptp4l[438765.074]: основное смещение 2426120697575 частота с1 -270698 задержка пути 15156
ptp4l[438767.072]: основное смещение 2426120678191 с0 частота -270698 задержка пути 15156
ptp4l[438768.075]: основное смещение 2426120668273 частота с1 -280618 задержка пути 15830
ptp4l[438769.072]: основное смещение 2426120658469 с0 частота -280618 задержка пути 15830
ptp4l[438770.073]: основное смещение 2426120648789 с0 частота -280618 задержка пути 16022
ptp4l[438771.076]: основное смещение 2426120639057 частота с1 -290350 задержка пути 16022
...

Заявленное смещение составляет приблизительно 40 минут. Перед запуском ptp4l я установил часы PTP на физическом уровне с помощью testptp -s к текущему системному времени. Таким образом, часы PTP фактически находились в пределах нескольких секунд друг от друга.

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

Я также изучил сетевой трафик с помощью Wireshark и увидел, что последующие сообщения от мастера содержат метку времени, которая примерно на 69 минут меньше, чем часы PTP на физическом уровне. После добавления выходных данных отладки в ptp4l я увидел, что на подчиненном устройстве временная метка, которую он извлекает из cmsgs, возвращенного из сокета, смещена примерно на -27 минут от того, что на самом деле представляют собой часы PTP клиента.

Разница между ложными временными метками (+69 минут), отправленными мастером, и ложно прочитанными временными метками (-27 минут) клиентом приводит к 40-минутному предполагаемому смещению между главными часами и часами клиента.

Рейтинг:0
флаг bd

Я решил проблему с: Отключить поддержку CPTS в настройках ядра и изменить файл cpsw.c следующим образом:

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
индекс 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)
структура cpsw_priv *priv = netdev_priv(dev);
структура cpsw_common *cpsw = priv->cpsw;
int slave_no = cpsw_slave_index (cpsw, priv);
+ интер ошибка = 0;

если (!netif_running(dev))
возврат -ЭИНВАЛ;

переключатель (команда) {
случай SIOCSHWTSTAMP:
- вернуть cpsw_hwtstamp_set(dev, req);
+ ошибка = cpsw_hwtstamp_set (dev, req);
+ если(ошибка != -EOPNOTSUPP)
+ вернуть ошибку;
+ перерыв;
случай SIOCGHWTSMP:
- вернуть cpsw_hwtstamp_get(dev, req);
+ ошибка = cpsw_hwtstamp_get(dev, req);
+ если(ошибка != -EOPNOTSUPP)
+ вернуть ошибку;
+ перерыв;
случай SIOCSWITCHCONFIG:
вернуть cpsw_switch_config_ioctl (dev, req, cmd);
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.