File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / kernel / README
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, 7 months ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: Installing Line Disciplines and Streams Modules
    2: 
    3: Description
    4: 
    5: Most radio and modem clocks used for a primary (stratum-1) NTP server
    6: utilize serial ports operating at speeds of 9600 baud or greater. The
    7: timing jitter contributed by the serial port hardware and software
    8: discipline can accumulate to several milliseconds on a typical Unix
    9: workstation. In order to reduce these errors, a set of special line
   10: disciplines can be configured in the operating system process. These
   11: disciplines intercept special characters or signals provided by the
   12: radio or modem clock and save a local timestamp for later processing.
   13: 
   14: The disciplines can be compiled in the kernel in older BSD-derived
   15: systems, or installed as System V streams modules and either compiled in
   16: the kernel or dynamically loaded when required. In either case, they
   17: require reconfiguration of the Unix kernel and provisions in the NTP
   18: daemon xntpd. The streams modules can be pushed and popped from the
   19: streams stack using conventional System V streams program primitives.
   20: Note that not all Unix kernels support line disciplines and of those
   21: that do, not all support System V streams. The disciplines here are
   22: known to work correctly with SunOS 4.x kernels, but have not been tested
   23: for other kernels.
   24: 
   25: There are two line disciplines included in the distribution. Support for
   26: each is enabled by adding flags to the DEFS_LOCAL line of the build
   27: configuration file ./Config.local. This can be done automatically by the
   28: autoconfiguration build procedures, or can be inserted/deleted after the
   29: process has completed.
   30: 
   31: tty_clk (CLK)
   32: 
   33:      This discipline intercepts characters received from the serial port
   34:      and passes unchanged all except a set of designated characters to
   35:      the generic serial port discipline. For each of the exception
   36:      characters, the character is inserted in the receiver buffer
   37:      followed by a timestamp in Unix timeval format. Both select() and
   38:      SIGIO are supported by the discipline. The -DCLK flag is used to
   39:      compile support for this disipline in the NTP daemon. This flag is
   40:      included if the clkdefs.h file is found in the /sys/sys directory,
   41:      or it can be added (or deleted) manually.
   42: 
   43: tty_chu (CHU)
   44: 
   45:      This discipline is a special purpose line discipline for receiving
   46:      a special timecode broadcast by Canadian time and frequency
   47:      standard station CHU. The radio signal is first demodulated by the
   48:      300-baud modem included in the gadget box, then processed by the
   49:      discipline and finally processed by the Scratchbuilt CHU Receiver
   50:      discipline (type 7). This discipline should be used in raw mode.
   51:      The -DCHU flag is used to compile support for this disipline in the
   52:      NTP daemon. This flag is included if the chudefs.h file is found in
   53:      the /sys/sys directory, or it can be added (or deleted) manually.
   54: 
   55: There are two sets of line disciplines. The tty_clk.c and chu_clk.c are
   56: designed for use with older BSD systems and are compiled in the kernel.
   57: The tty_clk_STREAMS.c and chu_clk_STREAMS.c are designed for use with
   58: System V streams, in which case they can be either compiled in the
   59: kernel or dynamically loaded. Since these disciplines are small,
   60: unobtrusive, and to nothing unless specifically enabled by an
   61: application program, it probably doesn't matter which method is choosen.
   62: 
   63: Compiling with the Kernel
   64: 
   65: The following procedures are for the tty_clk line discipline; for the
   66: chu_clk, change "tty" to "chu".
   67: 1.   Copy tty_clk.c into /sys/os and clkdefs.h into /sys/sys.
   68: 
   69: 2.   For SunOS 4.x systems, edit /sys/os/tty_conf.c using some facsimile
   70:      of the following lines:
   71: 
   72:      #include "clk.h"
   73:      ...
   74:      #if NCLK > 0
   75:      int  clkopen(), clkclose(), clkwrite(), clkinput(), clkioctl();
   76:      #endif
   77:      ...
   78:      #if NCLK > 0
   79:           { clkopen, clkclose, ttread, clkwrite, clkioctl,
   80:             clkinput, nodev, nulldev, ttstart, nullmodem, /* 10 CLK */
   81:             ttselect },
   82:      #else
   83:           { nodev, nodev, nodev, nodev, nodev,
   84:             nodev, nodev, nodev, nodev, nodev,
   85:             nodev },
   86:      #endif
   87: 
   88:      For Ultrix 4.x systems, edit /sys/data/tty_conf_data.c using some
   89:      facsimile of the following lines:
   90: 
   91:      #include "clk.h"
   92:      ...
   93:      #if NCLK > 0
   94:      int  clkopen(), clkclose(), clkwrite(), clkinput(), clkioctl();
   95:      #endif
   96:      ...
   97:      #if NCLK > 0
   98:           clkopen, clkclose, ttread, clkwrite, clkioctl, /* 10 CLK */
   99:           clkinput, nodev, nulldev, ttstart, nulldev,
  100:      #else
  101:           nodev, nodev, nodev, nodev, nodev,
  102:           nodev, nodev, nodev, nodev, nodev,
  103:      #endif
  104: 
  105:      If the kernel doesn't include the ??select() entry in the structure
  106:      (i.e., there are only ten entry points in the structure) just leave
  107:      it out. Also note that the number you give the line discipline (10
  108:      in most kernels) will be specific to that kernel and will depend on
  109:      what is in there already. The entries sould be in order with no
  110:      missing space; that is, if there are only seven disciplines already
  111:      defined and you want to use 10 for good reason, you should define a
  112:      dummy 9th entry like this:
  113: 
  114:      nodev, nodev, nodev, nodev, nodev, /* 9 CLK */
  115:      nodev, nodev, nodev, nodev, nodev,
  116: 
  117: 3.   Edit /sys/h/ioctl.h and include a line somewhere near where other
  118:      line disciplines are defined like:
  119: 
  120:      #define  CLKLDISC  10        /* clock line discipline */
  121: 
  122:      The "10" should match what you used as the number in the preceding
  123:      step.
  124: 
  125: 4.   Edit /sys/conf/files and add a line which looks like:
  126: 
  127:      sys/tty_clk.c     optional clk
  128: 
  129: 5.   Edit the kernel configuration file to include the following:
  130: 
  131:      pseudo-device  tty 4  # TTY clock support
  132: 6.   Run config, then make clean, then make depend, then make vmunix,
  133:      then reboot the new kernel.
  134: 
  135: Installing as a streams module
  136: 
  137: The following procedures are for the tty_clk_STREAMS line discipline;
  138: for the tty_chu_STREAMS, change "clk" to "chu".
  139: 
  140: 1.   Copy your choice to /sys/os, removing the "_STREAMS" in the
  141:      filename.
  142: 
  143: 2.   Copy the clkdefs.h file to /usr/include/sys, then construct a soft
  144:      link to /sys/sys.
  145: 
  146: 3.   Append to /sys/conf.common/files.cmn:
  147: 
  148:      os/tty_tty.c  optional tty
  149: 
  150: 4.   Edit /sys/sun/str_conf.c. You'll want to add lines in three places.
  151:      It'll be sort of clear where when you see the file.
  152: 
  153:      #include "tty.h"
  154:      ...
  155:      #if NTTY > 0
  156:      extern struct streamtab ttyinfo;
  157:      #endif
  158:      ...
  159:      #if NTTY > 0
  160:           { "tty", &ttyinfo },
  161:      #endif
  162: 
  163: 5.   Edit /sys/[arch]/conf/[k-name] (substituting the architecture and
  164:      kernel name) to stick in:
  165: 
  166:      pseudo-device  tty 4  # TTY clock support
  167: 
  168:      You can change "4" to anything you like. It will limit the number
  169:      of instantiations of the tty discipline you can use at the same
  170:      time.
  171: 
  172: 6.   Run config, then make clean, then make depend, then make vmunix,
  173:      then reboot the new kernel.
  174: 
  175: Both disciplines can be dynamically loaded using streams procedures
  176: specific to the kernel. Before using the chu_clk discipline, all other
  177: streams modules that may already be on the stack should be popped, then
  178: the discipline should be pushed on the stack.
  179: 
  180: How to Use the tty_clk Line Discipline
  181: 
  182: The tty_clk line discipline defines a new ioctl(), CLK_SETSTR, which
  183: takes a pointer to a string of no more than CLK_MAXSTRSIZE characters.
  184: Until the first CLK_SETSTR is performed, the discipline will simply pass
  185: through characters. Once it is passed a string by CLK_SETSTR, any
  186: character in that string will be immediately followed by a timestamp in
  187: Unix timeval format. You can change the string whenever you want by
  188: doing another CLK_SETSTR. The character must be an exact, 8 bit match.
  189: The character '\000' cannot, unfortunately, be used, as it is the string
  190: terminator. Passing an empty string to CLK_SETSTR turns off stamping.
  191: Passing NULL will produce undefined results.
  192: 
  193: How to Use the tty_chu Line Discipline
  194: The tty_chu line discipline translates data received from the CHU modem
  195: and returns chucode structures, as defined in chudefs.h, and expected by
  196: the Scratchbuilt CHU Receiver reference clock  driver. Depending on the
  197: settings of PEDANTIC and ANAL_RETENTIVE used when compiling the kernel,
  198: some checking of the data may or may not be necessary.
  199: 
  200: David L. Mills (mills@udel.edu)

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