mirror of
https://github.com/meshtastic/firmware.git
synced 2026-08-01 02:48:49 -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>
130 lines
3.8 KiB
C++
130 lines
3.8 KiB
C++
#pragma once
|
|
|
|
#include "BluetoothStatus.h"
|
|
#include "GPSStatus.h"
|
|
#include "NodeStatus.h"
|
|
#include "PowerStatus.h"
|
|
#include "detect/ScanI2C.h"
|
|
#include "graphics/Screen.h"
|
|
#include "memGet.h"
|
|
#include "mesh/generated/meshtastic/config.pb.h"
|
|
#include "mesh/generated/meshtastic/telemetry.pb.h"
|
|
#include <SPI.h>
|
|
#include <map>
|
|
#if defined(ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !MESHTASTIC_EXCLUDE_BLUETOOTH
|
|
#include "nimble/NimbleBluetooth.h"
|
|
extern NimbleBluetooth *nimbleBluetooth;
|
|
#endif
|
|
#ifdef ARCH_NRF52
|
|
#include "NRF52Bluetooth.h"
|
|
extern NRF52Bluetooth *nrf52Bluetooth;
|
|
#endif
|
|
#ifdef ARCH_NRF54L15
|
|
#include "NRF54L15Bluetooth.h"
|
|
extern NRF54L15Bluetooth *nrf54l15Bluetooth;
|
|
#endif
|
|
#if !MESHTASTIC_EXCLUDE_I2C
|
|
#include "detect/ScanI2CTwoWire.h"
|
|
#endif
|
|
|
|
#if ARCH_PORTDUINO
|
|
extern HardwareSPI *DisplaySPI;
|
|
extern HardwareSPI *LoraSPI;
|
|
#endif
|
|
|
|
extern ScanI2C::DeviceAddress screen_found;
|
|
extern ScanI2C::DeviceAddress cardkb_found;
|
|
extern uint8_t kb_model;
|
|
extern bool kb_found;
|
|
extern bool osk_found;
|
|
extern ScanI2C::DeviceAddress rtc_found;
|
|
extern ScanI2C::DeviceAddress accelerometer_found;
|
|
extern ScanI2C::DeviceAddress magnetometer_found;
|
|
extern ScanI2C::FoundDevice rgb_found;
|
|
extern ScanI2C::DeviceAddress aqi_found;
|
|
|
|
extern bool eink_found;
|
|
extern bool pmu_found;
|
|
extern bool isUSBPowered;
|
|
|
|
#ifdef HAS_DRV2605
|
|
#include <Adafruit_DRV2605.h>
|
|
extern Adafruit_DRV2605 drv;
|
|
#endif
|
|
|
|
#ifdef HAS_PCA9557
|
|
#include <PCA9557.h>
|
|
extern PCA9557 io;
|
|
#endif
|
|
|
|
#ifdef HAS_I2S
|
|
#include "AudioThread.h"
|
|
extern AudioThread *audioThread;
|
|
#endif
|
|
|
|
#ifdef HAS_UDP_MULTICAST
|
|
#include "mesh/udp/UdpMulticastHandler.h"
|
|
extern UdpMulticastHandler *udpHandler;
|
|
#endif
|
|
|
|
// Global Screen singleton.
|
|
extern graphics::Screen *screen;
|
|
|
|
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C && !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
|
#include "motion/AccelerometerThread.h"
|
|
extern AccelerometerThread *accelerometerThread;
|
|
#endif
|
|
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C && !MESHTASTIC_EXCLUDE_MAGNETOMETER
|
|
#include "motion/MagnetometerThread.h"
|
|
extern MagnetometerThread *magnetometerThread;
|
|
#endif
|
|
|
|
extern bool isVibrating;
|
|
|
|
extern int TCPPort; // set by Portduino
|
|
|
|
// Return a human readable string of the form "Meshtastic_ab13"
|
|
const char *getDeviceName();
|
|
|
|
extern uint32_t timeLastPowered;
|
|
|
|
extern uint32_t rebootAtMsec;
|
|
extern uint32_t shutdownAtMsec;
|
|
extern bool suppressRebootBanner;
|
|
|
|
#if defined(MESHTASTIC_ENCRYPTED_STORAGE) && defined(MESHTASTIC_PHONEAPI_ACCESS_CONTROL)
|
|
// Set by PhoneAPI::handleLockdownAuthInline after a successful unlock.
|
|
// Serviced on the main loop thread because NodeDB::reloadFromDisk() is
|
|
// too heavy for the BLE/serial transport callback stack.
|
|
extern volatile bool lockdownReloadPending;
|
|
|
|
// Set by PhoneAPI::handleLockdownAuthInline on a disable request (after the
|
|
// passphrase is verified). Serviced on the main loop thread: decrypt every
|
|
// pref back to plaintext, remove the lockdown artifacts, reboot. Heavy file
|
|
// IO, same reason as lockdownReloadPending.
|
|
extern volatile bool lockdownDisablePending;
|
|
#endif
|
|
|
|
extern uint32_t serialSinceMsec;
|
|
|
|
// If a thread does something that might need for it to be rescheduled ASAP it can set this flag
|
|
// This will suppress the current delay and instead try to run ASAP.
|
|
extern bool runASAP;
|
|
|
|
extern bool pauseBluetoothLogging;
|
|
|
|
void nrf52Setup(), esp32Setup(), nrf52Loop(), esp32Loop(), rp2040Setup(), rp2040Loop(), clearBonds(), enterDfuMode(),
|
|
stm32wlSetup();
|
|
#ifdef ARCH_ESP32
|
|
void esp32ReleaseBluetoothMemoryIfUnused();
|
|
#endif
|
|
|
|
meshtastic_DeviceMetadata getDeviceMetadata();
|
|
#if !MESHTASTIC_EXCLUDE_I2C
|
|
void scannerToSensorsMap(const std::unique_ptr<ScanI2CTwoWire> &i2cScanner, ScanI2C::DeviceType deviceType,
|
|
meshtastic_TelemetrySensorType sensorType);
|
|
#endif
|
|
|
|
// We default to 4MHz SPI, SPI mode 0
|
|
extern SPISettings spiSettings;
|