Add ESP32 internal-RTC rtc:: backend for the no-I2C-RTC boards
Replace the no-op rtc:: fallback on the four boards without an I2C calendar
RTC (sticks3/cardputer/tdeck on ESP32-S3, m5stack_gray on classic ESP32) with
a real backend over the SoC internal RTC.
- Time base is gettimeofday/settimeofday (RTC-timer-backed: survives deep sleep
and non-power-on resets), not a monotonic esp_timer count.
- clockTrust() reports Volatile once the clock is set and no cold-boot/
backward-jump is detected, else None (the internal equivalent of the BM8563
voltage-low flag): power-on reset (wakeCause Undefined), a backward time jump
beyond a drift margin, or a never-set clock all fail closed to None.
- The NVS seed (namespace "kleidos", key "rtc_epoch", written by the admin
portal) is read as the floor on boot and written on every set.
- setCountdownTimer/armAlarmWake compute delta = target - now, clamp to the
LP-timer range, and arm sleep::enableTimerWakeup (never 0/underflow); the
internal wake presents as WakeCause::Timer. Functions with no internal
equivalent (setAlarm/readAlarm/alarmTriggered/CLKOUT/...) return false.
Pure conversion/trust/wake logic lives in a host-testable header
(rtc_internal_clock.h) with a native-only injectable epoch seam mirroring
platform/Clock.h; the backend TU wires it to gettimeofday/settimeofday,
NvsStore and the sleep facade. rtc_hal.cpp is converted in place so exactly one
!HAS_BM8563_RTC definition of the rtc:: symbols exists (no ODR clash with the
BM8563 backend).
Claude-Session: https://claude.ai/code/session_01U878bNJtg9bCvAMM8CFKqS