Zephyr Project API 4.4.99
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
30
31#include <zephyr/kernel.h>
32#include <zephyr/device.h>
33#include <errno.h>
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
45#define RTC_ALARM_TIME_MASK_SECOND BIT(0)
46#define RTC_ALARM_TIME_MASK_MINUTE BIT(1)
47#define RTC_ALARM_TIME_MASK_HOUR BIT(2)
48#define RTC_ALARM_TIME_MASK_MONTHDAY BIT(3)
49#define RTC_ALARM_TIME_MASK_MONTH BIT(4)
50#define RTC_ALARM_TIME_MASK_YEAR BIT(5)
51#define RTC_ALARM_TIME_MASK_WEEKDAY BIT(6)
52#define RTC_ALARM_TIME_MASK_YEARDAY BIT(7)
53#define RTC_ALARM_TIME_MASK_NSEC BIT(8)
57
67struct rtc_time {
68 int tm_sec;
69 int tm_min;
70 int tm_hour;
71 int tm_mday;
72 int tm_mon;
73 int tm_year;
74 int tm_wday;
75 int tm_yday;
77 int tm_nsec;
78};
79
86typedef void (*rtc_update_callback)(const struct device *dev, void *user_data);
87
95typedef void (*rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data);
96
102
108typedef int (*rtc_api_set_time)(const struct device *dev, const struct rtc_time *timeptr);
109
115typedef int (*rtc_api_get_time)(const struct device *dev, struct rtc_time *timeptr);
116
122typedef int (*rtc_api_alarm_get_supported_fields)(const struct device *dev, uint16_t id,
123 uint16_t *mask);
124
130typedef int (*rtc_api_alarm_set_time)(const struct device *dev, uint16_t id, uint16_t mask,
131 const struct rtc_time *timeptr);
132
138typedef int (*rtc_api_alarm_get_time)(const struct device *dev, uint16_t id, uint16_t *mask,
139 struct rtc_time *timeptr);
140
146typedef int (*rtc_api_alarm_is_pending)(const struct device *dev, uint16_t id);
147
153typedef int (*rtc_api_alarm_set_callback)(const struct device *dev, uint16_t id,
154 rtc_alarm_callback callback, void *user_data);
155
161typedef int (*rtc_api_update_set_callback)(const struct device *dev,
162 rtc_update_callback callback, void *user_data);
163
169typedef int (*rtc_api_set_calibration)(const struct device *dev, int32_t calibration);
170
176typedef int (*rtc_api_get_calibration)(const struct device *dev, int32_t *calibration);
177
181__subsystem struct rtc_driver_api {
186#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
212#endif /* CONFIG_RTC_ALARM */
213#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
219#endif /* CONFIG_RTC_UPDATE */
220#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
231#endif /* CONFIG_RTC_CALIBRATION */
232};
233
235
246__syscall int rtc_set_time(const struct device *dev, const struct rtc_time *timeptr);
247
248static inline int z_impl_rtc_set_time(const struct device *dev, const struct rtc_time *timeptr)
249{
250 return DEVICE_API_GET(rtc, dev)->set_time(dev, timeptr);
251}
252
263__syscall int rtc_get_time(const struct device *dev, struct rtc_time *timeptr);
264
265static inline int z_impl_rtc_get_time(const struct device *dev, struct rtc_time *timeptr)
266{
267 return DEVICE_API_GET(rtc, dev)->get_time(dev, timeptr);
268}
269
274#if defined(CONFIG_RTC_ALARM) || defined(__DOXYGEN__)
275
290__syscall int rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
291 uint16_t *mask);
292
293static inline int z_impl_rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
294 uint16_t *mask)
295{
296 if (DEVICE_API_GET(rtc, dev)->alarm_get_supported_fields == NULL) {
297 return -ENOSYS;
298 }
299
300 return DEVICE_API_GET(rtc, dev)->alarm_get_supported_fields(dev, id, mask);
301}
302
326__syscall int rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
327 const struct rtc_time *timeptr);
328
329static inline int z_impl_rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
330 const struct rtc_time *timeptr)
331{
332 if (DEVICE_API_GET(rtc, dev)->alarm_set_time == NULL) {
333 return -ENOSYS;
334 }
335
336 return DEVICE_API_GET(rtc, dev)->alarm_set_time(dev, id, mask, timeptr);
337}
338
354__syscall int rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
355 struct rtc_time *timeptr);
356
357static inline int z_impl_rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
358 struct rtc_time *timeptr)
359{
360 if (DEVICE_API_GET(rtc, dev)->alarm_get_time == NULL) {
361 return -ENOSYS;
362 }
363
364 return DEVICE_API_GET(rtc, dev)->alarm_get_time(dev, id, mask, timeptr);
365}
366
382__syscall int rtc_alarm_is_pending(const struct device *dev, uint16_t id);
383
384static inline int z_impl_rtc_alarm_is_pending(const struct device *dev, uint16_t id)
385{
386 if (DEVICE_API_GET(rtc, dev)->alarm_is_pending == NULL) {
387 return -ENOSYS;
388 }
389
390 return DEVICE_API_GET(rtc, dev)->alarm_is_pending(dev, id);
391}
392
419static inline int rtc_alarm_set_callback(const struct device *dev, uint16_t id,
420 rtc_alarm_callback callback, void *user_data)
421{
422 if (DEVICE_API_GET(rtc, dev)->alarm_set_callback == NULL) {
423 return -ENOSYS;
424 }
425
426 return DEVICE_API_GET(rtc, dev)->alarm_set_callback(dev, id, callback, user_data);
427}
428
429#endif /* CONFIG_RTC_ALARM */
433
438#if defined(CONFIG_RTC_UPDATE) || defined(__DOXYGEN__)
439
459static inline int rtc_update_set_callback(const struct device *dev,
460 rtc_update_callback callback, void *user_data)
461{
462 if (DEVICE_API_GET(rtc, dev)->update_set_callback == NULL) {
463 return -ENOSYS;
464 }
465
466 return DEVICE_API_GET(rtc, dev)->update_set_callback(dev, callback, user_data);
467}
468
469#endif /* CONFIG_RTC_UPDATE */
473
478#if defined(CONFIG_RTC_CALIBRATION) || defined(__DOXYGEN__)
479
498__syscall int rtc_set_calibration(const struct device *dev, int32_t calibration);
499
500static inline int z_impl_rtc_set_calibration(const struct device *dev, int32_t calibration)
501{
502 if (DEVICE_API_GET(rtc, dev)->set_calibration == NULL) {
503 return -ENOSYS;
504 }
505
506 return DEVICE_API_GET(rtc, dev)->set_calibration(dev, calibration);
507}
508
519__syscall int rtc_get_calibration(const struct device *dev, int32_t *calibration);
520
521static inline int z_impl_rtc_get_calibration(const struct device *dev, int32_t *calibration)
522{
523 if (DEVICE_API_GET(rtc, dev)->get_calibration == NULL) {
524 return -ENOSYS;
525 }
526
527 return DEVICE_API_GET(rtc, dev)->get_calibration(dev, calibration);
528}
529
530#endif /* CONFIG_RTC_CALIBRATION */
534
539
543struct tm;
544
549static inline struct tm *rtc_time_to_tm(struct rtc_time *timeptr)
550{
551 return (struct tm *)timeptr;
552}
553
562{
563 __ASSERT_NO_MSG(frequency > 0);
564
565 return (int32_t)((1000000000000000000LL / frequency) - 1000000000);
566}
567
571
575
576#ifdef __cplusplus
577}
578#endif
579
580#include <zephyr/syscalls/rtc.h>
581
582#endif /* ZEPHYR_INCLUDE_DRIVERS_RTC_H_ */
APIs and macros for the Zephyr device model.
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1486
System error numbers.
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:459
int rtc_set_calibration(const struct device *dev, int32_t calibration)
API for setting RTC calibration.
int(* rtc_api_get_time)(const struct device *dev, struct rtc_time *timeptr)
Callback API to get RTC time.
Definition rtc.h:115
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_api_alarm_is_pending)(const struct device *dev, uint16_t id)
Callback API to test if RTC alarm is pending.
Definition rtc.h:146
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_api_get_calibration)(const struct device *dev, int32_t *calibration)
Callback API to get RTC calibration.
Definition rtc.h:176
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:130
int(* rtc_api_set_calibration)(const struct device *dev, int32_t calibration)
Callback API to set RTC calibration.
Definition rtc.h:169
void(* rtc_alarm_callback)(const struct device *dev, uint16_t id, void *user_data)
RTC alarm triggered callback.
Definition rtc.h:95
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:419
void(* rtc_update_callback)(const struct device *dev, void *user_data)
RTC update event callback.
Definition rtc.h:86
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:161
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:549
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:561
int(* rtc_api_set_time)(const struct device *dev, const struct rtc_time *timeptr)
@def_driverbackendgroup{RTC,rtc_interface}
Definition rtc.h:108
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:138
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:153
#define ENOSYS
Function not implemented.
Definition errno.h:83
#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:543
@driver_ops{RTC}
Definition rtc.h:181
rtc_api_alarm_set_time alarm_set_time
@driver_ops_optional API for setting RTC alarm time.
Definition rtc.h:196
rtc_api_alarm_get_supported_fields alarm_get_supported_fields
@driver_ops_optional API for getting the supported fields of the RTC alarm time.
Definition rtc.h:191
rtc_api_alarm_get_time alarm_get_time
@driver_ops_optional API for getting RTC alarm time.
Definition rtc.h:201
rtc_api_alarm_set_callback alarm_set_callback
@driver_ops_optional API for setting alarm callback.
Definition rtc.h:211
rtc_api_update_set_callback update_set_callback
@driver_ops_optional API for setting update callback.
Definition rtc.h:218
rtc_api_set_time set_time
@driver_ops_mandatory API for setting RTC time.
Definition rtc.h:183
rtc_api_get_time get_time
@driver_ops_mandatory API for getting RTC time.
Definition rtc.h:185
rtc_api_get_calibration get_calibration
@driver_ops_optional API for getting RTC calibration.
Definition rtc.h:230
rtc_api_alarm_is_pending alarm_is_pending
@driver_ops_optional API for testing if RTC alarm is pending.
Definition rtc.h:206
rtc_api_set_calibration set_calibration
@driver_ops_optional API for setting RTC calibration.
Definition rtc.h:225
Structure for storing date and time values with sub-second precision.
Definition rtc.h:67
int tm_yday
Day of the year [0, 365] (Unknown = -1).
Definition rtc.h:75
int tm_nsec
Nanoseconds [0, 999999999] (Unknown = 0).
Definition rtc.h:77
int tm_min
Minutes [0, 59].
Definition rtc.h:69
int tm_mon
Month [0, 11].
Definition rtc.h:72
int tm_isdst
Daylight saving time flag [-1] (Unknown = -1).
Definition rtc.h:76
int tm_wday
Day of the week [0, 6] (Sunday = 0) (Unknown = -1).
Definition rtc.h:74
int tm_year
Year - 1900.
Definition rtc.h:73
int tm_sec
Seconds [0, 59].
Definition rtc.h:68
int tm_hour
Hours [0, 23].
Definition rtc.h:70
int tm_mday
Day of the month [1, 31].
Definition rtc.h:71
Definition time.h:24