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
parent
3e1e894d22
commit
fa79141211
6
makefile
6
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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
4
servo.c
4
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue