root/include/linux/timex.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*****************************************************************************
   2  *                                                                           *
   3  * Copyright (c) David L. Mills 1993                                         *
   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 $NTP/include/sys/timex.h
  37  * 07 Oct 93    Torsten Duwe
  38  *      Derived linux/timex.h
  39  * 1995-08-13    Torsten Duwe
  40  *      kernel PLL updated to 1994-12-13 specs (rfc-1589)
  41  */
  42 #ifndef _LINUX_TIMEX_H
  43 #define _LINUX_TIMEX_H
  44 
  45 /*
  46  * The following defines establish the engineering parameters of the PLL
  47  * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
  48  * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
  49  * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
  50  * nearest power of two in order to avoid hardware multiply operations.
  51  */
  52 #ifdef __alpha__
  53 # define SHIFT_HZ 10            /* log2(HZ) */
  54 #else
  55 # define SHIFT_HZ 7             /* log2(HZ) */
  56 #endif
  57 
  58 /*
  59  * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen
  60  * for a slightly underdamped convergence characteristic. SHIFT_KH
  61  * establishes the damping of the FLL and is chosen by wisdom and black
  62  * art.
  63  *
  64  * MAXTC establishes the maximum time constant of the PLL. With the
  65  * SHIFT_KG and SHIFT_KF values given and a time constant range from
  66  * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours,
  67  * respectively.
  68  */
  69 #define SHIFT_KG 6              /* phase factor (shift) */
  70 #define SHIFT_KF 16             /* PLL frequency factor (shift) */
  71 #define SHIFT_KH 2              /* FLL frequency factor (shift) */
  72 #define MAXTC 6                 /* maximum time constant (shift) */
  73 
  74 /*
  75  * The SHIFT_SCALE define establishes the decimal point of the time_phase
  76  * variable which serves as a an extension to the low-order bits of the
  77  * system clock variable. The SHIFT_UPDATE define establishes the decimal
  78  * point of the time_offset variable which represents the current offset
  79  * with respect to standard time. The FINEUSEC define represents 1 usec in
  80  * scaled units.
  81  *
  82  * SHIFT_USEC defines the scaling (shift) of the time_freq and
  83  * time_tolerance variables, which represent the current frequency
  84  * offset and maximum frequency tolerance.
  85  *
  86  * FINEUSEC is 1 us in SHIFT_UPDATE units of the time_phase variable.
  87  */
  88 #define SHIFT_SCALE 22          /* phase scale (shift) */
  89 #define SHIFT_UPDATE (SHIFT_KG + MAXTC) /* time offset scale (shift) */
  90 #define SHIFT_USEC 16           /* frequency offset scale (shift) */
  91 #define FINEUSEC (1L << SHIFT_SCALE) /* 1 us in phase units */
  92 
  93 #define MAXPHASE 512000L        /* max phase error (us) */
  94 #define MAXFREQ (512L << SHIFT_USEC)  /* max frequency error (ppm) */
  95 #define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */
  96 #define MINSEC 16L              /* min interval between updates (s) */
  97 #define MAXSEC 1200L            /* max interval between updates (s) */
  98 
  99 /*
 100  * The following defines are used only if a pulse-per-second (PPS)
 101  * signal is available and connected via a modem control lead, such as
 102  * produced by the optional ppsclock feature incorporated in the Sun
 103  * asynch driver. They establish the design parameters of the frequency-
 104  * lock loop used to discipline the CPU clock oscillator to the PPS
 105  * signal.
 106  *
 107  * PPS_AVG is the averaging factor for the frequency loop, as well as
 108  * the time and frequency dispersion.
 109  *
 110  * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum
 111  * calibration intervals, respectively, in seconds as a power of two.
 112  *
 113  * PPS_VALID is the maximum interval before the PPS signal is considered
 114  * invalid and protocol updates used directly instead.
 115  *
 116  * MAXGLITCH is the maximum interval before a time offset of more than
 117  * MAXTIME is believed.
 118  */
 119 #define PPS_AVG 2               /* pps averaging constant (shift) */
 120 #define PPS_SHIFT 2             /* min interval duration (s) (shift) */
 121 #define PPS_SHIFTMAX 8          /* max interval duration (s) (shift) */
 122 #define PPS_VALID 120           /* pps signal watchdog max (s) */
 123 #define MAXGLITCH 30            /* pps signal glitch max (s) */
 124 
 125 #ifndef __alpha__
 126 /*
 127  * This definitively is wrong for the Alpha and none of the
 128  * kernel code seems to reference this anymore.
 129  */
 130 #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
 131 #define CLOCK_TICK_FACTOR       20      /* Factor of both 1000000 and CLOCK_TICK_RATE */
 132 #define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)  /* For divider */
 133 
 134 #define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \
 135         (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \
 136                 << (SHIFT_SCALE-SHIFT_HZ)) / HZ)
 137 #endif /* !__alpha__ */
 138 
 139 /*
 140  * syscall interface - used (mainly by NTP daemon)
 141  * to discipline kernel clock oscillator
 142  */
 143 struct timex {
 144         unsigned int modes;     /* mode selector */
 145         long offset;            /* time offset (usec) */
 146         long freq;              /* frequency offset (scaled ppm) */
 147         long maxerror;          /* maximum error (usec) */
 148         long esterror;          /* estimated error (usec) */
 149         int status;             /* clock command/status */
 150         long constant;          /* pll time constant */
 151         long precision;         /* clock precision (usec) (read only) */
 152         long tolerance;         /* clock frequency tolerance (ppm)
 153                                  * (read only)
 154                                  */
 155         struct timeval time;    /* (read only) */
 156         long tick;              /* (modified) usecs between clock ticks */
 157 
 158         long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
 159         long jitter;            /* pps jitter (us) (ro) */
 160         int shift;              /* interval duration (s) (shift) (ro) */
 161         long stabil;            /* pps stability (scaled ppm) (ro) */
 162         long jitcnt;            /* jitter limit exceeded (ro) */
 163         long calcnt;            /* calibration intervals (ro) */
 164         long errcnt;            /* calibration errors (ro) */
 165         long stbcnt;            /* stability limit exceeded (ro) */
 166 
 167         int  :32; int  :32; int  :32; int  :32;
 168         int  :32; int  :32; int  :32; int  :32;
 169         int  :32; int  :32; int  :32; int  :32;
 170 };
 171 
 172 /*
 173  * Mode codes (timex.mode)
 174  */
 175 #define ADJ_OFFSET              0x0001  /* time offset */
 176 #define ADJ_FREQUENCY           0x0002  /* frequency offset */
 177 #define ADJ_MAXERROR            0x0004  /* maximum time error */
 178 #define ADJ_ESTERROR            0x0008  /* estimated time error */
 179 #define ADJ_STATUS              0x0010  /* clock status */
 180 #define ADJ_TIMECONST           0x0020  /* pll time constant */
 181 #define ADJ_TICK                0x4000  /* tick value */
 182 #define ADJ_OFFSET_SINGLESHOT   0x8001  /* old-fashioned adjtime */
 183 
 184 /* xntp 3.4 compatibility names */
 185 #define MOD_OFFSET      ADJ_OFFSET
 186 #define MOD_FREQUENCY   ADJ_FREQUENCY
 187 #define MOD_MAXERROR    ADJ_MAXERROR
 188 #define MOD_ESTERROR    ADJ_ESTERROR
 189 #define MOD_STATUS      ADJ_STATUS
 190 #define MOD_TIMECONST   ADJ_TIMECONST
 191 #define MOD_CLKB        ADJ_TICK
 192 #define MOD_CLKA        ADJ_OFFSET_SINGLESHOT /* 0x8000 in original */
 193 
 194 
 195 /*
 196  * Status codes (timex.status)
 197  */
 198 #define STA_PLL         0x0001  /* enable PLL updates (rw) */
 199 #define STA_PPSFREQ     0x0002  /* enable PPS freq discipline (rw) */
 200 #define STA_PPSTIME     0x0004  /* enable PPS time discipline (rw) */
 201 #define STA_FLL         0x0008  /* select frequency-lock mode (rw) */
 202 
 203 #define STA_INS         0x0010  /* insert leap (rw) */
 204 #define STA_DEL         0x0020  /* delete leap (rw) */
 205 #define STA_UNSYNC      0x0040  /* clock unsynchronized (rw) */
 206 #define STA_FREQHOLD    0x0080  /* hold frequency (rw) */
 207 
 208 #define STA_PPSSIGNAL   0x0100  /* PPS signal present (ro) */
 209 #define STA_PPSJITTER   0x0200  /* PPS signal jitter exceeded (ro) */
 210 #define STA_PPSWANDER   0x0400  /* PPS signal wander exceeded (ro) */
 211 #define STA_PPSERROR    0x0800  /* PPS signal calibration error (ro) */
 212 
 213 #define STA_CLOCKERR    0x1000  /* clock hardware fault (ro) */
 214 
 215 #define STA_RONLY (STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | \
 216     STA_PPSERROR | STA_CLOCKERR) /* read-only bits */
 217 
 218 /*
 219  * Clock states (time_state)
 220  */
 221 #define TIME_OK         0       /* clock synchronized, no leap second */
 222 #define TIME_INS        1       /* insert leap second */
 223 #define TIME_DEL        2       /* delete leap second */
 224 #define TIME_OOP        3       /* leap second in progress */
 225 #define TIME_WAIT       4       /* leap second has occurred */
 226 #define TIME_ERROR      5       /* clock not synchronized */
 227 #define TIME_BAD        TIME_ERROR /* bw compat */
 228 
 229 #ifdef __KERNEL__
 230 /*
 231  * kernel variables
 232  * Note: maximum error = NTP synch distance = dispersion + delay / 2;
 233  * estimated error = NTP dispersion.
 234  */
 235 extern long tick;                      /* timer interrupt period */
 236 extern int tickadj;                     /* amount of adjustment per tick */
 237 
 238 /*
 239  * phase-lock loop variables
 240  */
 241 extern int time_state;          /* clock status */
 242 extern int time_status;         /* clock synchronization status bits */
 243 extern long time_offset;        /* time adjustment (us) */
 244 extern long time_constant;      /* pll time constant */
 245 extern long time_tolerance;     /* frequency tolerance (ppm) */
 246 extern long time_precision;     /* clock precision (us) */
 247 extern long time_maxerror;      /* maximum error */
 248 extern long time_esterror;      /* estimated error */
 249 
 250 extern long time_phase;         /* phase offset (scaled us) */
 251 extern long time_freq;          /* frequency offset (scaled ppm) */
 252 extern long time_adj;           /* tick adjust (scaled 1 / HZ) */
 253 extern long time_reftime;       /* time at last adjustment (s) */
 254 
 255 extern long time_adjust;        /* The amount of adjtime left */
 256 
 257 /* interface variables pps->timer interrupt */
 258 extern long pps_offset;         /* pps time offset (us) */
 259 extern long pps_jitter;         /* time dispersion (jitter) (us) */
 260 extern long pps_freq;           /* frequency offset (scaled ppm) */
 261 extern long pps_stabil;         /* frequency dispersion (scaled ppm) */
 262 extern long pps_valid;          /* pps signal watchdog counter */
 263 
 264 /* interface variables pps->adjtimex */
 265 extern int pps_shift;           /* interval duration (s) (shift) */
 266 extern long pps_jitcnt;         /* jitter limit exceeded */
 267 extern long pps_calcnt;         /* calibration intervals */
 268 extern long pps_errcnt;         /* calibration errors */
 269 extern long pps_stbcnt;         /* stability limit exceeded */
 270 
 271 #endif /* KERNEL */
 272 
 273 #endif /* LINUX_TIMEX_H */

/* [previous][next][first][last][top][bottom][index][help] */