Zephyr API Documentation 4.4.0-rc1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
14#ifndef ZEPHYR_INCLUDE_DRIVERS_RTC_H_
15#define ZEPHYR_INCLUDE_DRIVERS_RTC_H_
16
25
26#include <zephyr/kernel.h>
27#include <zephyr/device.h>
28#include <errno.h>
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
40#define RTC_ALARM_TIME_MASK_SECOND BIT(0)
41#define RTC_ALARM_TIME_MASK_MINUTE BIT(1)
42#define RTC_ALARM_TIME_MASK_HOUR BIT(2)
43#define RTC_ALARM_TIME_MASK_MONTHDAY BIT(3)
44#define RTC_ALARM_TIME_MASK_MONTH BIT(4)
45#define RTC_ALARM_TIME_MASK_YEAR BIT(5)
46#define RTC_ALARM_TIME_MASK_WEEKDAY BIT(6)
47#define RTC_ALARM_TIME_MASK_YEARDAY BIT(7)
48#define RTC_ALARM_TIME_MASK_NSEC BIT(8)
52
62struct rtc_time {
63 int tm_sec;
64 int tm_min;
65 int tm_hour;
66 int tm_mday;
67 int tm_mon;
68 int tm_year;
69 int tm_wday;
70 int tm_yday;
72 int tm_nsec;
73};
74
82typedef void (*rtc_update_callback)(const struct device *dev, void *user_data);
83
92typedef void (*rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data);
93
99
106typedef int (*rtc_api_set_time)(const struct device *dev, const struct rtc_time *timeptr);
107
114typedef int (*rtc_api_get_time)(const struct device *dev, struct rtc_time *timeptr);
115
122typedef int (*rtc_api_alarm_get_supported_fields)(const struct device *dev, uint16_t id,
123 uint16_t *mask);
124
131typedef int (*rtc_api_alarm_set_time)(const struct device *dev, uint16_t id, uint16_t mask,
132 const struct rtc_time *timeptr);
133
140typedef int (*rtc_api_alarm_get_time)(const struct device *dev, uint16_t id, uint16_t *mask,
141 struct rtc_time *timeptr);
142
149typedef int (*rtc_api_alarm_is_pending)(const struct device *dev, uint16_t id);
150
157typedef int (*rtc_api_alarm_set_callback)(const struct device *dev, uint16_t id,
158 rtc_alarm_callback callback, void *user_data);
159
166typedef int (*rtc_api_update_set_callback)(const struct device *dev,
167 rtc_update_callback callback, void *user_data);
168
175typedef int (*rtc_api_set_calibration)(const struct device *dev, int32_t calibration);
176
183typedef int (*rtc_api_get_calibration)(const struct device *dev, int32_t *calibration);
184
188__subsystem struct rtc_driver_api {
193#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
219#endif /* CONFIG_RTC_ALARM */
220#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
226#endif /* CONFIG_RTC_UPDATE */
227#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
238#endif /* CONFIG_RTC_CALIBRATION */
239};
240
242
253__syscall int rtc_set_time(const struct device *dev, const struct rtc_time *timeptr);
254
255static inline int z_impl_rtc_set_time(const struct device *dev, const struct rtc_time *timeptr)
256{
257 return DEVICE_API_GET(rtc, dev)->set_time(dev, timeptr);
258}
259
270__syscall int rtc_get_time(const struct device *dev, struct rtc_time *timeptr);
271
272static inline int z_impl_rtc_get_time(const struct device *dev, struct rtc_time *timeptr)
273{
274 return DEVICE_API_GET(rtc, dev)->get_time(dev, timeptr);
275}
276
281#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
282
297__syscall int rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
298 uint16_t *mask);
299
300static inline int z_impl_rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
301 uint16_t *mask)
302{
303 if (DEVICE_API_GET(rtc, dev)->alarm_get_supported_fields == NULL) {
304 return -ENOSYS;
305 }
306
307 return DEVICE_API_GET(rtc, dev)->alarm_get_supported_fields(dev, id, mask);
308}
309
333__syscall int rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
334 const struct rtc_time *timeptr);
335
336static inline int z_impl_rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
337 const struct rtc_time *timeptr)
338{
339 if (DEVICE_API_GET(rtc, dev)->alarm_set_time == NULL) {
340 return -ENOSYS;
341 }
342
343 return DEVICE_API_GET(rtc, dev)->alarm_set_time(dev, id, mask, timeptr);
344}
345
361__syscall int rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
362 struct rtc_time *timeptr);
363
364static inline int z_impl_rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
365 struct rtc_time *timeptr)
366{
367 if (DEVICE_API_GET(rtc, dev)->alarm_get_time == NULL) {
368 return -ENOSYS;
369 }
370
371 return DEVICE_API_GET(rtc, dev)->alarm_get_time(dev, id, mask, timeptr);
372}
373
389__syscall int rtc_alarm_is_pending(const struct device *dev, uint16_t id);
390
391static inline int z_impl_rtc_alarm_is_pending(const struct device *dev, uint16_t id)
392{
393 if (DEVICE_API_GET(rtc, dev)->alarm_is_pending == NULL) {
394 return -ENOSYS;
395 }
396
397 return DEVICE_API_GET(rtc, dev)->alarm_is_pending(dev, id);
398}
399
426static inline int rtc_alarm_set_callback(const struct device *dev, uint16_t id,
427 rtc_alarm_callback callback, void *user_data)
428{
429 if (DEVICE_API_GET(rtc, dev)->alarm_set_callback == NULL) {
430 return -ENOSYS;
431 }
432
433 return DEVICE_API_GET(rtc, dev)->alarm_set_callback(dev, id, callback, user_data);
434}
435
436#endif /* CONFIG_RTC_ALARM */
440
445#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
446
466static inline int rtc_update_set_callback(const struct device *dev,
467 rtc_update_callback callback, void *user_data)
468{
469 if (DEVICE_API_GET(rtc, dev)->update_set_callback == NULL) {
470 return -ENOSYS;
471 }
472
473 return DEVICE_API_GET(rtc, dev)->update_set_callback(dev, callback, user_data);
474}
475
476#endif /* CONFIG_RTC_UPDATE */
480
485#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
486
505__syscall int rtc_set_calibration(const struct device *dev, int32_t calibration);
506
507static inline int z_impl_rtc_set_calibration(const struct device *dev, int32_t calibration)
508{
509 if (DEVICE_API_GET(rtc, dev)->set_calibration == NULL) {
510 return -ENOSYS;
511 }
512
513 return DEVICE_API_GET(rtc, dev)->set_calibration(dev, calibration);
514}
515
526__syscall int rtc_get_calibration(const struct device *dev, int32_t *calibration);
527
528static inline int z_impl_rtc_get_calibration(const struct device *dev, int32_t *calibration)
529{
530 if (DEVICE_API_GET(rtc, dev)->get_calibration == NULL) {
531 return -ENOSYS;
532 }
533
534 return DEVICE_API_GET(rtc, dev)->get_calibration(dev, calibration);
535}
536
537#endif /* CONFIG_RTC_CALIBRATION */
541
546
550struct tm;
551
556static inline struct tm *rtc_time_to_tm(struct rtc_time *timeptr)
557{
558 return (struct tm *)timeptr;
559}
560
569{
570 __ASSERT_NO_MSG(frequency > 0);
571
572 return (int32_t)((1000000000000000000LL / frequency) - 1000000000);
573}
574
578
582
583#ifdef __cplusplus
584}
585#endif
586
587#include <zephyr/syscalls/rtc.h>
588
589#endif /* ZEPHYR_INCLUDE_DRIVERS_RTC_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1375
System error numbers.
int(* rtc_api_get_time)(const struct device *dev, struct rtc_time *timeptr)
Callback API to get RTC time.
Definition rtc.h:114
int(* rtc_api_alarm_is_pending)(const struct device *dev, uint16_t id)
Callback API to test if RTC alarm is pending.
Definition rtc.h:149
int(* rtc_api_get_calibration)(const struct device *dev, int32_t *calibration)
Callback API to get RTC calibration.
Definition rtc.h:183
int(* rtc_api_alarm_set_time)(const struct device *dev, uint16_t id, uint16_t mask, const struct rtc_time *timeptr)
Callback API to set RTC alarm time.
Definition rtc.h:131
int(* rtc_api_set_calibration)(const struct device *dev, int32_t calibration)
Callback API to set RTC calibration.
Definition rtc.h:175
int(* rtc_api_update_set_callback)(const struct device *dev, rtc_update_callback callback, void *user_data)
Callback API to set RTC update callback.
Definition rtc.h:166
int(* rtc_api_set_time)(const struct device *dev, const struct rtc_time *timeptr)
Callback API to set RTC time.
Definition rtc.h:106
int(* rtc_api_alarm_get_supported_fields)(const struct device *dev, uint16_t id, uint16_t *mask)
Callback API to get the supported fields of the RTC alarm time.
Definition rtc.h:122
int(* rtc_api_alarm_get_time)(const struct device *dev, uint16_t id, uint16_t *mask, struct rtc_time *timeptr)
Callback API to get RTC alarm time.
Definition rtc.h:140
int(* rtc_api_alarm_set_callback)(const struct device *dev, uint16_t id, rtc_alarm_callback callback, void *user_data)
Callback API to set RTC alarm callback.
Definition rtc.h:157
static int rtc_update_set_callback(const struct device *dev, rtc_update_callback callback, void *user_data)
API for setting update callback.
Definition rtc.h:466
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.
void(* rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data)
RTC alarm triggered callback.
Definition rtc.h:92
static int rtc_alarm_set_callback(const struct device *dev, uint16_t id, rtc_alarm_callback callback, void *user_data)
API for setting alarm callback.
Definition rtc.h:426
void(* rtc_update_callback)(const struct device *dev, void *user_data)
RTC update event callback.
Definition rtc.h:82
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:556
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.
static int32_t rtc_calibration_from_frequency(uint32_t frequency)
Determine required calibration to 1 Hertz from frequency.
Definition rtc.h:568
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__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:513
<span class="mlabel">Driver Operations</span> RTC driver operations
Definition rtc.h:188
rtc_api_alarm_set_time alarm_set_time
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:203
rtc_api_alarm_get_supported_fields alarm_get_supported_fields
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:198
rtc_api_alarm_get_time alarm_get_time
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:208
rtc_api_alarm_set_callback alarm_set_callback
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:218
rtc_api_update_set_callback update_set_callback
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:225
rtc_api_set_time set_time
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition rtc.h:190
rtc_api_get_time get_time
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition rtc.h:192
rtc_api_get_calibration get_calibration
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:237
rtc_api_alarm_is_pending alarm_is_pending
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:213
rtc_api_set_calibration set_calibration
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition rtc.h:232
Structure for storing date and time values with sub-second precision.
Definition rtc.h:62
int tm_yday
Day of the year [0, 365] (Unknown = -1).
Definition rtc.h:70
int tm_nsec
Nanoseconds [0, 999999999] (Unknown = 0).
Definition rtc.h:72
int tm_min
Minutes [0, 59].
Definition rtc.h:64
int tm_mon
Month [0, 11].
Definition rtc.h:67
int tm_isdst
Daylight saving time flag [-1] (Unknown = -1).
Definition rtc.h:71
int tm_wday
Day of the week [0, 6] (Sunday = 0) (Unknown = -1).
Definition rtc.h:69
int tm_year
Year - 1900.
Definition rtc.h:68
int tm_sec
Seconds [0, 59].
Definition rtc.h:63
int tm_hour
Hours [0, 23].
Definition rtc.h:65
int tm_mday
Day of the month [1, 31].
Definition rtc.h:66
Definition time.h:24