summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ppbus/pps.c21
-rw-r--r--sys/sys/timepps.h51
2 files changed, 54 insertions, 18 deletions
diff --git a/sys/dev/ppbus/pps.c b/sys/dev/ppbus/pps.c
index 70274b3..74bcf0c 100644
--- a/sys/dev/ppbus/pps.c
+++ b/sys/dev/ppbus/pps.c
@@ -6,7 +6,12 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: pps.c,v 1.5 1998/06/07 19:44:22 phk Exp $
+ * $Id: pps.c,v 1.6 1998/06/08 02:43:12 bde Exp $
+ *
+ * This driver implements a draft-mogul-pps-api-02.txt PPS source.
+ *
+ * The input pin is pin#10
+ * The echo output pin is pin#14
*
*/
@@ -39,7 +44,8 @@ static int ppscap =
PPS_CAPTUREASSERT |
PPS_HARDPPSONASSERT |
PPS_OFFSETASSERT |
- PPS_ECHOASSERT;
+ PPS_ECHOASSERT |
+ PPS_TSFMT_TSPEC;
static int npps;
@@ -152,10 +158,12 @@ ppsintr(int unit)
return;
if (sc->ppsparam.mode & PPS_ECHOASSERT)
ppb_wctr(&sc->pps_dev, IRQENABLE | AUTOFEED);
- timespecadd(&tc, &sc->ppsparam.assert_offset);
- if (tc.tv_nsec < 0) {
- tc.tv_sec--;
- tc.tv_nsec += 1000000000;
+ if (sc->ppsparam.mode & PPS_OFFSETASSERT) {
+ timespecadd(&tc, &sc->ppsparam.assert_offset);
+ if (tc.tv_nsec < 0) {
+ tc.tv_sec--;
+ tc.tv_nsec += 1000000000;
+ }
}
sc->ppsinfo.assert_timestamp = tc;
sc->ppsinfo.assert_sequence++;
@@ -196,6 +204,7 @@ ppsioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
case PPS_IOC_FETCH:
pi = (pps_info_t *)data;
*pi = sc->ppsinfo;
+ pi->current_mode = sc->ppsparam.mode;
return (0);
case PPS_IOC_WAIT:
return (EOPNOTSUPP);
diff --git a/sys/sys/timepps.h b/sys/sys/timepps.h
index b2bf4e3..78d0901 100644
--- a/sys/sys/timepps.h
+++ b/sys/sys/timepps.h
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id$
+ * $Id: timepps.h,v 1.1 1998/06/07 19:44:16 phk Exp $
*
* The is a FreeBSD protype version of the "draft-mogul-pps-api-02.txt"
* specification for Pulse Per Second timing interfaces.
@@ -22,35 +22,62 @@ typedef int pps_handle_t;
typedef unsigned pps_seq_t;
+typedef struct ntp_fp {
+ unsigned int integral;
+ unsigned int fractional;
+} ntp_fp_t;
+
+typedef union pps_timeu {
+ struct timespec tspec;
+ ntp_fp_t ntpfp;
+ unsigned long longpair[2];
+} pps_timeu_t;
+
typedef struct {
- pps_seq_t assert_sequence;
- pps_seq_t clear_sequence;
- struct timespec assert_timestamp;
- struct timespec clear_timestamp;
- int current_mode;
+ pps_seq_t assert_sequence; /* assert event seq # */
+ pps_seq_t clear_sequence; /* clear event seq # */
+ pps_timeu_t assert_tu;
+ pps_timeu_t clear_tu;
+ int current_mode; /* current mode bits */
} pps_info_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
+
typedef struct {
- int mode;
- struct timespec assert_offset;
- struct timespec clear_offset;
+ int mode; /* mode bits */
+ pps_timeu_t assert_off_tu;
+ pps_timeu_t clear_off_tu;
} pps_params_t;
+#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
+
+
#define PPS_CAPTUREASSERT 0x01
#define PPS_CAPTURECLEAR 0x01
#define PPS_CAPTUREBOTH 0x03
-#define PPS_HARDPPSONASSERT 0x04
-#define PPS_HARDPPSONCLEAR 0x08
-
#define PPS_OFFSETASSERT 0x10
#define PPS_OFFSETCLEAR 0x20
+#define PPS_HARDPPSONASSERT 0x04
+#define PPS_HARDPPSONCLEAR 0x08
+
#define PPS_ECHOASSERT 0x40
#define PPS_ECHOCLEAR 0x80
#define PPS_CANWAIT 0x100
+#define PPS_TSFMT_TSPEC 0x1000
+#define PPS_TSFMT_NTPFP 0x2000
+
struct pps_wait_args {
struct timespec timeout;
pps_info_t pps_info_buf;
OpenPOWER on IntegriCloud