blob: d3f69ade9d249b22bf819fbc53163f6e4978ba9e [file] [log] [blame]
/*
* Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _PICO_AON_TIMER_H
#define _PICO_AON_TIMER_H
#include "pico.h"
#include <time.h>
#include "pico/util/datetime.h"
#include "hardware/regs/intctrl.h"
/** \file pico/aon_timer.h
* \defgroup pico_aon_timer pico_aon_timer
*
* \brief High Level "Always on Timer" Abstraction
*
* \if rp2040_specific
* This library uses the RTC on RP2040.
* \endif
* \if rp2350_specific
* This library uses the RTC on RP2350.
* \endif
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* \def AON_TIMER_IRQ_NUM()
* \ingroup pico_aon_timer
* \hideinitializer
* \brief Returns the \ref irq_num_t for interrupts for the actual hardware backing the AON timer abstraction
*
* Note this macro is intended to resolve at compile time, and does no parameter checking
*/
#ifndef AON_TIMER_IRQ_NUM
#if HAS_RP2040_RTC
#define AON_TIMER_IRQ_NUM() RTC_IRQ
#elif HAS_POWMAN_TIMER
#define AON_TIMER_IRQ_NUM() POWMAN_IRQ_TIMER
#endif
#endif
typedef void (*aon_timer_alarm_handler_t)(void);
/**
* \brief Start the AON timer running using the result from the gettimeofday() function as the current time
* \ingroup pico_aon_timer
*/
void aon_timer_start_with_timeofday(void);
/**
* \brief Start the AON timer running using the specified timespec as the current time
* \ingroup pico_aon_timer
* \param ts the current time
*/
void aon_timer_start(const struct timespec *ts);
/**
* \brief Stop the AON timer
* \ingroup pico_aon_timer
*/
void aon_timer_stop(void);
/**
* \brief Update the current time of the AON timer
* \ingroup pico_aon_timer
* \param ts the new current time
*/
void aon_timer_set_time(const struct timespec *ts);
/**
* \brief Get the current time of the AON timer
* \ingroup pico_aon_timer
* \param ts out value for the current time
*/
void aon_timer_get_time(struct timespec *ts);
/**
* \brief Get the resolution of the AON timer
* \ingroup pico_aon_timer
* \param ts out value for the resolution of the AON timer
*/
void aon_timer_get_resolution(struct timespec *ts);
/**
* \brief Enable an AON timer alarm for a specifed time
* \ingroup pico_aon_timer
*
* \if rp2040_specific
* On RP2040 The alarm will not fire if it is in the past
* \endif
* \if rp2350_specific
* On RP2040 The alarm will fire if it is in the past
* \endif
*
* \param ts the alarm time
* \param handler a callback to call when the timer fires (may be NULL for wakeup_from_low_power = true)
* \param wakeup_from_low_power true if the AON timer is to be used to wake up from a DORMANT state
*/
aon_timer_alarm_handler_t aon_timer_enable_alarm(const struct timespec *ts, aon_timer_alarm_handler_t handler, bool wakeup_from_low_power);
/**
* \brief Disable the currently enabled AON timer alarm if any
* \ingroup pico_aon_timer
*/
void aon_timer_disable_alarm(void);
/**
* \brief Disable the currently enabled AON timer alarm if any
* \ingroup pico_aon_timer
* \return true if the AON timer is running
*/
bool aon_timer_is_running(void);
static inline uint aon_timer_get_irq_num(void) {
return AON_TIMER_IRQ_NUM();
}
#ifdef __cplusplus
}
#endif
#endif