linuxptp/SOURCES/linuxptp-nmeadelay2.patch
2025-02-05 09:44:30 +00:00

84 lines
3.2 KiB
Diff

commit 0d508d8cfb96cc32d3516f1d0d3e80db49f00468
Author: Miroslav Lichvar <mlichvar@redhat.com>
Date: Mon Jun 3 16:43:54 2024 +0200
ts2phc: Add option to correct for NMEA delay.
Add an option to specify the minimum expected delay of NMEA RMC messages
to correct timestamps returned by the NMEA PPS time source.
This enables operation with receivers that have delays outside of the
expected 0-1.0s interval, or 0-pulsewidth if the PPS edge rejection is
enabled.
[ RPC: Preserve alphabetical ordering in the ts2phc man page. ]
(Rebased to 4.2)
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
diff --git a/config.c b/config.c
index 58481db..d441d1e 100644
--- a/config.c
+++ b/config.c
@@ -347,6 +347,7 @@ struct config_item config_tab[] = {
PORT_ITEM_INT("ts2phc.holdover", 0, 0, INT_MAX),
PORT_ITEM_INT("ts2phc.master", 0, 0, 1),
PORT_ITEM_INT("ts2phc.nmea_baudrate", 9600, 300, INT_MAX),
+ PORT_ITEM_INT("ts2phc.nmea_delay", 0, INT_MIN, INT_MAX),
GLOB_ITEM_STR("ts2phc.nmea_remote_host", ""),
GLOB_ITEM_STR("ts2phc.nmea_remote_port", ""),
GLOB_ITEM_STR("ts2phc.nmea_serialport", "/dev/ttyS0"),
diff --git a/ts2phc.8 b/ts2phc.8
index c0b718b..b8383ff 100644
--- a/ts2phc.8
+++ b/ts2phc.8
@@ -262,6 +262,16 @@ by changing the clock frequency instead of stepping the clock. When
set to 0.0, the servo will never step the clock except on start.
The default is 0.0.
+.TP
+.B ts2phc.nmea_delay
+Specifies the minimum expected delay of NMEA RMC messages in nanoseconds.
+If the maximum delay is longer than 1 second, or 'ts2phc.pulsewidth'
+if 'ts2phc.extts_polarity' is set to "both", this option needs to be set
+accordingly to allow the timestamps from NMEA messages to be correctly
+assigned to pulses from the PPS signal and wrong PPS edges to be rejected if
+the edge rejection is enabled.
+The default is 0 nanoseconds.
+
.TP
.B ts2phc.nmea_remote_host, ts2phc.nmea_remote_port
Specifies the remote host providing ToD information when using the
diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c
index bdfaf19..e345969 100644
--- a/ts2phc_nmea_pps_source.c
+++ b/ts2phc_nmea_pps_source.c
@@ -33,6 +33,7 @@ struct ts2phc_nmea_pps_source {
pthread_t worker;
/* Protects anonymous struct fields, below, from concurrent access. */
pthread_mutex_t mutex;
+ tmv_t delay_correction;
struct {
struct timespec local_monotime;
struct timespec local_utctime;
@@ -207,6 +208,7 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src,
}
rmc = tmv_add(rmc, duration_since_rmc);
+ rmc = tmv_add(rmc, m->delay_correction);
*ts = tmv_to_timespec(rmc);
ts->tv_sec += tai_offset;
@@ -234,6 +236,8 @@ struct ts2phc_pps_source *ts2phc_nmea_pps_source_create(struct ts2phc_private *p
s->pps_source.destroy = ts2phc_nmea_pps_source_destroy;
s->pps_source.getppstime = ts2phc_nmea_pps_source_getppstime;
s->config = priv->cfg;
+ s->delay_correction = nanoseconds_to_tmv(
+ config_get_int(priv->cfg, NULL, "ts2phc.nmea_delay"));
pthread_mutex_init(&s->mutex, NULL);
err = pthread_create(&s->worker, NULL, monitor_nmea_status, s);
if (err) {