From fa79141211da3bbffe1c89814ff739b0b364a3a1 Mon Sep 17 00:00:00 2001 From: Richard Cochran Date: Mon, 8 Jun 2015 15:55:55 +0200 Subject: [PATCH] Add a servo that inhibits all frequency adjustment When running with Synchronous Ethernet (SyncE), the correct clock frequency is provided by the link partner. In this case, only the offset needs correcting. This patch provides SyncE nodes with an way to keep the frequency correction dialed to zero. Signed-off-by: Richard Cochran --- makefile | 6 ++--- nullf.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ nullf.h | 26 +++++++++++++++++++ servo.c | 4 +++ servo.h | 1 + 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 nullf.c create mode 100644 nullf.h diff --git a/makefile b/makefile index 0f22b16..a8e5ce8 100644 --- a/makefile +++ b/makefile @@ -24,7 +24,7 @@ CFLAGS = -Wall $(VER) $(incdefs) $(DEBUG) $(EXTRA_CFLAGS) LDLIBS = -lm -lrt $(EXTRA_LDFLAGS) PRG = ptp4l pmc phc2sys hwstamp_ctl phc_ctl timemaster OBJ = bmc.o clock.o clockadj.o clockcheck.o config.o fault.o \ - filter.o fsm.o linreg.o mave.o mmedian.o msg.o ntpshm.o phc.o \ + filter.o fsm.o linreg.o mave.o mmedian.o msg.o ntpshm.o nullf.o phc.o \ pi.o port.o print.o ptp4l.o raw.o servo.o sk.o stats.o tlv.o \ transport.o tsproc.o udp.o udp6.o uds.o util.o version.o @@ -49,8 +49,8 @@ ptp4l: $(OBJ) pmc: msg.o pmc.o pmc_common.o print.o raw.o sk.o tlv.o transport.o udp.o \ udp6.o uds.o util.o version.o -phc2sys: clockadj.o clockcheck.o linreg.o msg.o ntpshm.o phc.o phc2sys.o pi.o \ - pmc_common.o print.o raw.o servo.o sk.o stats.o sysoff.o tlv.o \ +phc2sys: clockadj.o clockcheck.o linreg.o msg.o ntpshm.o nullf.o phc.o \ + phc2sys.o pi.o pmc_common.o print.o raw.o servo.o sk.o stats.o sysoff.o tlv.o \ transport.o udp.o udp6.o uds.o util.o version.o hwstamp_ctl: hwstamp_ctl.o version.o diff --git a/nullf.c b/nullf.c new file mode 100644 index 0000000..5512837 --- /dev/null +++ b/nullf.c @@ -0,0 +1,79 @@ +/** + * @file nullf.c + * @brief Implements a clock servo that always set the frequency offset to zero. + * @note Copyright (C) 2015 Richard Cochran + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include +#include + +#include "nullf.h" +#include "print.h" +#include "servo_private.h" + +struct nullf_servo { + struct servo servo; +}; + +static void nullf_destroy(struct servo *servo) +{ + struct nullf_servo *s = container_of(servo, struct nullf_servo, servo); + free(s); +} + +static double nullf_sample(struct servo *servo, int64_t offset, + uint64_t local_ts, double weight, + enum servo_state *state) +{ + if (!offset) { + *state = SERVO_LOCKED; + return 0.0; + } + + if ((servo->first_update && servo->first_step_threshold && + servo->first_step_threshold < fabs(offset)) || + (servo->step_threshold && servo->step_threshold < fabs(offset))) { + *state = SERVO_JUMP; + } else { + *state = SERVO_UNLOCKED; + } + + return 0.0; +} + +static void nullf_sync_interval(struct servo *servo, double interval) +{ +} + +static void nullf_reset(struct servo *servo) +{ +} + +struct servo *nullf_servo_create(void) +{ + struct nullf_servo *s; + + s = calloc(1, sizeof(*s)); + if (!s) + return NULL; + + s->servo.destroy = nullf_destroy; + s->servo.sample = nullf_sample; + s->servo.sync_interval = nullf_sync_interval; + s->servo.reset = nullf_reset; + + return &s->servo; +} diff --git a/nullf.h b/nullf.h new file mode 100644 index 0000000..9e8bc7b --- /dev/null +++ b/nullf.h @@ -0,0 +1,26 @@ +/** + * @file nullf.h + * @note Copyright (C) 2015 Richard Cochran + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef HAVE_NULLF_H +#define HAVE_NULLF_H + +#include "servo.h" + +struct servo *nullf_servo_create(void); + +#endif diff --git a/servo.c b/servo.c index 2739ebd..b936a85 100644 --- a/servo.c +++ b/servo.c @@ -20,6 +20,7 @@ #include "linreg.h" #include "ntpshm.h" +#include "nullf.h" #include "pi.h" #include "servo_private.h" @@ -43,6 +44,9 @@ struct servo *servo_create(enum servo_type type, int fadj, int max_ppb, int sw_t case CLOCK_SERVO_NTPSHM: servo = ntpshm_servo_create(); break; + case CLOCK_SERVO_NULLF: + servo = nullf_servo_create(); + break; default: return NULL; } diff --git a/servo.h b/servo.h index 4be8c23..0a182a4 100644 --- a/servo.h +++ b/servo.h @@ -56,6 +56,7 @@ enum servo_type { CLOCK_SERVO_PI, CLOCK_SERVO_LINREG, CLOCK_SERVO_NTPSHM, + CLOCK_SERVO_NULLF, }; /**