Annotation of embedaddon/ntp/util/pps-api.c, revision 1.1
1.1 ! misho 1: /*
! 2:
! 3: Try to run this program to see what the PPS-API finds. You give it the
! 4: device as argument and you may have to modify the pp.mode = BLA assignment.
! 5:
! 6: Poul-Henning
! 7:
! 8: */
! 9:
! 10: #include <stdio.h>
! 11: #include <errno.h>
! 12: #include <fcntl.h>
! 13: #include <err.h>
! 14: #include <sys/types.h>
! 15: #include <time.h>
! 16: #include <sys/timepps.h>
! 17: #include <sys/termios.h>
! 18:
! 19: #define timespecsub(vvp, uvp) \
! 20: do { \
! 21: (vvp)->tv_sec -= (uvp)->tv_sec; \
! 22: (vvp)->tv_nsec -= (uvp)->tv_nsec; \
! 23: if ((vvp)->tv_nsec < 0) { \
! 24: (vvp)->tv_sec--; \
! 25: (vvp)->tv_nsec += 1000000000; \
! 26: } \
! 27: } while (0)
! 28:
! 29:
! 30: void
! 31: Chew(struct timespec *tsa, struct timespec *tsc, unsigned sa, unsigned sc)
! 32: {
! 33: static int idx;
! 34: struct timespec ts;
! 35:
! 36: printf("%d.%09d ", tsa->tv_sec, tsa->tv_nsec);
! 37: printf("%d.%09d ", tsc->tv_sec, tsc->tv_nsec);
! 38: printf("%u %u ", sa, sc);
! 39:
! 40: ts = *tsc;
! 41: timespecsub(&ts,tsa);
! 42: printf("%.9f ", ts.tv_sec + ts.tv_nsec / 1e9);
! 43: printf("\n");
! 44: fflush(stdout);
! 45: }
! 46:
! 47: int
! 48: main(int argc, char **argv)
! 49: {
! 50: int fd;
! 51: pps_info_t pi;
! 52: pps_params_t pp;
! 53: pps_handle_t ph;
! 54: int i, mode;
! 55: u_int olda, oldc;
! 56: double d = 0;
! 57: struct timespec to;
! 58:
! 59: if (argc < 2)
! 60: argv[1] = "/dev/cuaa1";
! 61: setbuf(stdout, 0);
! 62: fd = open(argv[1], O_RDONLY);
! 63: if (fd < 0)
! 64: err(1, argv[1]);
! 65: i = time_pps_create(fd, &ph);
! 66: if (i < 0)
! 67: err(1, "time_pps_create");
! 68:
! 69: i = time_pps_getcap(ph, &mode);
! 70: if (i < 0)
! 71: err(1, "time_pps_getcap");
! 72:
! 73: pp.mode = PPS_CAPTUREASSERT | PPS_ECHOASSERT;
! 74: pp.mode = PPS_CAPTUREBOTH;
! 75: /* pp.mode = PPS_CAPTUREASSERT; */
! 76:
! 77: i = time_pps_setparams(ph, &pp);
! 78: if (i < 0)
! 79: err(1, "time_pps_setparams");
! 80:
! 81: while (1) {
! 82: to.tv_nsec = 0;
! 83: to.tv_sec = 0;
! 84: i = time_pps_fetch(ph, PPS_TSFMT_TSPEC, &pi, &to);
! 85: if (i < 0)
! 86: err(1, "time_pps_fetch");
! 87: if (olda == pi.assert_sequence &&
! 88: oldc == pi.clear_sequence) {
! 89: usleep(10000);
! 90: continue;
! 91: }
! 92:
! 93: Chew(&pi.assert_timestamp, &pi.clear_timestamp,
! 94: pi.assert_sequence, pi.clear_sequence);
! 95: olda = pi.assert_sequence;
! 96: oldc = pi.clear_sequence;
! 97: }
! 98:
! 99: return(0);
! 100: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>