phc2sys: use the system offset method if available
We use the PTP_SYS_OFFSET ioctl method in preference to doing clock_gettime from user space, the assumption being that the kernel space measurement will always be more accurate. Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
36a5224b5a
commit
4ef70c3d2e
4
makefile
4
makefile
|
@ -31,7 +31,7 @@ PRG = ptp4l pmc phc2sys hwstamp_ctl
|
||||||
OBJ = bmc.o clock.o config.o fsm.o ptp4l.o mave.o msg.o phc.o pi.o port.o \
|
OBJ = bmc.o clock.o config.o fsm.o ptp4l.o mave.o msg.o phc.o pi.o port.o \
|
||||||
print.o raw.o servo.o sk.o tlv.o tmtab.o transport.o udp.o udp6.o uds.o util.o
|
print.o raw.o servo.o sk.o tlv.o tmtab.o transport.o udp.o udp6.o uds.o util.o
|
||||||
|
|
||||||
OBJECTS = $(OBJ) pmc.o phc2sys.o hwstamp_ctl.o
|
OBJECTS = $(OBJ) pmc.o phc2sys.o hwstamp_ctl.o sysoff.o
|
||||||
SRC = $(OBJECTS:.o=.c)
|
SRC = $(OBJECTS:.o=.c)
|
||||||
DEPEND = $(OBJECTS:.o=.d)
|
DEPEND = $(OBJECTS:.o=.d)
|
||||||
srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
|
srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
|
@ -48,7 +48,7 @@ ptp4l: $(OBJ)
|
||||||
|
|
||||||
pmc: pmc.o msg.o print.o raw.o sk.o tlv.o transport.o udp.o udp6.o uds.o util.o
|
pmc: pmc.o msg.o print.o raw.o sk.o tlv.o transport.o udp.o udp6.o uds.o util.o
|
||||||
|
|
||||||
phc2sys: phc2sys.o sk.o print.o
|
phc2sys: phc2sys.o sk.o sysoff.o print.o
|
||||||
|
|
||||||
hwstamp_ctl: hwstamp_ctl.o
|
hwstamp_ctl: hwstamp_ctl.o
|
||||||
|
|
||||||
|
|
26
phc2sys.c
26
phc2sys.c
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
#include "missing.h"
|
#include "missing.h"
|
||||||
#include "sk.h"
|
#include "sk.h"
|
||||||
|
#include "sysoff.h"
|
||||||
|
|
||||||
#define KP 0.7
|
#define KP 0.7
|
||||||
#define KI 0.3
|
#define KI 0.3
|
||||||
|
@ -228,6 +229,26 @@ static int do_pps_loop(char *pps_device, double kp, double ki, clockid_t dst)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_sysoff_loop(clockid_t src, clockid_t dst,
|
||||||
|
int rate, int n_readings, int sync_offset,
|
||||||
|
double kp, double ki)
|
||||||
|
{
|
||||||
|
uint64_t ts;
|
||||||
|
int64_t offset;
|
||||||
|
int err = 0, fd = CLOCKID_TO_FD(src);
|
||||||
|
while (1) {
|
||||||
|
usleep(1000000 / rate);
|
||||||
|
if (sysoff_measure(fd, n_readings, &offset, &ts)) {
|
||||||
|
err = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset -= sync_offset * NS_PER_SEC;
|
||||||
|
do_servo(&servo, dst, offset, ts, kp, ki);
|
||||||
|
show_servo(stdout, "sys", offset, ts);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static void usage(char *progname)
|
static void usage(char *progname)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
@ -323,6 +344,11 @@ int main(int argc, char *argv[])
|
||||||
if (device)
|
if (device)
|
||||||
return do_pps_loop(device, kp, ki, dst);
|
return do_pps_loop(device, kp, ki, dst);
|
||||||
|
|
||||||
|
if (dst == CLOCK_REALTIME &&
|
||||||
|
SYSOFF_SUPPORTED == sysoff_probe(CLOCKID_TO_FD(src), phc_readings))
|
||||||
|
return do_sysoff_loop(src, dst, phc_rate,
|
||||||
|
phc_readings, sync_offset, kp, ki);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
usleep(1000000 / phc_rate);
|
usleep(1000000 / phc_rate);
|
||||||
if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) {
|
if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) {
|
||||||
|
|
Loading…
Reference in New Issue