Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 58 additions & 2 deletions src/helpers/ESP32Board.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
#include <sys/time.h>
#include <Wire.h>
#include "driver/rtc_io.h"
#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(WAVESHARE_ESP32_C6_LP_BASELINE)
#include "esp_sleep.h"
#include "driver/gpio.h"
#endif

class ESP32Board : public mesh::MainBoard {
protected:
Expand All @@ -20,6 +24,13 @@ class ESP32Board : public mesh::MainBoard {
// for future use, sub-classes SHOULD call this from their begin()
startup_reason = BD_STARTUP_NORMAL;

#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(WAVESHARE_ESP32_C6_LP_BASELINE)
esp_sleep_wakeup_cause_t wakeup = esp_sleep_get_wakeup_cause();
if (wakeup == ESP_SLEEP_WAKEUP_EXT1 || wakeup == ESP_SLEEP_WAKEUP_GPIO) {
startup_reason = BD_STARTUP_RX_PACKET;
}
#endif

#ifdef ESP32_CPU_FREQ
setCpuFrequencyMhz(ESP32_CPU_FREQ);
#endif
Expand Down Expand Up @@ -60,20 +71,65 @@ class ESP32Board : public mesh::MainBoard {
#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(P_LORA_DIO_1) // Supported ESP32 variants
if (rtc_gpio_is_valid_gpio((gpio_num_t)P_LORA_DIO_1)) { // Only enter sleep mode if P_LORA_DIO_1 is RTC pin
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
esp_sleep_enable_ext1_wakeup((1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // To wake up when receiving a LoRa packet
esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // To wake up when receiving a LoRa packet

if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000); // To wake up every hour to do periodically jobs
esp_sleep_enable_timer_wakeup((uint64_t)secs * 1000000ULL); // To wake up every hour to do periodically jobs
}

esp_light_sleep_start(); // CPU enters light sleep
}
#elif defined(CONFIG_IDF_TARGET_ESP32C6) && defined(WAVESHARE_ESP32_C6_LP_BASELINE)
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);

#ifdef P_LORA_DIO_1
// Prefer EXT1 wake on LP/RTC GPIOs (0..7 on C6); fallback to digital GPIO wake.
if (esp_sleep_is_valid_wakeup_gpio((gpio_num_t)P_LORA_DIO_1)) {
esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH);
} else {
gpio_wakeup_enable((gpio_num_t)P_LORA_DIO_1, GPIO_INTR_HIGH_LEVEL);
esp_sleep_enable_gpio_wakeup(); // Wake up when receiving a LoRa IRQ pulse
}
#endif

if (secs > 0) {
esp_sleep_enable_timer_wakeup((uint64_t)secs * 1000000ULL); // Timer fallback wake
}

esp_light_sleep_start();
#endif
}

void enterDeepSleep(uint32_t secs) {
#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(WAVESHARE_ESP32_C6_LP_BASELINE)
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);

#ifdef P_LORA_DIO_1
// Deep sleep wake on C6 requires LP/RTC-capable GPIOs (0..7).
if (esp_sleep_is_valid_wakeup_gpio((gpio_num_t)P_LORA_DIO_1)) {
esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH);
}
#endif

if (secs > 0) {
esp_sleep_enable_timer_wakeup((uint64_t)secs * 1000000ULL);
}

esp_deep_sleep_start();
#endif
}

void sleep(uint32_t secs) override {
if (!inhibit_sleep) {
#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(WAVESHARE_ESP32_C6_LP_BASELINE)
#if defined(WAVESHARE_ESP32_C6_USE_DEEP_SLEEP) && (WAVESHARE_ESP32_C6_USE_DEEP_SLEEP == 1)
enterDeepSleep(secs);
#else
enterLightSleep(secs);
#endif
#else
enterLightSleep(secs); // To wake up after "secs" seconds or when receiving a LoRa packet
#endif
}
}

Expand Down