mirror of
https://github.com/google/pebble.git
synced 2025-05-22 03:14:52 +00:00
117 lines
4.2 KiB
C
117 lines
4.2 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "util/time/time.h"
|
|
|
|
typedef uint64_t RtcTicks;
|
|
|
|
#define RTC_TICKS_HZ (1024u)
|
|
|
|
//! Initialize the RTC driver at startup. Note that this runs very early in the startup process
|
|
//! and very few other systems will be running when this is called.
|
|
void rtc_init(void);
|
|
|
|
//! Calibrate the RTC driver using the given crystal frequency (in mHz).
|
|
//! This is a separate step because rtc_init needs to run incredibly early in the startup process
|
|
//! and the manufacturing registry won't be initialized yet.
|
|
void rtc_calibrate_frequency(uint32_t frequency);
|
|
|
|
//! Initialize any timers the RTC driver may need. This is a separate step than rtc_init because
|
|
//! rtc_init needs to run incredibly early in the startup process and at that time the timer
|
|
//! system won't be initialized yet.
|
|
void rtc_init_timers(void);
|
|
|
|
// RTC time
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//! We only support keeping time in the range of the year 2000 to the year 2037. Call this
|
|
//! function to adjust a given time into this range by simply clamping the year value back
|
|
//! into range without adjusting any of the other fields.
|
|
//! @return True if a change had to be made
|
|
bool rtc_sanitize_struct_tm(struct tm* t);
|
|
//! Wrapper for rtc_sanitize_struct_tmtime
|
|
bool rtc_sanitize_time_t(time_t* t);
|
|
|
|
//! Updates the current time.
|
|
//! We only support times with years between 2000 and 2037. Attempting to set times outside of this
|
|
//! range will result in an assert being tripped.
|
|
void rtc_set_time(time_t time);
|
|
time_t rtc_get_time(void);
|
|
|
|
// Wrappers for the above functions that take struct tm instead of time_t
|
|
void rtc_set_time_tm(struct tm* time_tm);
|
|
void rtc_get_time_tm(struct tm* time_tm);
|
|
|
|
// FIXME: PBL-41066 this should just return a uint64_t
|
|
//! @return millisecond port of the current second.
|
|
void rtc_get_time_ms(time_t* out_seconds, uint16_t* out_ms);
|
|
|
|
//! Saves the timezone_info to RTC registers
|
|
void rtc_set_timezone(TimezoneInfo *tzinfo);
|
|
|
|
//! Returns timezone_info from RTC registers
|
|
void rtc_get_timezone(TimezoneInfo *tzinfo);
|
|
|
|
//! Returns timezone region id from RTC registers
|
|
uint16_t rtc_get_timezone_id(void);
|
|
|
|
//! Returns if the system has timezone set, RTC in UTC mode
|
|
bool rtc_is_timezone_set(void);
|
|
|
|
#define TIME_STRING_BUFFER_SIZE 26
|
|
|
|
//! @param buffer Buffer used to write the string into. Must be at least TIME_STRING_BUFFER_SIZE
|
|
const char* rtc_get_time_string(char* buffer);
|
|
|
|
|
|
// RTC ticks
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//! @return Absolute number of ticks since system start.
|
|
RtcTicks rtc_get_ticks(void);
|
|
|
|
|
|
// RTC Alarm
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//! Initializes the RTC alarm functionality. We use this for waking us out of stop mode.
|
|
void rtc_alarm_init(void);
|
|
|
|
//! Set the alarm to go off num_ticks from now.
|
|
void rtc_alarm_set(RtcTicks num_ticks);
|
|
|
|
//! Clear the timezone registers (as part of factory reset)
|
|
void rtc_timezone_clear(void);
|
|
|
|
//! @return the number of ticks that have elapsed since rtc_alarm_set was last called.
|
|
RtcTicks rtc_alarm_get_elapsed_ticks(void);
|
|
|
|
//! @return True if the RTC alarm functionality has been initialized. This can be used to prevent
|
|
//! us from going into stop mode before we're ready to wake up from it.
|
|
bool rtc_alarm_is_initialized(void);
|
|
|
|
|
|
// Utility Functions
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//! @param buffer Buffer used to write the string into. Must be at least TIME_STRING_BUFFER_SIZE
|
|
const char* time_t_to_string(char* buffer, time_t t);
|
|
|