From 6685bed6374e5ff5f49d219a9cb98c2370ffb71b Mon Sep 17 00:00:00 2001 From: Paul J R Date: Sun, 25 Aug 2013 20:53:40 +1000 Subject: [PATCH] work around to make pps do its thing --- src/buildroot-2013.05/.config | 55 +----- .../sysroot/usr/include/timepps.h | 214 ++++++++++++++++++++ 2 files changed, 216 insertions(+), 53 deletions(-) create mode 100644 src/buildroot-2013.05/output/host/usr/i386-buildroot-linux-uclibc/sysroot/usr/include/timepps.h diff --git a/src/buildroot-2013.05/.config b/src/buildroot-2013.05/.config index 7789724..2d1e34e 100644 --- a/src/buildroot-2013.05/.config +++ b/src/buildroot-2013.05/.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Buildroot 2013.05-g8673ab6 Configuration +# Buildroot 2013.05-gb341211 Configuration # BR2_HAVE_DOT_CONFIG=y # BR2_arcle is not set @@ -461,58 +461,7 @@ BR2_PACKAGE_DOSFSTOOLS_DOSFSLABEL=y # BR2_PACKAGE_FMTOOLS is not set # BR2_PACKAGE_FXLOAD is not set # BR2_PACKAGE_GADGETFS_TEST is not set -BR2_PACKAGE_GPSD=y -BR2_PACKAGE_GPSD_DEVICES="/dev/ttyS1" - -# -# Features -# -# BR2_PACKAGE_GPSD_CLIENT_DEBUG is not set -# BR2_PACKAGE_GPSD_OLDSTYLE is not set - -# -# profiling support not available with uClibc-based toolchain -# -BR2_PACKAGE_GPSD_NTP_SHM=y -BR2_PACKAGE_GPSD_PPS=y -# BR2_PACKAGE_GPSD_USER is not set -# BR2_PACKAGE_GPSD_GROUP is not set -# BR2_PACKAGE_GPSD_FIXED_PORT_SPEED is not set -# BR2_PACKAGE_GPSD_MAX_CLIENT is not set -# BR2_PACKAGE_GPSD_MAX_DEV is not set -BR2_PACKAGE_GPSD_RECONFIGURE=y -BR2_PACKAGE_GPSD_CONTROLSEND=y -# BR2_PACKAGE_GPSD_SQUELCH is not set - -# -# Protocols -# -# BR2_PACKAGE_GPSD_AIVDM is not set -# BR2_PACKAGE_GPSD_ASHTECH is not set -# BR2_PACKAGE_GPSD_EARTHMATE is not set -# BR2_PACKAGE_GPSD_EVERMORE is not set -# BR2_PACKAGE_GPSD_FURY is not set -# BR2_PACKAGE_GPSD_FV18 is not set -# BR2_PACKAGE_GPSD_GARMIN is not set -# BR2_PACKAGE_GPSD_GARMIN_SIMPLE_TXT is not set -# BR2_PACKAGE_GPSD_GEOSTAR is not set -# BR2_PACKAGE_GPSD_GPSCLOCK is not set -# BR2_PACKAGE_GPSD_ITRAX is not set -# BR2_PACKAGE_GPSD_MTK3301 is not set -# BR2_PACKAGE_GPSD_NAVCOM is not set -BR2_PACKAGE_GPSD_NMEA=y -# BR2_PACKAGE_GPSD_NMEA2000 is not set -# BR2_PACKAGE_GPSD_NTRIP is not set -# BR2_PACKAGE_GPSD_OCEANSERVER is not set -# BR2_PACKAGE_GPSD_ONCORE is not set -# BR2_PACKAGE_GPSD_RTCM104V2 is not set -# BR2_PACKAGE_GPSD_RTCM104V3 is not set -# BR2_PACKAGE_GPSD_SIRF is not set -# BR2_PACKAGE_GPSD_SUPERSTAR2 is not set -# BR2_PACKAGE_GPSD_TRIMBLE_TSIP is not set -# BR2_PACKAGE_GPSD_TRIPMATE is not set -# BR2_PACKAGE_GPSD_TRUE_NORTH is not set -# BR2_PACKAGE_GPSD_UBX is not set +# BR2_PACKAGE_GPSD is not set BR2_PACKAGE_GPTFDISK=y BR2_PACKAGE_GPTFDISK_GDISK=y BR2_PACKAGE_GPTFDISK_SGDISK=y diff --git a/src/buildroot-2013.05/output/host/usr/i386-buildroot-linux-uclibc/sysroot/usr/include/timepps.h b/src/buildroot-2013.05/output/host/usr/i386-buildroot-linux-uclibc/sysroot/usr/include/timepps.h new file mode 100644 index 0000000..07e26c8 --- /dev/null +++ b/src/buildroot-2013.05/output/host/usr/i386-buildroot-linux-uclibc/sysroot/usr/include/timepps.h @@ -0,0 +1,214 @@ +/* + * timepps.h -- PPS API main header + * + * Copyright (C) 2005-2007 Rodolfo Giometti + * Copyright (C) 2009-2011 Alexander Gordeev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _SYS_TIMEPPS_H_ +#define _SYS_TIMEPPS_H_ + +#include +#include +#include +#include +#include + +#define LINUXPPS 1 /* signal we are using LinuxPPS */ + +/* + * New data structures + */ + +struct ntp_fp { + unsigned int integral; + unsigned int fractional; +}; + +union pps_timeu { + struct timespec tspec; + struct ntp_fp ntpfp; + unsigned long longpad[3]; +}; + +struct pps_info { + unsigned long assert_sequence; /* seq. num. of assert event */ + unsigned long clear_sequence; /* seq. num. of clear event */ + union pps_timeu assert_tu; /* time of assert event */ + union pps_timeu clear_tu; /* time of clear event */ + int current_mode; /* current mode bits */ +}; + +struct pps_params { + int api_version; /* API version # */ + int mode; /* mode bits */ + union pps_timeu assert_off_tu; /* offset compensation for assert */ + union pps_timeu clear_off_tu; /* offset compensation for clear */ +}; + +typedef int pps_handle_t; /* represents a PPS source */ +typedef unsigned long pps_seq_t; /* sequence number */ +typedef struct ntp_fp ntp_fp_t; /* NTP-compatible time stamp */ +typedef union pps_timeu pps_timeu_t; /* generic data type for time stamps */ +typedef struct pps_info pps_info_t; +typedef struct pps_params pps_params_t; + +#define assert_timestamp assert_tu.tspec +#define clear_timestamp clear_tu.tspec + +#define assert_timestamp_ntpfp assert_tu.ntpfp +#define clear_timestamp_ntpfp clear_tu.ntpfp + +#define assert_offset assert_off_tu.tspec +#define clear_offset clear_off_tu.tspec + +#define assert_offset_ntpfp assert_off_tu.ntpfp +#define clear_offset_ntpfp clear_off_tu.ntpfp + +/* + * The PPS API + */ + +static __inline int time_pps_create(int source, pps_handle_t *handle) +{ + int ret; + struct pps_kparams dummy; + + if (!handle) { + errno = EINVAL; + return -1; + } + + /* First we check if current device is a valid PPS one by + * doing a dummy PPS_GETPARAMS... + */ + ret = ioctl(source, PPS_GETPARAMS, &dummy); + if (ret) { + errno = EOPNOTSUPP; + return -1; + } + + /* ... then since in LinuxPPS there are no differences between a + * "PPS source" and a "PPS handle", we simply return the same value. + */ + *handle = source; + + return 0; +} + +static __inline int time_pps_destroy(pps_handle_t handle) +{ + return close(handle); +} + +static __inline int time_pps_getparams(pps_handle_t handle, + pps_params_t *ppsparams) +{ + int ret; + struct pps_kparams __ppsparams; + + ret = ioctl(handle, PPS_GETPARAMS, &__ppsparams); + + ppsparams->api_version = __ppsparams.api_version; + ppsparams->mode = __ppsparams.mode; + ppsparams->assert_off_tu.tspec.tv_sec = __ppsparams.assert_off_tu.sec; + ppsparams->assert_off_tu.tspec.tv_nsec = __ppsparams.assert_off_tu.nsec; + ppsparams->clear_off_tu.tspec.tv_sec = __ppsparams.clear_off_tu.sec; + ppsparams->clear_off_tu.tspec.tv_nsec = __ppsparams.clear_off_tu.nsec; + + return ret; +} + +static __inline int time_pps_setparams(pps_handle_t handle, + const pps_params_t *ppsparams) +{ + struct pps_kparams __ppsparams; + + __ppsparams.api_version = ppsparams->api_version; + __ppsparams.mode = ppsparams->mode; + __ppsparams.assert_off_tu.sec = ppsparams->assert_off_tu.tspec.tv_sec; + __ppsparams.assert_off_tu.nsec = ppsparams->assert_off_tu.tspec.tv_nsec; + __ppsparams.clear_off_tu.sec = ppsparams->clear_off_tu.tspec.tv_sec; + __ppsparams.clear_off_tu.nsec = ppsparams->clear_off_tu.tspec.tv_nsec; + + return ioctl(handle, PPS_SETPARAMS, &__ppsparams); +} + +/* Get capabilities for handle */ +static __inline int time_pps_getcap(pps_handle_t handle, int *mode) +{ + return ioctl(handle, PPS_GETCAP, mode); +} + +static __inline int time_pps_fetch(pps_handle_t handle, const int tsformat, + pps_info_t *ppsinfobuf, + const struct timespec *timeout) +{ + struct pps_fdata __fdata; + int ret; + + /* Sanity checks */ + if (tsformat != PPS_TSFMT_TSPEC) { + errno = EINVAL; + return -1; + } + + if (timeout) { + __fdata.timeout.sec = timeout->tv_sec; + __fdata.timeout.nsec = timeout->tv_nsec; + __fdata.timeout.flags = ~PPS_TIME_INVALID; + } else + __fdata.timeout.flags = PPS_TIME_INVALID; + + ret = ioctl(handle, PPS_FETCH, &__fdata); + + ppsinfobuf->assert_sequence = __fdata.info.assert_sequence; + ppsinfobuf->clear_sequence = __fdata.info.clear_sequence; + ppsinfobuf->assert_tu.tspec.tv_sec = __fdata.info.assert_tu.sec; + ppsinfobuf->assert_tu.tspec.tv_nsec = __fdata.info.assert_tu.nsec; + ppsinfobuf->clear_tu.tspec.tv_sec = __fdata.info.clear_tu.sec; + ppsinfobuf->clear_tu.tspec.tv_nsec = __fdata.info.clear_tu.nsec; + ppsinfobuf->current_mode = __fdata.info.current_mode; + + return ret; +} + +#ifdef PPS_KC_BIND + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + struct pps_bind_args __bind_args; + + __bind_args.tsformat = tsformat; + __bind_args.edge = edge; + __bind_args.consumer = kernel_consumer; + + return ioctl(handle, PPS_KC_BIND, &__bind_args); +} + +#else /* !PPS_KC_BIND */ + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + /* LinuxPPS doesn't implement kernel consumer feature */ + errno = EOPNOTSUPP; + return -1; +} + +#endif /* PPS_KC_BIND */ + +#endif /* _SYS_TIMEPPS_H_ */ -- 1.7.0.4