summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/include/rtems/rtems/clock.h
blob: 57c22a20d2cc6c351ce29cb3ed98122197ecb7c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
/**
 * @file rtems/rtems/clock.h
 *
 *  This include file contains all the constants and structures associated
 *  with the Clock Manager.  This manager provides facilities to set, obtain,
 *  and continually update the current date and time.
 *
 *  This manager provides directives to:
 *
 *     - set the current date and time
 *     - obtain the current date and time
 *     - set the nanoseconds since last clock tick handler
 *     - announce a clock tick
 *     - obtain the system uptime
 */

/*  COPYRIGHT (c) 1989-2008.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#ifndef _RTEMS_RTEMS_CLOCK_H
#define _RTEMS_RTEMS_CLOCK_H

#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/types.h>

#include <sys/time.h> /* struct timeval */

/**
 *  @defgroup ClassicClock Clocks
 *
 *  @ingroup ClassicRTEMS
 *
 *  This encapsulates functionality which XXX
 */
/**@{*/

#ifdef __cplusplus
extern "C" {
#endif

/**
 *  List of things which can be returned by the rtems_clock_get directive.
 */
typedef enum {
  /** This value indicates obtain TOD in Classic API format. */
  RTEMS_CLOCK_GET_TOD,
  /** This value indicates obtain the number of seconds since the epoch. */
  RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH,
  /** This value indicates obtain the number of ticks since system boot. */
  RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
  /** This value indicates obtain the number of ticks per second. */
  RTEMS_CLOCK_GET_TICKS_PER_SECOND,
  /** This value indicates obtain the TOD in struct timeval format. */
  RTEMS_CLOCK_GET_TIME_VALUE
} rtems_clock_get_options;

/**
 *  Type for the nanoseconds since last tick BSP extension.
 */
typedef Watchdog_Nanoseconds_since_last_tick_routine
  rtems_nanoseconds_extension_routine;

/**
 *  @brief Obtain Current Time of Day
 *
 *  This routine implements the rtems_clock_get directive.  It returns
 *  one of the following:
 *    + current time of day
 *    + seconds since epoch
 *    + ticks since boot
 *    + ticks per second
 *
 *  @param[in] option is the format of time to return
 *  @param[in] time_buffer points to the output area
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.
 */
rtems_status_code rtems_clock_get(
  rtems_clock_get_options  option,
  void                    *time_buffer
);

/**
 *  @brief Obtain Current Time of Day (Classic TOD)
 *
 *  This routine implements the rtems_clock_get_tod directive.  It returns
 *  the current time of day in the format defined by RTEID.
 *
 *  @param[in] time_buffer points to the time of day structure
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.  If successful, the time_buffer will
 *          be filled in with the current time of day.
 */
rtems_status_code rtems_clock_get_tod(
  rtems_time_of_day *time_buffer
);

/**
 *  @brief Obtain TOD in struct timeval Format
 *
 *  This routine implements the rtems_clock_get_tod_timeval
 *  directive.
 *
 *  @param[in] time points to the struct timeval variable to fill in
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.  If successful, the time will
 *          be filled in with the current time of day.
 */
rtems_status_code rtems_clock_get_tod_timeval(
  struct timeval *time
);

/**
 *  @brief Obtain Seconds Since Epoch
 *
 *  This routine implements the rtems_clock_get_seconds_since_epoch
 *  directive.
 *
 *  @param[in] the_interval points to the interval variable to fill in
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.  If successful, the time_buffer will
 *          be filled in with the current time of day.
 */
rtems_status_code rtems_clock_get_seconds_since_epoch(
  rtems_interval *the_interval
);

/**
 *  @brief Obtain Ticks Since Boot
 *
 *  This routine implements the rtems_clock_get_ticks_since_boot
 *  directive.
 *
 *  @return This method returns the number of ticks since boot.  It cannot
 *          fail since RTEMS always keeps a running count of ticks since boot.
 */
rtems_interval rtems_clock_get_ticks_since_boot(void);

/**
 *  @brief Obtain Ticks Per Seconds
 *
 *  This routine implements the rtems_clock_get_ticks_per_second
 *  directive.
 *
 *  @return This method returns the number of ticks since boot.  It cannot
 *          fail since RTEMS is always configured to know the number of
 *          ticks per second.
 */
rtems_interval rtems_clock_get_ticks_per_second(void);

/**
 *  @brief Set the Current TOD
 *
 *  This routine implements the rtems_clock_set directive.  It sets
 *  the current time of day to that in the time_buffer record.
 *
 *  @param[in] time_buffer points to the new TOD
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.
 *
 *  @note Activities scheduled based upon the current time of day
 *        may be executed immediately if the time is moved forward.
 */
rtems_status_code rtems_clock_set(
  const rtems_time_of_day *time_buffer
);

/**
 *  @brief Announce a Clock Tick
 *
 *  This routine implements the rtems_clock_tick directive.  It is invoked
 *  to inform RTEMS of the occurrence of a clock tick.
 *
 *  @return This directive always returns RTEMS_SUCCESSFUL.
 *
 *  @note This method is typically called from an ISR and is the basis
 *        for all timeouts and delays.
 */
rtems_status_code rtems_clock_tick( void );

/**
 *  @brief Set the BSP specific Nanoseconds Extension
 *
 *  This directive sets the BSP provided nanoseconds since last tick
 *  extension.
 *
 *  @param[in] routine is a pointer to the extension routine
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.
 */
rtems_status_code rtems_clock_set_nanoseconds_extension(
  rtems_nanoseconds_extension_routine routine
);

/**
 *  @brief Obtain the System Uptime
 *
 *  This directive returns the system uptime.
 *
 *  @param[in] uptime is a pointer to the time structure
 *
 *  @return This method returns RTEMS_SUCCESSFUL if there was not an
 *          error.  Otherwise, a status code is returned indicating the
 *          source of the error.  If successful, the uptime will be
 *          filled in.
 */
rtems_status_code rtems_clock_get_uptime(
  struct timespec *uptime
);

/**
 *  @brief _TOD_Validate
 *
 *  This support function returns true if @a the_tod contains
 *  a valid time of day, and false otherwise.
 *
 *  @param[in] the_tod is the TOD structure to validate
 *
 *  @return This method returns true if the TOD is valid and false otherwise.
 */
bool _TOD_Validate(
  const rtems_time_of_day *the_tod
);

/**
 *  @brief _TOD_To_seconds
 *
 *  This function returns the number seconds between the epoch and @a the_tod.
 *
 *  @param[in] the_tod is the TOD structure to convert to seconds
 *
 *  @return This method returns the number of seconds since epoch represented
 *          by @a the_tod
 */
Watchdog_Interval _TOD_To_seconds(
  const rtems_time_of_day *the_tod
);

#ifdef __cplusplus
}
#endif

/**@}*/

#endif
/* end of include file */