FreeBSD/Linux Kernel Cross Reference
sys/sys/timepps.h
1 /* $NetBSD: timepps.h,v 1.15 2006/06/07 22:34:18 kardel Exp $ */
2
3 /*
4 * Copyright (c) 1998 Jonathan Stone
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Jonathan Stone for
18 * the NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #ifndef _SYS_TIMEPPS_H_
35 #define _SYS_TIMEPPS_H_
36
37 /*
38 * This header file complies with "Pulse-Per-Second API for UNIX-like
39 * Operating Systems, Version 1.0", draft-mogul-pps-api-05.txt
40 */
41
42 #include <sys/ioccom.h>
43
44 #define PPS_API_VERS_1 1 /* API version number */
45
46 /*
47 * PPSAPI type definitions
48 */
49 typedef int32_t pps_handle_t; /* represents a PPS source */
50 typedef uint32_t pps_seq_t; /* sequence number, at least 32 bits */
51
52 typedef union pps_timeu {
53 struct timespec tspec;
54 struct { /* NTP long fixed-point format */
55 unsigned int integral;
56 unsigned int fractional;
57 } ntplfp;
58 unsigned long longpair[2];
59 } pps_timeu_t;
60
61
62 /*
63 * timestamp information
64 */
65 typedef struct {
66 pps_seq_t assert_sequence; /* assert event seq # */
67 pps_seq_t clear_sequence; /* clear event seq # */
68 pps_timeu_t assert_tu;
69 pps_timeu_t clear_tu;
70 int current_mode; /* current mode bits */
71 } pps_info_t;
72
73 #define assert_timestamp assert_tu.tspec
74 #define clear_timestamp clear_tu.tspec
75
76
77 /*
78 * Parameter structure
79 */
80 typedef struct {
81 int api_version; /* API version number */
82 int mode; /* mode bits */
83 pps_timeu_t assert_off_tu;
84 pps_timeu_t clear_off_tu;
85 } pps_params_t;
86 #define assert_offset assert_off_tu.tspec
87 #define clear_offset clear_off_tu.tspec
88
89
90 /*
91 * Device/implementation parameters (mode, edge bits)
92 */
93 #define PPS_CAPTUREASSERT 0x01
94 #define PPS_CAPTURECLEAR 0x02
95 #define PPS_CAPTUREBOTH 0x03
96 #define PPS_OFFSETASSERT 0x10
97 #define PPS_OFFSETCLEAR 0x20
98 #define PPS_CANWAIT 0x100
99 #define PPS_CANPOLL 0x200
100
101 /*
102 * Kernel actions
103 */
104 #define PPS_ECHOASSERT 0x40
105 #define PPS_ECHOCLEAR 0x80
106
107
108 /*
109 * timestamp formats (tsformat, mode)
110 */
111 #define PPS_TSFMT_TSPEC 0x1000
112 #define PPS_TSFMT_NTPLFP 0x2000
113
114 /*
115 * Kernel discipline actions (kernel_consumer)
116 */
117 #define PPS_KC_HARDPPS 0
118 #define PPS_KC_HARDPPS_PLL 1
119 #define PPS_KC_HARDPPS_FLL 2
120
121 /*
122 * IOCTL definitions
123 */
124 #define PPS_IOC_CREATE _IO('1', 1)
125 #define PPS_IOC_DESTROY _IO('1', 2)
126 #define PPS_IOC_SETPARAMS _IOW('1', 3, pps_params_t)
127 #define PPS_IOC_GETPARAMS _IOR('1', 4, pps_params_t)
128 #define PPS_IOC_GETCAP _IOR('1', 5, int)
129 #define PPS_IOC_FETCH _IOWR('1', 6, pps_info_t)
130 #define PPS_IOC_KCBIND _IOW('1', 7, int)
131
132 #ifdef _KERNEL
133
134 #ifdef __HAVE_TIMECOUNTER
135 struct pps_state {
136 /* Capture information. */
137 struct timehands *capth;
138 unsigned capgen;
139 unsigned capcount;
140
141 /* State information. */
142 pps_params_t ppsparam;
143 pps_info_t ppsinfo;
144 int kcmode;
145 int ppscap;
146 struct timecounter *ppstc;
147 unsigned ppscount[3];
148 };
149
150 void pps_capture(struct pps_state *);
151 void pps_event(struct pps_state *, int);
152 void pps_init(struct pps_state *);
153 int pps_ioctl(unsigned long, caddr_t, struct pps_state *);
154 #endif /* __HAVE_TIMECOUNTER */
155
156 #else /* !_KERNEL */
157
158 #include <sys/cdefs.h>
159 #include <sys/ioctl.h>
160 #include <errno.h>
161
162 static __inline int time_pps_create(int, pps_handle_t *);
163 static __inline int time_pps_destroy(pps_handle_t);
164 static __inline int time_pps_setparams(pps_handle_t, const pps_params_t *);
165 static __inline int time_pps_getparams(pps_handle_t, pps_params_t *);
166 static __inline int time_pps_getcap(pps_handle_t, int *);
167 static __inline int time_pps_fetch(pps_handle_t, const int, pps_info_t *,
168 const struct timespec *);
169 #if 0
170 static __inline int time_pps_wait(pps_handle_t, const struct timespec *,
171 pps_info_t *);
172 #endif
173
174 static __inline int time_pps_kcbind(pps_handle_t, const int, const int,
175 const int);
176
177 static __inline int
178 time_pps_create(filedes, handle)
179 int filedes;
180 pps_handle_t *handle;
181 {
182
183 *handle = filedes;
184 return (0);
185 }
186
187 static __inline int
188 time_pps_destroy(handle)
189 pps_handle_t handle;
190 {
191
192 return (0);
193 }
194
195 static __inline int
196 time_pps_setparams(handle, ppsparams)
197 pps_handle_t handle;
198 const pps_params_t *ppsparams;
199 {
200
201 return (ioctl(handle, PPS_IOC_SETPARAMS, __UNCONST(ppsparams)));
202 }
203
204 static __inline int
205 time_pps_getparams(handle, ppsparams)
206 pps_handle_t handle;
207 pps_params_t *ppsparams;
208 {
209
210 return (ioctl(handle, PPS_IOC_GETPARAMS, ppsparams));
211 }
212
213 static __inline int
214 time_pps_getcap(handle, mode)
215 pps_handle_t handle;
216 int *mode;
217 {
218
219 return (ioctl(handle, PPS_IOC_GETCAP, mode));
220 }
221
222 static __inline int
223 time_pps_fetch(handle, tsformat, ppsinfobuf, timeout)
224 pps_handle_t handle;
225 const int tsformat;
226 pps_info_t *ppsinfobuf;
227 const struct timespec *timeout;
228 {
229
230 return (ioctl(handle, PPS_IOC_FETCH, ppsinfobuf));
231 }
232
233 static __inline int
234 time_pps_kcbind(handle, kernel_consumer, edge, tsformat)
235 pps_handle_t handle;
236 const int kernel_consumer;
237 const int edge;
238 const int tsformat;
239 {
240
241 if (tsformat != PPS_TSFMT_TSPEC) {
242 errno = EINVAL;
243 return -1;
244 }
245
246 return (ioctl(handle, PPS_IOC_KCBIND, __UNCONST(&edge)));
247 }
248 #endif /* !_KERNEL*/
249 #endif /* SYS_TIMEPPS_H_ */
Cache object: 45a667619c70b6ff90a48b9c64611783
|