1132451Sroberto/* 2132451Sroberto 3132451SrobertoTry to run this program to see what the PPS-API finds. You give it the 4132451Srobertodevice as argument and you may have to modify the pp.mode = BLA assignment. 5132451Sroberto 6132451SrobertoPoul-Henning 7132451Sroberto 8132451Sroberto*/ 9132451Sroberto 10132451Sroberto#include <stdio.h> 11132451Sroberto#include <errno.h> 12132451Sroberto#include <fcntl.h> 13132451Sroberto#include <err.h> 14132451Sroberto#include <sys/types.h> 15132451Sroberto#include <time.h> 16132451Sroberto#include <sys/timepps.h> 17132451Sroberto#include <sys/termios.h> 18132451Sroberto 19132451Sroberto#define timespecsub(vvp, uvp) \ 20132451Sroberto do { \ 21132451Sroberto (vvp)->tv_sec -= (uvp)->tv_sec; \ 22132451Sroberto (vvp)->tv_nsec -= (uvp)->tv_nsec; \ 23132451Sroberto if ((vvp)->tv_nsec < 0) { \ 24132451Sroberto (vvp)->tv_sec--; \ 25132451Sroberto (vvp)->tv_nsec += 1000000000; \ 26132451Sroberto } \ 27132451Sroberto } while (0) 28132451Sroberto 29132451Sroberto 30132451Srobertovoid 31132451SrobertoChew(struct timespec *tsa, struct timespec *tsc, unsigned sa, unsigned sc) 32132451Sroberto{ 33132451Sroberto static int idx; 34132451Sroberto struct timespec ts; 35132451Sroberto 36132451Sroberto printf("%d.%09d ", tsa->tv_sec, tsa->tv_nsec); 37132451Sroberto printf("%d.%09d ", tsc->tv_sec, tsc->tv_nsec); 38132451Sroberto printf("%u %u ", sa, sc); 39132451Sroberto 40132451Sroberto ts = *tsc; 41132451Sroberto timespecsub(&ts,tsa); 42132451Sroberto printf("%.9f ", ts.tv_sec + ts.tv_nsec / 1e9); 43132451Sroberto printf("\n"); 44132451Sroberto fflush(stdout); 45132451Sroberto} 46132451Sroberto 47132451Srobertoint 48132451Srobertomain(int argc, char **argv) 49132451Sroberto{ 50132451Sroberto int fd; 51132451Sroberto pps_info_t pi; 52132451Sroberto pps_params_t pp; 53132451Sroberto pps_handle_t ph; 54132451Sroberto int i, mode; 55132451Sroberto u_int olda, oldc; 56132451Sroberto double d = 0; 57132451Sroberto struct timespec to; 58132451Sroberto 59132451Sroberto if (argc < 2) 60132451Sroberto argv[1] = "/dev/cuaa1"; 61132451Sroberto setbuf(stdout, 0); 62132451Sroberto fd = open(argv[1], O_RDONLY); 63132451Sroberto if (fd < 0) 64132451Sroberto err(1, argv[1]); 65132451Sroberto i = time_pps_create(fd, &ph); 66132451Sroberto if (i < 0) 67132451Sroberto err(1, "time_pps_create"); 68132451Sroberto 69132451Sroberto i = time_pps_getcap(ph, &mode); 70132451Sroberto if (i < 0) 71132451Sroberto err(1, "time_pps_getcap"); 72132451Sroberto 73132451Sroberto pp.mode = PPS_CAPTUREASSERT | PPS_ECHOASSERT; 74132451Sroberto pp.mode = PPS_CAPTUREBOTH; 75132451Sroberto /* pp.mode = PPS_CAPTUREASSERT; */ 76132451Sroberto 77132451Sroberto i = time_pps_setparams(ph, &pp); 78132451Sroberto if (i < 0) 79132451Sroberto err(1, "time_pps_setparams"); 80132451Sroberto 81132451Sroberto while (1) { 82132451Sroberto to.tv_nsec = 0; 83132451Sroberto to.tv_sec = 0; 84132451Sroberto i = time_pps_fetch(ph, PPS_TSFMT_TSPEC, &pi, &to); 85132451Sroberto if (i < 0) 86132451Sroberto err(1, "time_pps_fetch"); 87132451Sroberto if (olda == pi.assert_sequence && 88132451Sroberto oldc == pi.clear_sequence) { 89132451Sroberto usleep(10000); 90132451Sroberto continue; 91132451Sroberto } 92132451Sroberto 93132451Sroberto Chew(&pi.assert_timestamp, &pi.clear_timestamp, 94132451Sroberto pi.assert_sequence, pi.clear_sequence); 95132451Sroberto olda = pi.assert_sequence; 96132451Sroberto oldc = pi.clear_sequence; 97132451Sroberto } 98132451Sroberto 99132451Sroberto return(0); 100132451Sroberto} 101