mirror of
https://github.com/meshtastic/firmware.git
synced 2026-09-20 05:18:54 -04:00
* stm32wl: add hardware RTC support infrastructure Wires the STM32WL chip's internal RTC (running off the LSE 32.768kHz crystal) into meshtastic's existing time-of-day framework (perhapsSetRTC()/readFromRTC()), following the same pattern already used for I2C RTC chips (RV3028, PCF8563/85063, RX8130CE). LSE is started and polled manually before ever calling into the STM32RTC library, with our own bounded timeout - the library's own internal LSE startup path has no bounded fallback and hangs forever via Error_Handler() if the crystal never locks, so this is required for a board with a missing/faulty crystal to boot normally rather than hang. Gated behind a new HAS_LSE variant flag (currently unset everywhere, so this is inert until a variant opts in - see follow-up commit). Signed-off-by: Andrew Yong <me@ndoo.sg> Assisted-by: Claude Sonnet 5 <noreply@anthropic.com> * gps: qualify RTC.h includes to avoid case-insensitive filesystem collision with STM32RTC The stm32duino STM32RTC library (added to lib_deps in a follow-up commit) ships its own src/rtc.h. On case-insensitive filesystems (the macOS default), an unqualified #include "RTC.h"/<RTC.h> from any file outside src/gps/ resolves to the library's rtc.h instead of src/gps/RTC.h, since PlatformIO's LDF puts lib_deps include paths ahead of the project's own -Isrc/gps. Qualify every include as gps/RTC.h so it can't collide with any same-named header a future dependency might ship, regardless of filesystem case sensitivity. Purely mechanical, no behavior change. Signed-off-by: Andrew Yong <me@ndoo.sg> Assisted-by: Claude Sonnet 5 <noreply@anthropic.com> * stm32wl(rak3172): enable hardware RTC support Opts rak3172 into the HAS_LSE infrastructure added previously: sets STM32WL_LSE_DRIVE to a conservative default and pulls in the STM32RTC library. rak3172 has ~63KB flash headroom going in; build-verified at 76.7% flash usage after this change (up from a 73.8% baseline), well within budget. wio-e5 is not opted in here despite sharing the same STM32WLE5 chip - it's already at 96.8% flash usage today (GPS + I2C sensor support compiled in, unlike rak3172), leaving too little headroom to safely add STM32RTC without first trimming something else. Signed-off-by: Andrew Yong <me@ndoo.sg> Assisted-by: Claude Sonnet 5 <noreply@anthropic.com> * stm32wl: add docstrings for LSE/RTC setup functions Addresses CodeRabbit's docstring coverage check on PR #10961. Signed-off-by: Andrew Yong <me@ndoo.sg> Assisted-by: Claude Sonnet 5 <noreply@anthropic.com> * stm32wl: address CodeRabbit nitpicks on PR #10961 - Brace the single-statement HAS_LSE branch in perhapsSetRTC() to match the sibling readFromRTC() branch's style. - Quote the RTC.h include in PhoneAPI.cpp for consistency with every other qualified include site. Signed-off-by: Andrew Yong <me@ndoo.sg> Assisted-by: Claude Sonnet 5 <noreply@anthropic.com> --------- Signed-off-by: Andrew Yong <me@ndoo.sg> Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
78 lines
2.3 KiB
C
78 lines
2.3 KiB
C
#pragma once
|
|
|
|
#include "configuration.h"
|
|
#include "sys/time.h"
|
|
#include <Arduino.h>
|
|
|
|
#ifdef RX8130CE_RTC
|
|
#include <ArtronShop_RX8130CE.h>
|
|
#endif
|
|
|
|
#if HAS_LSE
|
|
// True once the STM32WL LSE crystal has locked and the hardware RTC is running (see stm32wlSetup()).
|
|
bool stm32wlRtcAvailable();
|
|
#endif
|
|
|
|
enum RTCQuality {
|
|
|
|
/// We haven't had our RTC set yet
|
|
RTCQualityNone = 0,
|
|
|
|
/// We got time from an onboard peripheral after boot.
|
|
RTCQualityDevice = 1,
|
|
|
|
/// Some other node gave us a time we can use
|
|
RTCQualityFromNet = 2,
|
|
|
|
/// Our time is based on NTP
|
|
RTCQualityNTP = 3,
|
|
|
|
/// Our time is based on our own GPS
|
|
RTCQualityGPS = 4
|
|
};
|
|
|
|
/// The RTC set result codes
|
|
/// Used to indicate the result of an attempt to set the RTC.
|
|
enum RTCSetResult {
|
|
RTCSetResultNotSet = 0, ///< RTC was set successfully
|
|
RTCSetResultSuccess = 1, ///< RTC was set successfully
|
|
RTCSetResultInvalidTime = 3, ///< The provided time was invalid (e.g., before the build epoch)
|
|
RTCSetResultError = 4 ///< An error occurred while setting the RTC
|
|
};
|
|
|
|
RTCQuality getRTCQuality();
|
|
|
|
extern uint32_t lastSetFromPhoneNtpOrGps;
|
|
|
|
/// If we haven't yet set our RTC this boot, set it from a GPS derived time
|
|
RTCSetResult perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpdate = false);
|
|
RTCSetResult perhapsSetRTC(RTCQuality q, const struct tm &t);
|
|
|
|
/// Return a string name for the quality
|
|
const char *RtcName(RTCQuality quality);
|
|
|
|
/// Return time since 1970 in secs. While quality is RTCQualityNone we will be returning time based at zero
|
|
uint32_t getTime(bool local = false);
|
|
|
|
/// Return time since 1970 in secs. If quality is RTCQualityNone return zero
|
|
uint32_t getValidTime(RTCQuality minQuality, bool local = false);
|
|
|
|
RTCSetResult readFromRTC();
|
|
|
|
#ifdef PIO_UNIT_TESTING
|
|
void setBootRelativeTimeForUnitTest(uint32_t secondsSinceBoot);
|
|
void resetRTCStateForTests();
|
|
void setRTCSystemTimeForTests(const struct timeval *tv);
|
|
void clearRTCSystemTimeForTests();
|
|
void setReadFromRTCUseSystemTimeForTests(bool enabled);
|
|
#endif
|
|
|
|
time_t gm_mktime(const struct tm *tm);
|
|
|
|
#define SEC_PER_DAY 86400
|
|
#define SEC_PER_HOUR 3600
|
|
#define SEC_PER_MIN 60
|
|
#ifdef BUILD_EPOCH
|
|
static constexpr uint64_t FORTY_YEARS = (40ULL * 365 * SEC_PER_DAY); // Use 64-bit arithmetic to prevent overflow
|
|
#endif
|