File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / kernel / sys / timex.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 4 months ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: /******************************************************************************
    2:  *                                                                            *
    3:  * Copyright (c) David L. Mills 1993, 1994                                    *
    4:  *                                                                            *
    5:  * Permission to use, copy, modify, and distribute this software and its      *
    6:  * documentation for any purpose and without fee is hereby granted, provided  *
    7:  * that the above copyright notice appears in all copies and that both the    *
    8:  * copyright notice and this permission notice appear in supporting           *
    9:  * documentation, and that the name University of Delaware not be used in     *
   10:  * advertising or publicity pertaining to distribution of the software        *
   11:  * without specific, written prior permission.  The University of Delaware    *
   12:  * makes no representations about the suitability this software for any       *
   13:  * purpose.  It is provided "as is" without express or implied warranty.      *
   14:  *                                                                            *
   15:  ******************************************************************************/
   16: 
   17: /*
   18:  * Modification history timex.h
   19:  *
   20:  * 26 Sep 94	David L. Mills
   21:  *	Added defines for hybrid phase/frequency-lock loop.
   22:  *
   23:  * 19 Mar 94	David L. Mills
   24:  *	Moved defines from kernel routines to header file and added new
   25:  *	defines for PPS phase-lock loop.
   26:  *
   27:  * 20 Feb 94	David L. Mills
   28:  *	Revised status codes and structures for external clock and PPS
   29:  *	signal discipline.
   30:  *
   31:  * 28 Nov 93	David L. Mills
   32:  *	Adjusted parameters to improve stability and increase poll
   33:  *	interval.
   34:  *
   35:  * 17 Sep 93    David L. Mills
   36:  *      Created file
   37:  */
   38: /*
   39:  * This header file defines the Network Time Protocol (NTP) interfaces
   40:  * for user and daemon application programs. These are implemented using
   41:  * private syscalls and data structures and require specific kernel
   42:  * support.
   43:  *
   44:  * NAME
   45:  *	ntp_gettime - NTP user application interface
   46:  *
   47:  * SYNOPSIS
   48:  *	#include <sys/timex.h>
   49:  *
   50:  *	int syscall(SYS_ntp_gettime, tptr)
   51:  *
   52:  *	int SYS_ntp_gettime		defined in syscall.h header file
   53:  *	struct ntptimeval *tptr		pointer to ntptimeval structure
   54:  *
   55:  * NAME
   56:  *	ntp_adjtime - NTP daemon application interface
   57:  *
   58:  * SYNOPSIS
   59:  *	#include <sys/timex.h>
   60:  *
   61:  *	int syscall(SYS_ntp_adjtime, mode, tptr)
   62:  *
   63:  *	int SYS_ntp_adjtime		defined in syscall.h header file
   64:  *	struct timex *tptr		pointer to timex structure
   65:  *
   66:  */
   67: #ifndef _SYS_TIMEX_H_
   68: #define _SYS_TIMEX_H_ 1
   69: 
   70: #ifndef MSDOS			/* Microsoft specific */
   71: #include <sys/syscall.h>
   72: #endif /* MSDOS */
   73: 
   74: /*
   75:  * The following defines establish the engineering parameters of the
   76:  * phase-lock loop (PLL) model used in the kernel implementation. These
   77:  * parameters have been carefully chosen by analysis for good stability
   78:  * and wide dynamic range.
   79:  *
   80:  * The hz variable is defined in the kernel build environment. It
   81:  * establishes the timer interrupt frequency, 100 Hz for the SunOS
   82:  * kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the OSF/1
   83:  * kernel. SHIFT_HZ expresses the same value as the nearest power of two
   84:  * in order to avoid hardware multiply operations.
   85:  *
   86:  * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen
   87:  * for a slightly underdamped convergence characteristic. SHIFT_KH
   88:  * establishes the damping of the FLL and is chosen by wisdom and black
   89:  * art.
   90:  *
   91:  * MAXTC establishes the maximum time constant of the PLL. With the
   92:  * SHIFT_KG and SHIFT_KF values given and a time constant range from
   93:  * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours,
   94:  * respectively.
   95:  */
   96: #define SHIFT_HZ 7		/* log2(hz) */
   97: #define SHIFT_KG 6		/* phase factor (shift) */
   98: #define SHIFT_KF 16		/* PLL frequency factor (shift) */
   99: #define SHIFT_KH 2		/* FLL frequency factor (shift) */
  100: #define MAXTC 6			/* maximum time constant (shift) */
  101: 
  102: /*
  103:  * The following defines establish the scaling of the various variables
  104:  * used by the PLL. They are chosen to allow the greatest precision
  105:  * possible without overflow of a 32-bit word.
  106:  *
  107:  * SHIFT_SCALE defines the scaling (shift) of the time_phase variable,
  108:  * which serves as a an extension to the low-order bits of the system
  109:  * clock variable time.tv_usec.
  110:  *
  111:  * SHIFT_UPDATE defines the scaling (shift) of the time_offset variable,
  112:  * which represents the current time offset with respect to standard
  113:  * time.
  114:  *
  115:  * SHIFT_USEC defines the scaling (shift) of the time_freq and
  116:  * time_tolerance variables, which represent the current frequency
  117:  * offset and maximum frequency tolerance.
  118:  *
  119:  * FINEUSEC is 1 us in SHIFT_UPDATE units of the time_phase variable.
  120:  */
  121: #define SHIFT_SCALE 22		/* phase scale (shift) */
  122: #define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */
  123: #define SHIFT_USEC 16		/* frequency offset scale (shift) */
  124: #define FINEUSEC (1L << SHIFT_SCALE) /* 1 us in phase units */
  125: 
  126: /*
  127:  * The following defines establish the performance envelope of the PLL.
  128:  * They insure it operates within predefined limits, in order to satisfy
  129:  * correctness assertions. An excursion which exceeds these bounds is
  130:  * clamped to the bound and operation proceeds accordingly. In practice,
  131:  * this can occur only if something has failed or is operating out of
  132:  * tolerance, but otherwise the PLL continues to operate in a stable
  133:  * mode.
  134:  *
  135:  * MAXPHASE must be set greater than or equal to CLOCK.MAX (128 ms), as
  136:  * defined in the NTP specification. CLOCK.MAX establishes the maximum
  137:  * time offset allowed before the system time is reset, rather than
  138:  * incrementally adjusted. Here, the maximum offset is clamped to
  139:  * MAXPHASE only in order to prevent overflow errors due to defective
  140:  * protocol implementations.
  141:  *
  142:  * MAXFREQ is the maximum frequency tolerance of the CPU clock
  143:  * oscillator plus the maximum slew rate allowed by the protocol. It
  144:  * should be set to at least the frequency tolerance of the oscillator
  145:  * plus 100 ppm for vernier frequency adjustments. If the kernel
  146:  * PPS discipline code is configured (PPS_SYNC), the oscillator time and
  147:  * frequency are disciplined to an external source, presumably with
  148:  * negligible time and frequency error relative to UTC, and MAXFREQ can
  149:  * be reduced.
  150:  *
  151:  * MAXTIME is the maximum jitter tolerance of the PPS signal if the
  152:  * kernel PPS discipline code is configured (PPS_SYNC).
  153:  *
  154:  * MINSEC and MAXSEC define the lower and upper bounds on the interval
  155:  * between protocol updates.
  156:  */
  157: #define MAXPHASE 512000L	/* max phase error (us) */
  158: #ifdef PPS_SYNC
  159: #define MAXFREQ (512L << SHIFT_USEC) /* max freq error (100 ppm) */
  160: #define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */
  161: #else
  162: #define MAXFREQ (512L << SHIFT_USEC) /* max freq error (200 ppm) */
  163: #endif /* PPS_SYNC */
  164: #define MINSEC 16L		/* min interval between updates (s) */
  165: #define MAXSEC 1200L		/* max interval between updates (s) */
  166: 
  167: #ifdef PPS_SYNC
  168: /*
  169:  * The following defines are used only if a pulse-per-second (PPS)
  170:  * signal is available and connected via a modem control lead, such as
  171:  * produced by the optional ppsclock feature incorporated in the Sun
  172:  * asynch driver. They establish the design parameters of the frequency-
  173:  * lock loop used to discipline the CPU clock oscillator to the PPS
  174:  * signal.
  175:  *
  176:  * PPS_AVG is the averaging factor for the frequency loop, as well as
  177:  * the time and frequency dispersion.
  178:  *
  179:  * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum
  180:  * calibration intervals, respectively, in seconds as a power of two.
  181:  *
  182:  * PPS_VALID is the maximum interval before the PPS signal is considered
  183:  * invalid and protocol updates used directly instead.
  184:  *
  185:  * MAXGLITCH is the maximum interval before a time offset of more than
  186:  * MAXTIME is believed.
  187:  */
  188: #define PPS_AVG 2		/* pps averaging constant (shift) */
  189: #define PPS_SHIFT 2		/* min interval duration (s) (shift) */
  190: #define PPS_SHIFTMAX 8		/* max interval duration (s) (shift) */
  191: #define PPS_VALID 120		/* pps signal watchdog max (s) */
  192: #define MAXGLITCH 30		/* pps signal glitch max (s) */
  193: #endif /* PPS_SYNC */
  194: 
  195: /*
  196:  * The following defines and structures define the user interface for
  197:  * the ntp_gettime() and ntp_adjtime() system calls.
  198:  *
  199:  * Control mode codes (timex.modes)
  200:  */
  201: #define MOD_OFFSET	0x0001	/* set time offset */
  202: #define MOD_FREQUENCY	0x0002	/* set frequency offset */
  203: #define MOD_MAXERROR	0x0004	/* set maximum time error */
  204: #define MOD_ESTERROR	0x0008	/* set estimated time error */
  205: #define MOD_STATUS	0x0010	/* set clock status bits */
  206: #define MOD_TIMECONST	0x0020	/* set pll time constant */
  207: #define MOD_CANSCALE	0x0040	/* kernel can scale offset field */
  208: #define MOD_DOSCALE	0x0080	/* userland wants to scale offset field */
  209: 
  210: /*
  211:  * Status codes (timex.status)
  212:  */
  213: #define STA_PLL		0x0001	/* enable PLL updates (rw) */
  214: #define STA_PPSFREQ	0x0002	/* enable PPS freq discipline (rw) */
  215: #define STA_PPSTIME	0x0004	/* enable PPS time discipline (rw) */
  216: #define STA_FLL		0x0008	/* select frequency-lock mode (rw) */
  217: 
  218: #define STA_INS		0x0010	/* insert leap (rw) */
  219: #define STA_DEL		0x0020	/* delete leap (rw) */
  220: #define STA_UNSYNC	0x0040	/* clock unsynchronized (rw) */
  221: #define STA_FREQHOLD	0x0080	/* hold frequency (rw) */
  222: 
  223: #define STA_PPSSIGNAL	0x0100	/* PPS signal present (ro) */
  224: #define STA_PPSJITTER	0x0200	/* PPS signal jitter exceeded (ro) */
  225: #define STA_PPSWANDER	0x0400	/* PPS signal wander exceeded (ro) */
  226: #define STA_PPSERROR	0x0800	/* PPS signal calibration error (ro) */
  227: 
  228: #define STA_CLOCKERR	0x1000	/* clock hardware fault (ro) */
  229: 
  230: #define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \
  231:     STA_PPSERROR | STA_CLOCKERR) /* read-only bits */
  232: 
  233: /*
  234:  * Clock states (time_state)
  235:  */
  236: #define TIME_OK		0	/* no leap second warning */
  237: #define TIME_INS	1	/* insert leap second warning */
  238: #define TIME_DEL	2	/* delete leap second warning */
  239: #define TIME_OOP	3	/* leap second in progress */
  240: #define TIME_WAIT	4	/* leap second has occurred */
  241: #define TIME_ERROR	5	/* clock not synchronized */
  242: 
  243: /*
  244:  * NTP user interface (ntp_gettime()) - used to read kernel clock values
  245:  *
  246:  * Note: maximum error = NTP synch distance = dispersion + delay / 2;
  247:  * estimated error = NTP dispersion.
  248:  */
  249: struct ntptimeval {
  250: 	struct timeval time;	/* current time (ro) */
  251: 	long maxerror;		/* maximum error (us) (ro) */
  252: 	long esterror;		/* estimated error (us) (ro) */
  253: };
  254: 
  255: /*
  256:  * NTP daemon interface - (ntp_adjtime()) used to discipline CPU clock
  257:  * oscillator
  258:  */
  259: struct timex {
  260: 	unsigned int modes;	/* clock mode bits (wo) */
  261: 	long offset;		/* time offset (us) (rw) */
  262: 	long freq;		/* frequency offset (scaled ppm) (rw) */
  263: 	long maxerror;		/* maximum error (us) (rw) */
  264: 	long esterror;		/* estimated error (us) (rw) */
  265: 	int status;		/* clock status bits (rw) */
  266: 	long constant;		/* pll time constant (rw) */
  267: 	long precision;		/* clock precision (us) (ro) */
  268: 	long tolerance;		/* clock frequency tolerance (scaled
  269: 				 * ppm) (ro) */
  270: 	/*
  271: 	 * The following read-only structure members are implemented
  272: 	 * only if the PPS signal discipline is configured in the
  273: 	 * kernel.
  274: 	 */
  275: 	long ppsfreq;		/* pps frequency (scaled ppm) (ro) */
  276: 	long jitter;		/* pps jitter (us) (ro) */
  277: 	int shift;		/* interval duration (s) (shift) (ro) */
  278: 	long stabil;		/* pps stability (scaled ppm) (ro) */
  279: 	long jitcnt;		/* jitter limit exceeded (ro) */
  280: 	long calcnt;		/* calibration intervals (ro) */
  281: 	long errcnt;		/* calibration errors (ro) */
  282: 	long stbcnt;		/* stability limit exceeded (ro) */
  283: 
  284: };
  285: #ifdef __FreeBSD__
  286: 
  287: /*
  288:  * sysctl identifiers underneath kern.ntp_pll
  289:  */
  290: #define NTP_PLL_GETTIME	1	/* used by ntp_gettime() */
  291: #define NTP_PLL_MAXID	2	/* number of valid ids */
  292: 
  293: #define NTP_PLL_NAMES { \
  294: 			  { 0, 0 }, \
  295: 			  { "gettime", CTLTYPE_STRUCT }, \
  296: 		      }
  297: 
  298: #ifndef KERNEL
  299: #include <sys/cdefs.h>
  300: 
  301: __BEGIN_DECLS
  302: extern int ntp_gettime        __P((struct ntptimeval *));
  303: extern int ntp_adjtime        __P((struct timex *));
  304: __END_DECLS
  305: 
  306: #endif /* not KERNEL */
  307: 
  308: #endif /* __FreeBSD__ */
  309: #endif /* _SYS_TIMEX_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>