Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
rtc.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Trackunit Corporation
3 * Copyright (c) 2023 Bjarki Arge Andreasen
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
13#ifndef ZEPHYR_INCLUDE_DRIVERS_RTC_H_
14#define ZEPHYR_INCLUDE_DRIVERS_RTC_H_
15
23#include <zephyr/types.h>
24#include <zephyr/device.h>
25#include <errno.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
37#define RTC_ALARM_TIME_MASK_SECOND BIT(0)
38#define RTC_ALARM_TIME_MASK_MINUTE BIT(1)
39#define RTC_ALARM_TIME_MASK_HOUR BIT(2)
40#define RTC_ALARM_TIME_MASK_MONTHDAY BIT(3)
41#define RTC_ALARM_TIME_MASK_MONTH BIT(4)
42#define RTC_ALARM_TIME_MASK_YEAR BIT(5)
43#define RTC_ALARM_TIME_MASK_WEEKDAY BIT(6)
44#define RTC_ALARM_TIME_MASK_YEARDAY BIT(7)
45#define RTC_ALARM_TIME_MASK_NSEC BIT(8)
59struct rtc_time {
60 int tm_sec;
61 int tm_min;
62 int tm_hour;
63 int tm_mday;
64 int tm_mon;
65 int tm_year;
66 int tm_wday;
67 int tm_yday;
69 int tm_nsec;
70};
71
79typedef void (*rtc_update_callback)(const struct device *dev, void *user_data);
80
89typedef void (*rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data);
90
101typedef int (*rtc_api_set_time)(const struct device *dev, const struct rtc_time *timeptr);
102
107typedef int (*rtc_api_get_time)(const struct device *dev, struct rtc_time *timeptr);
108
113typedef int (*rtc_api_alarm_get_supported_fields)(const struct device *dev, uint16_t id,
114 uint16_t *mask);
115
120typedef int (*rtc_api_alarm_set_time)(const struct device *dev, uint16_t id, uint16_t mask,
121 const struct rtc_time *timeptr);
122
127typedef int (*rtc_api_alarm_get_time)(const struct device *dev, uint16_t id, uint16_t *mask,
128 struct rtc_time *timeptr);
129
134typedef int (*rtc_api_alarm_is_pending)(const struct device *dev, uint16_t id);
135
140typedef int (*rtc_api_alarm_set_callback)(const struct device *dev, uint16_t id,
141 rtc_alarm_callback callback, void *user_data);
142
147typedef int (*rtc_api_update_set_callback)(const struct device *dev,
148 rtc_update_callback callback, void *user_data);
149
154typedef int (*rtc_api_set_calibration)(const struct device *dev, int32_t calibration);
155
160typedef int (*rtc_api_get_calibration)(const struct device *dev, int32_t *calibration);
161
165__subsystem struct rtc_driver_api {
166 rtc_api_set_time set_time;
167 rtc_api_get_time get_time;
168#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
169 rtc_api_alarm_get_supported_fields alarm_get_supported_fields;
170 rtc_api_alarm_set_time alarm_set_time;
171 rtc_api_alarm_get_time alarm_get_time;
172 rtc_api_alarm_is_pending alarm_is_pending;
173 rtc_api_alarm_set_callback alarm_set_callback;
174#endif /* CONFIG_RTC_ALARM */
175#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
176 rtc_api_update_set_callback update_set_callback;
177#endif /* CONFIG_RTC_UPDATE */
178#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
179 rtc_api_set_calibration set_calibration;
180 rtc_api_get_calibration get_calibration;
181#endif /* CONFIG_RTC_CALIBRATION */
182};
183
196__syscall int rtc_set_time(const struct device *dev, const struct rtc_time *timeptr);
197
198static inline int z_impl_rtc_set_time(const struct device *dev, const struct rtc_time *timeptr)
199{
200 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
201
202 return api->set_time(dev, timeptr);
203}
204
215__syscall int rtc_get_time(const struct device *dev, struct rtc_time *timeptr);
216
217static inline int z_impl_rtc_get_time(const struct device *dev, struct rtc_time *timeptr)
218{
219 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
220
221 return api->get_time(dev, timeptr);
222}
223
228#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
229
244__syscall int rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
245 uint16_t *mask);
246
247static inline int z_impl_rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
248 uint16_t *mask)
249{
250 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
251
252 if (api->alarm_get_supported_fields == NULL) {
253 return -ENOSYS;
254 }
255
256 return api->alarm_get_supported_fields(dev, id, mask);
257}
258
282__syscall int rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
283 const struct rtc_time *timeptr);
284
285static inline int z_impl_rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
286 const struct rtc_time *timeptr)
287{
288 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
289
290 if (api->alarm_set_time == NULL) {
291 return -ENOSYS;
292 }
293
294 return api->alarm_set_time(dev, id, mask, timeptr);
295}
296
312__syscall int rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
313 struct rtc_time *timeptr);
314
315static inline int z_impl_rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
316 struct rtc_time *timeptr)
317{
318 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
319
320 if (api->alarm_get_time == NULL) {
321 return -ENOSYS;
322 }
323
324 return api->alarm_get_time(dev, id, mask, timeptr);
325}
326
342__syscall int rtc_alarm_is_pending(const struct device *dev, uint16_t id);
343
344static inline int z_impl_rtc_alarm_is_pending(const struct device *dev, uint16_t id)
345{
346 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
347
348 if (api->alarm_is_pending == NULL) {
349 return -ENOSYS;
350 }
351
352 return api->alarm_is_pending(dev, id);
353}
354
381__syscall int rtc_alarm_set_callback(const struct device *dev, uint16_t id,
382 rtc_alarm_callback callback, void *user_data);
383
384static inline int z_impl_rtc_alarm_set_callback(const struct device *dev, uint16_t id,
385 rtc_alarm_callback callback, void *user_data)
386{
387 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
388
389 if (api->alarm_set_callback == NULL) {
390 return -ENOSYS;
391 }
392
393 return api->alarm_set_callback(dev, id, callback, user_data);
394}
395
396#endif /* CONFIG_RTC_ALARM */
405#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
406
426__syscall int rtc_update_set_callback(const struct device *dev, rtc_update_callback callback,
427 void *user_data);
428
429static inline int z_impl_rtc_update_set_callback(const struct device *dev,
430 rtc_update_callback callback, void *user_data)
431{
432 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
433
434 if (api->update_set_callback == NULL) {
435 return -ENOSYS;
436 }
437
438 return api->update_set_callback(dev, callback, user_data);
439}
440
441#endif /* CONFIG_RTC_UPDATE */
450#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
451
468__syscall int rtc_set_calibration(const struct device *dev, int32_t calibration);
469
470static inline int z_impl_rtc_set_calibration(const struct device *dev, int32_t calibration)
471{
472 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
473
474 if (api->set_calibration == NULL) {
475 return -ENOSYS;
476 }
477
478 return api->set_calibration(dev, calibration);
479}
480
491__syscall int rtc_get_calibration(const struct device *dev, int32_t *calibration);
492
493static inline int z_impl_rtc_get_calibration(const struct device *dev, int32_t *calibration)
494{
495 const struct rtc_driver_api *api = (const struct rtc_driver_api *)dev->api;
496
497 if (api->get_calibration == NULL) {
498 return -ENOSYS;
499 }
500
501 return api->get_calibration(dev, calibration);
502}
503
504#endif /* CONFIG_RTC_CALIBRATION */
517struct tm;
518
523static inline struct tm *rtc_time_to_tm(struct rtc_time *timeptr)
524{
525 return (struct tm *)timeptr;
526}
527
536#ifdef __cplusplus
537}
538#endif
539
540#include <syscalls/rtc.h>
541
542#endif /* ZEPHYR_INCLUDE_DRIVERS_RTC_H_ */
System error numbers.
void(* rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data)
RTC alarm triggered callback.
Definition: rtc.h:89
int rtc_set_calibration(const struct device *dev, int32_t calibration)
API for setting RTC calibration.
int rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask, const struct rtc_time *timeptr)
API for setting RTC alarm time.
int rtc_get_time(const struct device *dev, struct rtc_time *timeptr)
API for getting RTC time.
int rtc_set_time(const struct device *dev, const struct rtc_time *timeptr)
API for setting RTC time.
int rtc_alarm_is_pending(const struct device *dev, uint16_t id)
API for testing if RTC alarm is pending.
int rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id, uint16_t *mask)
API for getting the supported fields of the RTC alarm time.
int rtc_alarm_set_callback(const struct device *dev, uint16_t id, rtc_alarm_callback callback, void *user_data)
API for setting alarm callback.
void(* rtc_update_callback)(const struct device *dev, void *user_data)
RTC update event callback.
Definition: rtc.h:79
int rtc_get_calibration(const struct device *dev, int32_t *calibration)
API for getting RTC calibration.
static struct tm * rtc_time_to_tm(struct rtc_time *timeptr)
Convenience function for safely casting a rtc_time pointer to a tm pointer.
Definition: rtc.h:523
int rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask, struct rtc_time *timeptr)
API for getting RTC alarm time.
int rtc_update_set_callback(const struct device *dev, rtc_update_callback callback, void *user_data)
API for setting update callback.
#define ENOSYS
Function not implemented.
Definition: errno.h:83
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition: device.h:381
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:387
Structure for storing date and time values with sub-second precision.
Definition: rtc.h:59
int tm_yday
Day of the year [0, 365] (Unknown = -1)
Definition: rtc.h:67
int tm_nsec
Nanoseconds [0, 999999999] (Unknown = 0)
Definition: rtc.h:69
int tm_min
Minutes [0, 59].
Definition: rtc.h:61
int tm_mon
Month [0, 11].
Definition: rtc.h:64
int tm_isdst
Daylight saving time flag [-1] (Unknown = -1)
Definition: rtc.h:68
int tm_wday
Day of the week [0, 6] (Sunday = 0) (Unknown = -1)
Definition: rtc.h:66
int tm_year
Year - 1900.
Definition: rtc.h:65
int tm_sec
Seconds [0, 59].
Definition: rtc.h:60
int tm_hour
Hours [0, 23].
Definition: rtc.h:62
int tm_mday
Day of the month [1, 31].
Definition: rtc.h:63
Definition: time.h:24