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 <richardcochran@gmail.com>
master
Richard Cochran 2015-06-08 15:55:55 +02:00
parent 3e1e894d22
commit fa79141211
5 changed files with 113 additions and 3 deletions

View File

@ -24,7 +24,7 @@ CFLAGS = -Wall $(VER) $(incdefs) $(DEBUG) $(EXTRA_CFLAGS)
LDLIBS = -lm -lrt $(EXTRA_LDFLAGS) LDLIBS = -lm -lrt $(EXTRA_LDFLAGS)
PRG = ptp4l pmc phc2sys hwstamp_ctl phc_ctl timemaster PRG = ptp4l pmc phc2sys hwstamp_ctl phc_ctl timemaster
OBJ = bmc.o clock.o clockadj.o clockcheck.o config.o fault.o \ 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 \ 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 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 \ 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 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 \ phc2sys: clockadj.o clockcheck.o linreg.o msg.o ntpshm.o nullf.o phc.o \
pmc_common.o print.o raw.o servo.o sk.o stats.o sysoff.o tlv.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 transport.o udp.o udp6.o uds.o util.o version.o
hwstamp_ctl: hwstamp_ctl.o version.o hwstamp_ctl: hwstamp_ctl.o version.o

79
nullf.c 100644
View File

@ -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 <richardcochran@gmail.com>
*
* 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 <stdlib.h>
#include <math.h>
#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;
}

26
nullf.h 100644
View File

@ -0,0 +1,26 @@
/**
* @file nullf.h
* @note Copyright (C) 2015 Richard Cochran <richardcochran@gmail.com>
*
* 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

View File

@ -20,6 +20,7 @@
#include "linreg.h" #include "linreg.h"
#include "ntpshm.h" #include "ntpshm.h"
#include "nullf.h"
#include "pi.h" #include "pi.h"
#include "servo_private.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: case CLOCK_SERVO_NTPSHM:
servo = ntpshm_servo_create(); servo = ntpshm_servo_create();
break; break;
case CLOCK_SERVO_NULLF:
servo = nullf_servo_create();
break;
default: default:
return NULL; return NULL;
} }

View File

@ -56,6 +56,7 @@ enum servo_type {
CLOCK_SERVO_PI, CLOCK_SERVO_PI,
CLOCK_SERVO_LINREG, CLOCK_SERVO_LINREG,
CLOCK_SERVO_NTPSHM, CLOCK_SERVO_NTPSHM,
CLOCK_SERVO_NULLF,
}; };
/** /**