/* * Copyright (c) 2015 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_RTC_H_ #define ZEPHYR_INCLUDE_RTC_H_ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** Number of RTC ticks in a second */ #define RTC_ALARM_SECOND (32768 / CONFIG_RTC_PRESCALER) /** Number of RTC ticks in a minute */ #define RTC_ALARM_MINUTE (RTC_ALARM_SECOND * 60) /** Number of RTC ticks in an hour */ #define RTC_ALARM_HOUR (RTC_ALARM_MINUTE * 60) /** Number of RTC ticks in a day */ #define RTC_ALARM_DAY (RTC_ALARM_HOUR * 24) typedef void (*rtc_callback_t)(struct device *dev); struct rtc_config { u32_t init_val; /*!< enable/disable alarm */ u8_t alarm_enable; /*!< initial configuration value for the 32bit RTC alarm value */ u32_t alarm_val; /*!< Pointer to function to call when alarm value * matches current RTC value */ rtc_callback_t cb_fn; }; typedef void (*rtc_api_enable)(struct device *dev); typedef void (*rtc_api_disable)(struct device *dev); typedef int (*rtc_api_set_config)(struct device *dev, struct rtc_config *config); typedef int (*rtc_api_set_alarm)(struct device *dev, const u32_t alarm_val); typedef u32_t (*rtc_api_read)(struct device *dev); typedef u32_t (*rtc_api_get_pending_int)(struct device *dev); struct rtc_driver_api { rtc_api_enable enable; rtc_api_disable disable; rtc_api_read read; rtc_api_set_config set_config; rtc_api_set_alarm set_alarm; rtc_api_get_pending_int get_pending_int; }; __deprecated __syscall u32_t rtc_read(struct device *dev); static inline u32_t z_impl_rtc_read(struct device *dev) { return counter_read(dev); } __deprecated __syscall void rtc_enable(struct device *dev); static inline void z_impl_rtc_enable(struct device *dev) { counter_start(dev); } __deprecated __syscall void rtc_disable(struct device *dev); static inline void z_impl_rtc_disable(struct device *dev) { counter_stop(dev); } static inline void rtc_counter_top_callback(struct device *dev, void *user_data) { rtc_callback_t cb_fn = (rtc_callback_t)user_data; if (cb_fn) { cb_fn(dev); } } __deprecated static inline int rtc_set_config(struct device *dev, struct rtc_config *cfg) { int err; if (cfg->init_val) { return -ENOTSUP; } err = counter_set_top_value(dev, cfg->alarm_val, rtc_counter_top_callback, cfg->cb_fn); if (err == 0 && cfg->alarm_enable != 0U) { err = counter_start(dev); } return err; } __deprecated __syscall int rtc_set_alarm(struct device *dev, const u32_t alarm_val); static inline int z_impl_rtc_set_alarm(struct device *dev, const u32_t alarm_val) { return counter_set_top_value(dev, alarm_val, rtc_counter_top_callback, counter_get_user_data(dev)); } /** * @brief Function to get pending interrupts * * The purpose of this function is to return the interrupt * status register for the device. * This is especially useful when waking up from * low power states to check the wake up source. * * @param dev Pointer to the device structure for the driver instance. * * @retval 1 if the rtc interrupt is pending. * @retval 0 if no rtc interrupt is pending. */ __deprecated __syscall int rtc_get_pending_int(struct device *dev); static inline int z_impl_rtc_get_pending_int(struct device *dev) { return counter_get_pending_int(dev); } #ifdef __cplusplus } #endif #include #endif