Commit 43921594 authored by Benoit Rat's avatar Benoit Rat

tools: wr_date: fix setting time from host to FPGA/WR

- Calling twice this function does not adjust nanoseconds, the user need
to call adjns function in order to perform this.
- Move printf only after setting time to be more deterministic
parent c62dac4b
......@@ -42,9 +42,10 @@ void help(char *prgname)
" -n do not act in practice\n"
" get print WR time to stdout\n"
" get tohost print WR time and set system time\n"
" set <value> set WR time to scalar seconds\n"
" set host set TAI from current host time\n"
" diff show the difference between WR FPGA time (HW) and linux time (SW)\n"
" set <value> set WR time from scalar seconds\n"
" set host set WR TAI from current host time\n"
" adjns host Adjust WR TAI nanoseconds from current host time\n"
/* " set ntp set TAI from ntp and leap seconds" */
/* " set ntp:<ip> set from specified ntp server\n" */
, WRDATE_CFG_FILE);
......@@ -328,7 +329,7 @@ int fix_host_tai(void)
}
/* This sets WR time from host time */
int wrdate_internal_set(struct PPSG_WB *pps)
int wrdate_internal_set(struct PPSG_WB *pps, int adjns)
{
struct timeval tvh, tvr; /* host, rabbit */
signed long long diff64;
......@@ -352,6 +353,34 @@ int wrdate_internal_set(struct PPSG_WB *pps)
diff += 1000 * 1000;
}
if(adjns)
{
pps->ADJ_UTCLO = 0;
pps->ADJ_UTCHI = 0;
pps->ADJ_NSEC = diff * 64 + diff / 2;
asm("" : : : "memory"); /* barrier... */
pps->CR = pps->CR | PPSG_CR_CNT_ADJ;
if (opt_verbose)
printf("adjusting by %li usecs\n", diff);
}
else if (diff64) {
/* We must write a signed "adjustment" value */
pps->ADJ_UTCLO = diff64 & 0xffffffff;
pps->ADJ_UTCHI = (diff64 >> 32) & 0xff;
pps->ADJ_NSEC = 0;
asm("" : : : "memory"); /* barrier... */
pps->CR = pps->CR | PPSG_CR_CNT_ADJ;
if (opt_verbose)
printf("adjusting by %lli seconds\n", diff64);
}
else
{
if (opt_verbose) printf("Nothing done: wrdate seconds are already correctly set\n");
return 0;
}
//Printf only after setting time to be more deterministic
/* Warn if more than 200ms away */
if (diff > 200 * 1000 || diff < -200 * 1000)
fprintf(stderr, "%s: Warning: fractional second differs by"
......@@ -365,29 +394,11 @@ int wrdate_internal_set(struct PPSG_WB *pps)
printf("Fractional difference: %li usec\n", diff);
}
if (diff64) {
if (opt_verbose)
printf("adjusting by %lli seconds\n", diff64);
/* We must write a signed "adjustment" value */
pps->ADJ_UTCLO = diff64 & 0xffffffff;
pps->ADJ_UTCHI = (diff64 >> 32) & 0xff;
pps->ADJ_NSEC = 0;
asm("" : : : "memory"); /* barrier... */
pps->CR = pps->CR | PPSG_CR_CNT_ADJ;
} else {
if (opt_verbose)
printf("adjusting by %li usecs\n", diff);
pps->ADJ_UTCLO = 0;
pps->ADJ_UTCHI = 0;
pps->ADJ_NSEC = diff * 64 + diff / 2;
asm("" : : : "memory"); /* barrier... */
pps->CR = pps->CR | PPSG_CR_CNT_ADJ;
}
return 0;
}
/* Frontend to the set mechanism: parse the argument */
int wrdate_set(struct PPSG_WB *pps, char *arg)
int wrdate_set(struct PPSG_WB *pps, char *arg, int adjns)
{
char *s;
unsigned long t; /* WARNING: 64 bit */
......@@ -395,7 +406,13 @@ int wrdate_set(struct PPSG_WB *pps, char *arg)
if (!strcmp(arg, "host"))
return wrdate_internal_set(pps);
return wrdate_internal_set(pps,adjns);
if(adjns)
{
fprintf(stderr,"adjns function only support 'host' argument\n");
return 1;
}
s = strdup(arg);
if (sscanf(arg, "%li%s", &t, s) == 1) {
......@@ -406,12 +423,12 @@ int wrdate_set(struct PPSG_WB *pps, char *arg)
prgname, arg, strerror(errno));
exit(1);
}
return wrdate_internal_set(pps);
return wrdate_internal_set(pps,0);
}
/* FIXME: other time formats */
printf(" FIXME\n");
return 0;
fprintf(stderr,"Wrong format. Only parse seconds as scalar\n");
return 1;
}
int main(int argc, char **argv)
......@@ -468,8 +485,13 @@ int main(int argc, char **argv)
}
/* only other command is "set", with one argument */
if (!strcmp(cmd, "adjns")) {
if (optind == argc - 1)
return wrdate_set(pps, argv[optind],1);
}
if (strcmp(cmd, "set") || optind != argc - 1)
help(argv[0]);
return wrdate_set(pps, argv[optind]);
return wrdate_set(pps, argv[optind],0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment