Home | History | Annotate | Line # | Download | only in util
      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