phc2sys: add option to set slave-master time offset.

Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
master
Miroslav Lichvar 2012-11-05 17:13:30 +01:00 committed by Richard Cochran
parent a373805b6d
commit 1a83619b17
2 changed files with 14 additions and 2 deletions

View File

@ -24,6 +24,8 @@ phc2sys \- synchronize two clocks
.BI \-R " update-rate" .BI \-R " update-rate"
] [ ] [
.BI \-N " clock-readings" .BI \-N " clock-readings"
] [
.BI \-O " offset"
] ]
.SH DESCRIPTION .SH DESCRIPTION
@ -84,6 +86,10 @@ the fastest reading is used to update the slave clock, this is useful to
minimize the error caused by random delays in scheduling and bus utilization. minimize the error caused by random delays in scheduling and bus utilization.
The default is 5. The default is 5.
.TP .TP
.BI \-O " offset"
Specify the offset between the slave and master times in seconds.
The default is 0 seconds.
.TP
.BI \-h .BI \-h
Display a help message. Display a help message.

View File

@ -241,6 +241,7 @@ static void usage(char *progname)
" -I [ki] integration constant (0.3)\n" " -I [ki] integration constant (0.3)\n"
" -R [rate] slave clock update rate in HZ (1)\n" " -R [rate] slave clock update rate in HZ (1)\n"
" -N [num] number of master clock readings per update (5)\n" " -N [num] number of master clock readings per update (5)\n"
" -O [offset] slave-master time offset (0)\n"
" -h prints this message and exits\n" " -h prints this message and exits\n"
"\n", "\n",
progname); progname);
@ -253,12 +254,12 @@ int main(int argc, char *argv[])
clockid_t src = CLOCK_INVALID, dst = CLOCK_REALTIME; clockid_t src = CLOCK_INVALID, dst = CLOCK_REALTIME;
uint64_t phc_ts; uint64_t phc_ts;
int64_t phc_offset; int64_t phc_offset;
int c, phc_readings = 5, phc_rate = 1; int c, phc_readings = 5, phc_rate = 1, sync_offset = 0;
/* Process the command line arguments. */ /* Process the command line arguments. */
progname = strrchr(argv[0], '/'); progname = strrchr(argv[0], '/');
progname = progname ? 1+progname : argv[0]; progname = progname ? 1+progname : argv[0];
while (EOF != (c = getopt(argc, argv, "c:d:hs:P:I:R:N:i:"))) { while (EOF != (c = getopt(argc, argv, "c:d:hs:P:I:R:N:O:i:"))) {
switch (c) { switch (c) {
case 'c': case 'c':
dst = clock_open(optarg); dst = clock_open(optarg);
@ -281,6 +282,9 @@ int main(int argc, char *argv[])
case 'N': case 'N':
phc_readings = atoi(optarg); phc_readings = atoi(optarg);
break; break;
case 'O':
sync_offset = atoi(optarg);
break;
case 'i': case 'i':
ethdev = optarg; ethdev = optarg;
break; break;
@ -311,6 +315,7 @@ int main(int argc, char *argv[])
struct timespec now; struct timespec now;
if (clock_gettime(src, &now)) if (clock_gettime(src, &now))
perror("clock_gettime"); perror("clock_gettime");
now.tv_sec += sync_offset;
if (clock_settime(dst, &now)) if (clock_settime(dst, &now))
perror("clock_settime"); perror("clock_settime");
} }
@ -323,6 +328,7 @@ int main(int argc, char *argv[])
if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) { if (!read_phc(src, dst, phc_readings, &phc_offset, &phc_ts)) {
continue; continue;
} }
phc_offset -= sync_offset * NS_PER_SEC;
do_servo(&servo, dst, phc_offset, phc_ts, kp, ki); do_servo(&servo, dst, phc_offset, phc_ts, kp, ki);
show_servo(stdout, "phc", phc_offset, phc_ts); show_servo(stdout, "phc", phc_offset, phc_ts);
} }