summaryrefslogtreecommitdiffstats
path: root/usr.sbin/xntpd
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1995-07-21 13:04:07 +0000
committerjkh <jkh@FreeBSD.org>1995-07-21 13:04:07 +0000
commit7e7ec9acb6a342e9a2e4063d83c6c0e064e75c35 (patch)
treed8c4f11d7bb265fc2aae6f7f14c5bb9684be2cae /usr.sbin/xntpd
parent237c7bb61ec0d318b3c7e3b0327aa3cb46e7f411 (diff)
downloadFreeBSD-src-7e7ec9acb6a342e9a2e4063d83c6c0e064e75c35.zip
FreeBSD-src-7e7ec9acb6a342e9a2e4063d83c6c0e064e75c35.tar.gz
Support for the Boeder DCF77 Receiver
Submitted by: Vincenzo Capuano <VCAPUANO@VMPROFS.ESOC.ESA.DE>
Diffstat (limited to 'usr.sbin/xntpd')
-rw-r--r--usr.sbin/xntpd/Makefile.inc2
-rw-r--r--usr.sbin/xntpd/README2
-rw-r--r--usr.sbin/xntpd/conf/ntp.conf.dcf7719
-rw-r--r--usr.sbin/xntpd/doc/README.refclock5
-rw-r--r--usr.sbin/xntpd/include/ntp_machine.h3
-rw-r--r--usr.sbin/xntpd/parse/README.parse_clocks7
-rw-r--r--usr.sbin/xntpd/parse/util/dcfd.c12
-rw-r--r--usr.sbin/xntpd/xntpd/ntp_refclock.c2
-rw-r--r--usr.sbin/xntpd/xntpd/ntpd.c2
-rw-r--r--usr.sbin/xntpd/xntpd/refclock_parse.c104
10 files changed, 130 insertions, 28 deletions
diff --git a/usr.sbin/xntpd/Makefile.inc b/usr.sbin/xntpd/Makefile.inc
index 68eebc0..37c3645 100644
--- a/usr.sbin/xntpd/Makefile.inc
+++ b/usr.sbin/xntpd/Makefile.inc
@@ -3,7 +3,7 @@ NTPDEFS= -DSYS_FREEBSD -DSYS_44BSD
AUTHDEFS= -DMD5
CLOCKDEFS= -DLOCAL_CLOCK -DPST -DWWVB -DAS2201 -DGOES -DGPSTM -DOMEGA \
-DLEITCH -DTRAK -DACTS -DATOM -DDATUM -DHEATH -DMSFEES \
- -DMX4200 -DNMEA -DWWVB
+ -DMX4200 -DNMEA -DBOEDER
CFLAGS+= ${NTPDEFS} ${DEFS_LOCAL} ${AUTHDEFS} ${CLOCKDEFS} ${COPTS}
BINDIR?= /usr/sbin
diff --git a/usr.sbin/xntpd/README b/usr.sbin/xntpd/README
index 83d38a8..43780d6 100644
--- a/usr.sbin/xntpd/README
+++ b/usr.sbin/xntpd/README
@@ -123,6 +123,8 @@ parse/util some goodies for testing parse processing of DCF77 information.
one little gem is dcfd.c - DCF77 decoder with ntp loopfilter
code for standalone DCF77 synchronisation without the full
works of NTP.
+ Dcfd.c has been ported to FreeBSD for the Boeder DCF77 receiver
+ by Vincenzo Capuano.
ppsclock directory containing sources for modifications to the
kernel asynchronous serial driver plus a STREAMS module
diff --git a/usr.sbin/xntpd/conf/ntp.conf.dcf77 b/usr.sbin/xntpd/conf/ntp.conf.dcf77
new file mode 100644
index 0000000..678d719
--- /dev/null
+++ b/usr.sbin/xntpd/conf/ntp.conf.dcf77
@@ -0,0 +1,19 @@
+#
+# XNTP configuration file (/etc/ntp.conf)
+#
+
+#
+# Server is a Boeder DCF77 receiver
+#
+# Use:
+# 127.127.8.40 for /dev/refclock-0 (/dev/ttyd0)
+# 127.127.8.41 for /dev/refclock-1 (/dev/ttyd1)
+# 127.127.8.42 for /dev/refclock-2 (/dev/ttyd2)
+# 127.127.8.43 for /dev/refclock-3 (/dev/ttyd3)
+#
+server 127.127.8.40
+
+#
+# drift file
+#
+driftfile /etc/ntp.drift
diff --git a/usr.sbin/xntpd/doc/README.refclock b/usr.sbin/xntpd/doc/README.refclock
index 1b9a510..8c6c228 100644
--- a/usr.sbin/xntpd/doc/README.refclock
+++ b/usr.sbin/xntpd/doc/README.refclock
@@ -653,6 +653,7 @@ Type 8: Generic Reference Clock Driver
ELV DCF7000 (sloppy AM demodulation / 50ms)
127.127.8.16-19 16
+
Walter Schmid DCF receiver Kit (AM demodulation / 1ms)
127.127.8.20-23 16
@@ -671,6 +672,10 @@ Type 8: Generic Reference Clock Driver
Trimble SV6 GPS receiver (GPS / <<1us)
+ 127.127.8.40-43 16
+
+ RAW DCF77 100/200ms pulses (Boeder DCF77 receiver / 5ms)
+
The reference clock support carefully monitors the state
transitions of the receiver. All state changes and exceptional
events such as loss of time code transmission are logged via the
diff --git a/usr.sbin/xntpd/include/ntp_machine.h b/usr.sbin/xntpd/include/ntp_machine.h
index 0b62ed1..25de021 100644
--- a/usr.sbin/xntpd/include/ntp_machine.h
+++ b/usr.sbin/xntpd/include/ntp_machine.h
@@ -381,6 +381,9 @@ in this file.
#endif
#define MCAST
#ifdef SYS_FREEBSD
+#ifdef HAVE_SIGNALED_IO
+#undef HAVE_SIGNALED_IO
+#endif
#define HAVE_TERMIOS
#define HAVE_UNAME
#define HAVE_SYS_TIMEX_H
diff --git a/usr.sbin/xntpd/parse/README.parse_clocks b/usr.sbin/xntpd/parse/README.parse_clocks
index cf8d77e..a3c5a80 100644
--- a/usr.sbin/xntpd/parse/README.parse_clocks
+++ b/usr.sbin/xntpd/parse/README.parse_clocks
@@ -119,9 +119,10 @@ in the parse/clk_*.c and xntpd/refclock_parse.c files).
For the Meinberg parse look into clock_meinberg.c
---
- RAWDCF: 127.127.8.20-23 (Conrad receiver module - delay 210ms)
- 127.127.8.24-27 (FAU receiver - delay 258ms)
- RAWDCF: end=TIMEOUT>1.5s, sync each char (any char),generate psuedo time
+ RAWDCF: 127.127.8.20-23 (Conrad receiver module - delay 258ms)
+ 127.127.8.24-27 (FAU receiver - delay 210ms)
+ 127.127.8.40-43 (Boeder receiver - delay 258ms)
+ RAWDCF: end=TIMEOUT>1.5s, sync each char (any char), generate psuedo time
codes, fixed format
direct DCF77 code input
diff --git a/usr.sbin/xntpd/parse/util/dcfd.c b/usr.sbin/xntpd/parse/util/dcfd.c
index e8103d4..0a1f7fe 100644
--- a/usr.sbin/xntpd/parse/util/dcfd.c
+++ b/usr.sbin/xntpd/parse/util/dcfd.c
@@ -1544,8 +1544,16 @@ main(argc, argv)
* last error is valid
*/
#if defined(BOEDER)
- time_offset.tv_sec = utc_time - tt.tv_sec;
- time_offset.tv_usec = 0;
+ if (abs(utc_time - tt.tv_sec) > 10)
+ {
+ time_offset.tv_sec = utc_time - tt.tv_sec;
+ time_offset.tv_usec = 0;
+ }
+ else
+ {
+ time_offset.tv_sec = lasterror / 1000000;
+ time_offset.tv_usec = lasterror % 1000000;
+ }
#else
time_offset.tv_sec = lasterror / 1000000;
time_offset.tv_usec = lasterror % 1000000;
diff --git a/usr.sbin/xntpd/xntpd/ntp_refclock.c b/usr.sbin/xntpd/xntpd/ntp_refclock.c
index 41aec27..29c80d9 100644
--- a/usr.sbin/xntpd/xntpd/ntp_refclock.c
+++ b/usr.sbin/xntpd/xntpd/ntp_refclock.c
@@ -54,7 +54,7 @@
* streams module described in the ppsclock directory.
*/
#define REFCLOCKMAXDISPERSE (FP_SECOND/4) /* max sample dispersion */
-#define MAXUNIT 4 /* max units */
+#define MAXUNIT 44 /* max units */
#ifndef CLKLDISC
#define CLKLDISC 10 /* XXX temp tty_clk line discipline */
#endif
diff --git a/usr.sbin/xntpd/xntpd/ntpd.c b/usr.sbin/xntpd/xntpd/ntpd.c
index 43ae699..ae06f56 100644
--- a/usr.sbin/xntpd/xntpd/ntpd.c
+++ b/usr.sbin/xntpd/xntpd/ntpd.c
@@ -123,7 +123,7 @@ main(argc, argv)
#define BSD19906
#endif /* BSD... */
#endif /* BSD sun */
-#if defined(BSD19906)
+#if defined(BSD19906) || defined(SYS_44BSD)
daemon(0, 0);
#else /* BSD19906 */
if (fork())
diff --git a/usr.sbin/xntpd/xntpd/refclock_parse.c b/usr.sbin/xntpd/xntpd/refclock_parse.c
index b8ef21e..6f7683e 100644
--- a/usr.sbin/xntpd/xntpd/refclock_parse.c
+++ b/usr.sbin/xntpd/xntpd/refclock_parse.c
@@ -6,6 +6,9 @@
*
* generic reference clock driver for receivers
*
+ * Added support for the Boeder DCF77 receiver on FreeBSD
+ * by Vincenzo Capuano 1995/04/18.
+ *
* make use of a STREAMS module for input processing where
* available and configured. Currently the STREAMS module
* is only available for Suns running SunOS 4.x and SunOS5.x (new - careful!)
@@ -32,6 +35,8 @@
*
* FREEBSD_CONRAD - Make very cheap "Conrad DCF77 RS-232" gadget work
* with FreeBSD.
+ * BOEDER - Make cheap "Boeder DCF77 RS-232" receiver work
+ * with FreeBSD.
* TTY defines:
* HAVE_BSD_TTYS - currently unsupported
* HAVE_SYSV_TTYS - will use termio.h
@@ -47,6 +52,7 @@
* - ELV DCF7000 (DCF)
* - Schmid clock (DCF)
* - Conrad DCF77 receiver module (DCF)
+ * - Boeder DCF77 receiver (DCF)
* - FAU DCF77 NTP receiver (TimeBrick) (DCF)
* - Meinberg GPS166 (GPS)
* - Trimble SV6 (TSIP and TAIP protocol) (GPS)
@@ -142,10 +148,10 @@ static char rcsid[]="refclock_parse.c,v 3.53 1994/03/25 13:07:39 kardel Exp";
**/
static void parse_init P((void));
-static int parse_start P((u_int, struct peer *));
-static void parse_shutdown P((int));
+static int parse_start P((int, struct peer *));
+static void parse_shutdown P((int, struct peer *));
static void parse_poll P((int, struct peer *));
-static void parse_control P((u_int, struct refclockstat *, struct refclockstat *));
+static void parse_control P((int, struct refclockstat *, struct refclockstat *));
#define parse_buginfo noentry
@@ -446,7 +452,7 @@ static poll_info_t wsdcf_pollinfo = { WS_POLLRATE, WS_POLLCMD, WS_CMDSIZE };
#define RAWDCF_FORMAT "RAW DCF77 Timecode"
#define RAWDCF_MAXUNSYNC (0) /* sorry - its a true receiver - no signal - no time */
-#ifdef FREEBSD_CONRAD
+#if defined(FREEBSD_CONRAD) || (defined(SYS_FREEBSD) && defined(BOEDER))
#define RAWDCF_CFLAG (CS8|CREAD|CLOCAL)
#else
#define RAWDCF_CFLAG (B50|CS8|CREAD|CLOCAL)
@@ -468,6 +474,15 @@ static poll_info_t wsdcf_pollinfo = { WS_POLLRATE, WS_POLLCMD, WS_CMDSIZE };
#define CONRAD_DESCRIPTION "RAW DCF77 CODE (Conrad DCF77 receiver module)"
/*
+ * Boeder receiver
+ *
+ * simple (cheap) DCF clock - e. g. DCF77 receiver by Boeder
+ * followed by a level converter for RS232
+ */
+#define BOEDER_BASEDELAY 0x420C49B0 /* ~258 ms - Conrad receiver @ 50 Baud */
+#define BOEDER_DESCRIPTION "RAW DCF77 CODE (BOEDER DCF77 receiver)"
+
+/*
* TimeBrick receiver
*/
#define TIMEBRICK_BASEDELAY 0x35C29000 /* ~210 ms - TimeBrick @ 50 Baud on a Sun */
@@ -746,6 +761,25 @@ static struct my_clockinfo
TRIMBLETSIP_IFLAG,
TRIMBLETSIP_OFLAG,
TRIMBLETSIP_LFLAG
+ },
+ { /* 127.127.8.40+<device> */
+ RAWDCF_FLAGS,
+ NO_POLL,
+ NO_INIT,
+ NO_END,
+ NO_DATA,
+ RAWDCF_ROOTDELAY,
+ BOEDER_BASEDELAY,
+ NO_PPSDELAY,
+ DCF_A_ID,
+ BOEDER_DESCRIPTION,
+ RAWDCF_FORMAT,
+ DCF_TYPE,
+ RAWDCF_MAXUNSYNC,
+ RAWDCF_CFLAG,
+ RAWDCF_IFLAG,
+ RAWDCF_OFLAG,
+ RAWDCF_LFLAG
}
};
@@ -1566,7 +1600,7 @@ local_receive(rbufp)
while (count--)
{
- if (parse_ioread(&parse->parseio, *s++, &rbufp->recv_time))
+ if (parse_ioread(&parse->parseio, *s++, (timestamp_t *)&rbufp->recv_time))
{
/*
* got something good to eat
@@ -2108,8 +2142,9 @@ parse_init()
* parse_shutdown - shut down a PARSE clock
*/
static void
-parse_shutdown(unit)
+parse_shutdown(unit, peer)
int unit;
+ struct peer *peer;
{
register struct parseunit *parse;
@@ -2174,7 +2209,7 @@ parse_shutdown(unit)
*/
static int
parse_start(sysunit, peer)
- u_int sysunit;
+ int sysunit;
struct peer *peer;
{
u_int unit;
@@ -2218,11 +2253,15 @@ parse_start(sysunit, peer)
*/
(void) sprintf(parsedev, PARSEDEVICE, unit);
+#if defined(SYS_FREEBSD) && defined(BOEDER)
+ fd232 = open(parsedev, O_RDONLY | O_NONBLOCK, 0777);
+#else
#ifndef O_NOCTTY
#define O_NOCTTY 0
#endif
fd232 = open(parsedev, O_RDWR|O_NOCTTY, 0777);
+#endif
if (fd232 == -1)
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: open of %s failed: %m", unit, parsedev);
@@ -2311,7 +2350,7 @@ parse_start(sysunit, peer)
if (parse->binding == (bind_t *)0)
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: io sub system initialisation failed.");
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0; /* well, ok - special initialisation broke */
}
@@ -2321,7 +2360,7 @@ parse_start(sysunit, peer)
if (TTY_GETATTR(fd232, &tm) == -1)
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: tcgetattr(%d, &tm): %m", unit, fd232);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0;
}
else
@@ -2347,14 +2386,20 @@ parse_start(sysunit, peer)
tm.c_iflag = clockinfo[type].cl_iflag;
tm.c_oflag = clockinfo[type].cl_oflag;
tm.c_lflag = clockinfo[type].cl_lflag;
-#ifdef FREEBSD_CONRAD
- tm.c_ispeed = 50;
- tm.c_ospeed = 50;
+#if defined(SYS_FREEBSD) && (defined(BOEDER) || defined(FREEBSD_CONRAD))
+ if (cfsetspeed(&tm, B50) == -1)
+ {
+ syslog(LOG_ERR,
+ "PARSE receiver #%d: parse_start: cfsetspeed(&tm, B50): %m",
+ unit);
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
+ return 0;
+ }
#endif
if (TTY_SETATTR(fd232, &tm) == -1)
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: tcsetattr(%d, &tm): %m", unit, fd232);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0;
}
}
@@ -2389,7 +2434,7 @@ parse_start(sysunit, peer)
if (!PARSE_SETCS(parse, &tmp_ctl))
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setcs() FAILED.", unit);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0; /* well, ok - special initialisation broke */
}
@@ -2407,6 +2452,25 @@ parse_start(sysunit, peer)
}
}
#endif
+#if defined(SYS_FREEBSD) && defined(BOEDER)
+ if (fcntl(fd232, F_SETFL, fcntl(fd232, F_GETFL, 0) & ~O_NONBLOCK) == -1)
+ {
+ syslog(LOG_ERR,
+ "PARSE receiver #%d: parse_start: fcntl(%d, F_SETFL, ...): %m",
+ unit, fd232);
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
+ return 0;
+ }
+
+ if (ioctl(fd232, TIOCCDTR, 0) == -1)
+ {
+ syslog(LOG_ERR,
+ "PARSE receiver #%d: parse_start: ioctl(%d, TIOCCDTR, 0): %m",
+ unit, fd232);
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
+ return 0;
+ }
+#endif
strcpy(tmp_ctl.parseformat.parse_buffer, parse->parse_type->cl_format);
tmp_ctl.parseformat.parse_count = strlen(tmp_ctl.parseformat.parse_buffer);
@@ -2414,7 +2478,7 @@ parse_start(sysunit, peer)
if (!PARSE_SETFMT(parse, &tmp_ctl))
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setfmt() FAILED.", unit);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0; /* well, ok - special initialisation broke */
}
@@ -2437,7 +2501,7 @@ parse_start(sysunit, peer)
if (!PARSE_SETSTAT(parse, &tmp_ctl))
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_setstat() FAILED.", unit);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0; /* well, ok - special initialisation broke */
}
@@ -2448,7 +2512,7 @@ parse_start(sysunit, peer)
{
if (parse->parse_type->cl_init(parse))
{
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0; /* well, ok - special initialisation broke */
}
}
@@ -2469,7 +2533,7 @@ parse_start(sysunit, peer)
{
syslog(LOG_ERR,
"PARSE receiver #%d: parse_start: addclock %s fails (ABORT - clock type requires async io)", CL_UNIT(parse->unit), parsedev);
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0;
}
else
@@ -2496,7 +2560,7 @@ parse_start(sysunit, peer)
if (!PARSE_DISABLE(parse))
{
syslog(LOG_ERR, "PARSE receiver #%d: parse_start: parse_disable() FAILED", CL_UNIT(parse->unit));
- parse_shutdown(parse->unit); /* let our cleaning staff do the work */
+ parse_shutdown(parse->unit, peer); /* let our cleaning staff do the work */
return 0;
}
}
@@ -2648,7 +2712,7 @@ parse_leap()
*/
static void
parse_control(unit, in, out)
- u_int unit;
+ int unit;
struct refclockstat *in;
struct refclockstat *out;
{
OpenPOWER on IntegriCloud