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