diff --git a/src/MeshCore.h b/src/MeshCore.h index 8fd653dd..eb1ebdc4 100644 --- a/src/MeshCore.h +++ b/src/MeshCore.h @@ -149,6 +149,7 @@ public: // internally bounded operations can use this while retaining their own // timeout. Boards without an explicit watchdog need no implementation. virtual void serviceWatchdog() { /* no op */ } + virtual void enterDeepSleep(uint32_t secs) { (void)secs; } // Called by example setup() functions to signal that boot is complete. // Boards may override to stop a boot-indicator LED sequence or similar. // Default no-op: boards that don't care need not implement anything. diff --git a/src/helpers/ESP32Board.cpp b/src/helpers/ESP32Board.cpp index b58847da..fea90c19 100644 --- a/src/helpers/ESP32Board.cpp +++ b/src/helpers/ESP32Board.cpp @@ -1119,11 +1119,7 @@ bool ESP32Board::otaFromManifest(const char* current_ver, bool dry_run, char rep } #endif // WITH_MQTT_BRIDGE -void ESP32Board::powerOff() { - enterDeepSleep(0); // Do not wakeup -} - -void ESP32Board::enterDeepSleep(uint32_t secs) { +void ESP32Board::shutdownPeripherals() { // Power off the display if any #ifdef DISPLAY_CLASS display.turnOff(); @@ -1155,6 +1151,14 @@ void ESP32Board::enterDeepSleep(uint32_t secs) { Serial.flush(); #endif delay(100); +} + +void ESP32Board::powerOff() { + enterDeepSleep(0); // Do not wakeup +} + +void ESP32Board::enterDeepSleep(uint32_t secs) { + shutdownPeripherals(); // Clear stale wakeup sources to avoid ghost wakeup // This is required when Power Management and automatic lightsleep are enabled diff --git a/src/helpers/ESP32Board.h b/src/helpers/ESP32Board.h index 1f10d6dc..68282123 100644 --- a/src/helpers/ESP32Board.h +++ b/src/helpers/ESP32Board.h @@ -88,8 +88,9 @@ public: return raw / 4; } + virtual void shutdownPeripherals(); virtual void powerOff() override; - void enterDeepSleep(uint32_t secs); + virtual void enterDeepSleep(uint32_t secs) override; uint32_t getIRQGpio() override { #ifdef P_LORA_DIO_1 diff --git a/src/helpers/NRF52Board.cpp b/src/helpers/NRF52Board.cpp index 781ec55a..352b3f0f 100644 --- a/src/helpers/NRF52Board.cpp +++ b/src/helpers/NRF52Board.cpp @@ -596,6 +596,29 @@ void NRF52Board::powerOff() { } } +void NRF52Board::enterDeepSleep(uint32_t secs) { + if (secs == 0) { + powerOff(); // Not wake up + } else { + shutdownPeripherals(); + +// Clear FPU interrupt flags to avoid insomnia +// see errata 87 for details +// https://docs.nordicsemi.com/bundle/errata_nRF52840_Rev3/page/ERR/nRF52840/Rev3/latest/anomaly_840_87.html +#if (__FPU_USED == 1) + __set_FPSCR(__get_FPSCR() & ~(0x0000009F)); + (void)__get_FPSCR(); + NVIC_ClearPendingIRQ(FPU_IRQn); +#endif + + // Attemp to sleep + vTaskDelay(pdMS_TO_TICKS(secs * 1000)); + + // Reboot for a fresh recovery + reboot(); + } +} + bool NRF52Board::getBootloaderVersion(char* out, size_t max_len) { if (!out || max_len == 0u) return false; out[0] = 0; diff --git a/src/helpers/NRF52Board.h b/src/helpers/NRF52Board.h index 5ec928f0..91e2b06c 100644 --- a/src/helpers/NRF52Board.h +++ b/src/helpers/NRF52Board.h @@ -68,6 +68,7 @@ public: bool rebootToUf2Bootloader() override; virtual void shutdownPeripherals(); virtual void powerOff() override; + virtual void enterDeepSleep(uint32_t secs) override; virtual bool getBootloaderVersion(char* version, size_t max_len) override; virtual bool startOTAUpdate(const char *id, char reply[], bool force_ap = false) override; virtual bool stopOTAUpdate(char reply[]) override; diff --git a/variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h b/variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h index 0b0f701c..82034c7e 100644 --- a/variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h +++ b/variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h @@ -43,11 +43,11 @@ public: } #endif - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + uint32_t button_pin = PIN_BUTTON1; nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); - NRF52Board::powerOff(); } - }; diff --git a/variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h b/variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h index 66c77099..a3d738ca 100644 --- a/variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h +++ b/variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h @@ -43,11 +43,11 @@ public: } #endif - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + uint32_t button_pin = PIN_BUTTON1; nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); - NRF52Board::powerOff(); } - }; diff --git a/variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h b/variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h index 39b55911..f179cdc7 100644 --- a/variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h +++ b/variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h @@ -43,11 +43,11 @@ public: } #endif - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + uint32_t button_pin = PIN_BUTTON1; nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); - NRF52Board::powerOff(); } - }; diff --git a/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h index 805ca67f..d8fcb2bb 100644 --- a/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h +++ b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h @@ -34,11 +34,11 @@ public: } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + uint32_t button_pin = PIN_BUTTON1; nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); - NRF52Board::powerOff(); } - }; diff --git a/variants/heltec_rc32/HeltecRC32Board.h b/variants/heltec_rc32/HeltecRC32Board.h index 837126a0..624935b9 100644 --- a/variants/heltec_rc32/HeltecRC32Board.h +++ b/variants/heltec_rc32/HeltecRC32Board.h @@ -22,7 +22,6 @@ public: void onBootComplete() override; void onBeforeTransmit() override; void onAfterTransmit() override; - void powerOff() override; uint16_t getBattMilliVolts() override; bool setAdcMultiplier(float multiplier) override; float getAdcMultiplier() const override { return adc_mult; } diff --git a/variants/heltec_t096/T096Board.cpp b/variants/heltec_t096/T096Board.cpp index 4aa2bbc4..2499dcd1 100644 --- a/variants/heltec_t096/T096Board.cpp +++ b/variants/heltec_t096/T096Board.cpp @@ -111,10 +111,11 @@ void T096Board::variant_shutdown() { nrf_gpio_cfg_default(PIN_GPS_TX); } -void T096Board::powerOff() { +void T096Board::shutdownPeripherals() { + NRF52Board::shutdownPeripherals(); + loRaFEMControl.setSleepModeEnable(); nrf_gpio_cfg_default(PIN_GPS_EN); // 363uA down to 39uA - NRF52Board::powerOff(); } const char* T096Board::getManufacturerName() const { diff --git a/variants/heltec_t096/T096Board.h b/variants/heltec_t096/T096Board.h index 31f8c957..4a1ea1c2 100644 --- a/variants/heltec_t096/T096Board.h +++ b/variants/heltec_t096/T096Board.h @@ -29,7 +29,7 @@ public: void onAfterTransmit(void) override; uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override ; - void powerOff() override; + void shutdownPeripherals() override; bool setLoRaFemLnaEnabled(bool enable) override; bool canControlLoRaFemLna() const override; bool isLoRaFemLnaEnabled() const override; diff --git a/variants/heltec_t1/T1Board.cpp b/variants/heltec_t1/T1Board.cpp index 1ef5b766..a54b8eae 100644 --- a/variants/heltec_t1/T1Board.cpp +++ b/variants/heltec_t1/T1Board.cpp @@ -97,9 +97,10 @@ void T1Board::variant_shutdown() { digitalWrite(PIN_BAT_CTL, !ADC_CTRL_ENABLED); } -void T1Board::powerOff() { +void T1Board::shutdownPeripherals() { + NRF52Board::shutdownPeripherals(); + variant_shutdown(); - NRF52Board::powerOff(); } const char* T1Board::getManufacturerName() const { diff --git a/variants/heltec_t1/T1Board.h b/variants/heltec_t1/T1Board.h index 9b46fd11..3e9afd1b 100644 --- a/variants/heltec_t1/T1Board.h +++ b/variants/heltec_t1/T1Board.h @@ -22,5 +22,5 @@ public: void onAfterTransmit() override; uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override; - void powerOff() override; + void shutdownPeripherals() override; }; diff --git a/variants/heltec_t114/T114Board.h b/variants/heltec_t114/T114Board.h index bd76d3de..6d7664cb 100644 --- a/variants/heltec_t114/T114Board.h +++ b/variants/heltec_t114/T114Board.h @@ -46,11 +46,11 @@ public: return "Heltec T114"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + #ifdef LED_PIN digitalWrite(LED_PIN, HIGH); #endif - - NRF52Board::powerOff(); } }; diff --git a/variants/heltec_tower_v2/HeltecTowerV2Board.cpp b/variants/heltec_tower_v2/HeltecTowerV2Board.cpp index 5802ffe9..16a7bd94 100644 --- a/variants/heltec_tower_v2/HeltecTowerV2Board.cpp +++ b/variants/heltec_tower_v2/HeltecTowerV2Board.cpp @@ -93,6 +93,12 @@ void HeltecTowerV2Board::powerOff() { #ifdef NRF52_POWER_MANAGEMENT initiateShutdown(SHUTDOWN_REASON_USER); #else + sd_power_system_off(); +#endif +} + +void HeltecTowerV2Board::shutdownPeripherals() { + NRF52Board::shutdownPeripherals(); pinMode(PIN_GPS_EN, OUTPUT); digitalWrite(PIN_GPS_EN, !PIN_GPS_EN_ACTIVE); pinMode(PIN_GPS_STANDBY, OUTPUT); @@ -103,6 +109,4 @@ void HeltecTowerV2Board::powerOff() { pinMode(PIN_BAT_CTL, OUTPUT); digitalWrite(PIN_BAT_CTL, LOW); variant_shutdown(); - sd_power_system_off(); -#endif } diff --git a/variants/heltec_tower_v2/HeltecTowerV2Board.h b/variants/heltec_tower_v2/HeltecTowerV2Board.h index 6912acde..d6cc85ef 100644 --- a/variants/heltec_tower_v2/HeltecTowerV2Board.h +++ b/variants/heltec_tower_v2/HeltecTowerV2Board.h @@ -21,4 +21,5 @@ public: uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override; void powerOff() override; + void shutdownPeripherals() override; }; diff --git a/variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp b/variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp index 4fe6d6a4..7716af97 100644 --- a/variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp +++ b/variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp @@ -35,7 +35,8 @@ void HeltecTrackerV2Board::begin() { loRaFEMControl.setRxModeEnable(); } - void HeltecTrackerV2Board::powerOff() { + void HeltecTrackerV2Board::shutdownPeripherals() { + ESP32Board::shutdownPeripherals(); // Turn off PA. Guarded because this board file is also compiled for the // heltec_tracker_v1_1 envs, which do not define P_LORA_PA_POWER (it is set // only in variants/heltec_tracker_v2/platformio.ini). Same guard idiom @@ -44,8 +45,6 @@ void HeltecTrackerV2Board::begin() { digitalWrite(P_LORA_PA_POWER, LOW); rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER); #endif - - ESP32Board::powerOff(); } uint16_t HeltecTrackerV2Board::getBattMilliVolts() { diff --git a/variants/heltec_tracker_v2/HeltecTrackerV2Board.h b/variants/heltec_tracker_v2/HeltecTrackerV2Board.h index 31f4cf04..7f00b30c 100644 --- a/variants/heltec_tracker_v2/HeltecTrackerV2Board.h +++ b/variants/heltec_tracker_v2/HeltecTrackerV2Board.h @@ -20,7 +20,7 @@ public: void onBeforeTransmit(void) override; void onAfterTransmit(void) override; - void powerOff() override; + void shutdownPeripherals() override; uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override ; bool setLoRaFemLnaEnabled(bool enable) override; diff --git a/variants/heltec_v4/HeltecV4Board.cpp b/variants/heltec_v4/HeltecV4Board.cpp index 853569d3..77300d8a 100644 --- a/variants/heltec_v4/HeltecV4Board.cpp +++ b/variants/heltec_v4/HeltecV4Board.cpp @@ -32,12 +32,12 @@ void HeltecV4Board::begin() { loRaFEMControl.setRxModeEnable(); } - void HeltecV4Board::powerOff() { + void HeltecV4Board::shutdownPeripherals() { + ESP32Board::shutdownPeripherals(); + // Turn off PA digitalWrite(P_LORA_PA_POWER, LOW); rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER); - - ESP32Board::powerOff(); } uint16_t HeltecV4Board::getBattMilliVolts() { diff --git a/variants/heltec_v4/HeltecV4Board.h b/variants/heltec_v4/HeltecV4Board.h index c1468d28..93f90977 100644 --- a/variants/heltec_v4/HeltecV4Board.h +++ b/variants/heltec_v4/HeltecV4Board.h @@ -26,7 +26,7 @@ public: void onBeforeTransmit(void) override; void onAfterTransmit(void) override; - void powerOff() override; + void shutdownPeripherals() override; bool setLoRaFemLnaEnabled(bool enable) override; bool canControlLoRaFemLna() const override; bool isLoRaFemLnaEnabled() const override; diff --git a/variants/heltec_v4_r8/HeltecV4R8Board.cpp b/variants/heltec_v4_r8/HeltecV4R8Board.cpp index 132def70..5ad27606 100644 --- a/variants/heltec_v4_r8/HeltecV4R8Board.cpp +++ b/variants/heltec_v4_r8/HeltecV4R8Board.cpp @@ -46,11 +46,15 @@ void HeltecV4R8Board::onAfterTransmit(void) { } void HeltecV4R8Board::powerOff() { + ESP32Board::powerOff(); +} + +void HeltecV4R8Board::shutdownPeripherals() { + ESP32Board::shutdownPeripherals(); loRaFEMControl.setSleepModeEnable(); digitalWrite(P_LORA_PA_POWER, LOW); rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER); periph_power.release(); // Drop the permanent antenna-boost/VEXT claim from begin(). - ESP32Board::powerOff(); } uint16_t HeltecV4R8Board::getBattMilliVolts() { diff --git a/variants/heltec_v4_r8/HeltecV4R8Board.h b/variants/heltec_v4_r8/HeltecV4R8Board.h index 0fc90f3b..555a4a2d 100644 --- a/variants/heltec_v4_r8/HeltecV4R8Board.h +++ b/variants/heltec_v4_r8/HeltecV4R8Board.h @@ -28,6 +28,7 @@ public: void onBeforeTransmit(void) override; void onAfterTransmit(void) override; void powerOff() override; + void shutdownPeripherals() override; bool setLoRaFemLnaEnabled(bool enable) override; bool canControlLoRaFemLna() const override; bool isLoRaFemLnaEnabled() const override; diff --git a/variants/lilygo_tbeam_1w/TBeam1WBoard.cpp b/variants/lilygo_tbeam_1w/TBeam1WBoard.cpp index 477be994..8020617d 100644 --- a/variants/lilygo_tbeam_1w/TBeam1WBoard.cpp +++ b/variants/lilygo_tbeam_1w/TBeam1WBoard.cpp @@ -130,6 +130,11 @@ const char* TBeam1WBoard::getManufacturerName() const { } void TBeam1WBoard::powerOff() { + ESP32Board::powerOff(); +} + +void TBeam1WBoard::shutdownPeripherals() { + ESP32Board::shutdownPeripherals(); portENTER_CRITICAL(&_fan_mux); _stopped = true; _tx_active = false; @@ -145,8 +150,7 @@ void TBeam1WBoard::powerOff() { radio_powered = false; digitalWrite(LED_PIN, LOW); - - ESP32Board::powerOff(); + digitalWrite(FAN_CTRL_PIN, LOW); } void TBeam1WBoard::attachRadioDriver(CustomSX1262Wrapper* driver) { diff --git a/variants/lilygo_tbeam_1w/TBeam1WBoard.h b/variants/lilygo_tbeam_1w/TBeam1WBoard.h index 390711ac..9bd1574f 100644 --- a/variants/lilygo_tbeam_1w/TBeam1WBoard.h +++ b/variants/lilygo_tbeam_1w/TBeam1WBoard.h @@ -76,6 +76,7 @@ public: uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override; void powerOff() override; + void shutdownPeripherals() override; void powerCycleRadio(); bool supportsRadioHardReset() const override { return true; } bool resetRadio() override { diff --git a/variants/meshtiny/MeshtinyBoard.h b/variants/meshtiny/MeshtinyBoard.h index 67a521fe..ba42d673 100644 --- a/variants/meshtiny/MeshtinyBoard.h +++ b/variants/meshtiny/MeshtinyBoard.h @@ -34,7 +34,8 @@ public: void reboot() override { NVIC_SystemReset(); } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); #ifdef PIN_USER_BTN while (digitalRead(PIN_USER_BTN) == LOW) { @@ -59,8 +60,5 @@ public: #ifdef PIN_USER_BTN nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); #endif - - NRF52Board::powerOff(); } - }; diff --git a/variants/meshtracker_x1/MeshTrackerX1Board.h b/variants/meshtracker_x1/MeshTrackerX1Board.h index 51f022e0..e153dd7f 100644 --- a/variants/meshtracker_x1/MeshTrackerX1Board.h +++ b/variants/meshtracker_x1/MeshTrackerX1Board.h @@ -46,7 +46,9 @@ public: return 0; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + #ifdef HAS_GPS digitalWrite(GPS_VRTC_EN, LOW); digitalWrite(GPS_RESET, LOW); @@ -81,7 +83,5 @@ public: #ifdef BUTTON_PIN nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); #endif - - sd_power_system_off(); } }; diff --git a/variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h b/variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h index 450a3d13..e4bbc7d0 100644 --- a/variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h +++ b/variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h @@ -45,7 +45,9 @@ public: return "Minewsemi"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + #ifdef HAS_GPS digitalWrite(GPS_VRTC_EN, LOW); digitalWrite(GPS_RESET, LOW); @@ -65,7 +67,6 @@ public: #ifdef BUTTON_PIN nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); #endif - NRF52Board::powerOff(); } #if defined(P_LORA_TX_LED) diff --git a/variants/nano_g2_ultra/nano-g2.h b/variants/nano_g2_ultra/nano-g2.h index bf9543b0..8e5875c4 100644 --- a/variants/nano_g2_ultra/nano-g2.h +++ b/variants/nano_g2_ultra/nano-g2.h @@ -43,7 +43,9 @@ public: const char *getManufacturerName() const override { return "Nano G2 Ultra"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + // put GPS chip to sleep digitalWrite(PIN_GPS_STANDBY, LOW); // TODO: unset buzzer to prevent notification circuit activating on hibernate @@ -51,7 +53,5 @@ public: nrf_gpio_cfg_sense_input(digitalPinToInterrupt(PIN_USER_BTN), NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW); - - NRF52Board::powerOff(); } }; diff --git a/variants/rak_wismesh_tag/RAKWismeshTagBoard.h b/variants/rak_wismesh_tag/RAKWismeshTagBoard.h index daa90d74..9368d17e 100644 --- a/variants/rak_wismesh_tag/RAKWismeshTagBoard.h +++ b/variants/rak_wismesh_tag/RAKWismeshTagBoard.h @@ -40,7 +40,9 @@ public: return "RAK WisMesh Tag"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + #ifdef BUZZER_EN digitalWrite(BUZZER_EN, LOW); #endif @@ -68,7 +70,5 @@ public: // configure button press to wake up when in powered off state nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); #endif - - NRF52Board::powerOff(); } }; diff --git a/variants/sensecap_solar/SenseCapSolarBoard.h b/variants/sensecap_solar/SenseCapSolarBoard.h index b4676d3a..8bf65c90 100644 --- a/variants/sensecap_solar/SenseCapSolarBoard.h +++ b/variants/sensecap_solar/SenseCapSolarBoard.h @@ -37,7 +37,9 @@ public: return "Seeed SenseCap Solar"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + digitalWrite(LED_WHITE, LOW); digitalWrite(LED_BLUE, LOW); @@ -50,6 +52,10 @@ public: // Keep pull-up enabled in system-off so the wake line doesn't float low. nrf_gpio_cfg_sense_input(digitalPinToInterrupt(g_ADigitalPinMap[PIN_BUTTON1]), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); #endif + } + + void powerOff() override { + shutdownPeripherals(); #ifdef NRF52_POWER_MANAGEMENT shutdownPeripherals(); diff --git a/variants/station_g3_esp32/StationG3Board.cpp b/variants/station_g3_esp32/StationG3Board.cpp index 7daabf18..dae0f26b 100644 --- a/variants/station_g3_esp32/StationG3Board.cpp +++ b/variants/station_g3_esp32/StationG3Board.cpp @@ -1,6 +1,8 @@ #include "StationG3Board.h" -void StationG3Board::powerOff() { +void StationG3Board::shutdownPeripherals() { + ESP32Board::shutdownPeripherals(); + loRaFEMControl.setSleepModeEnable(); #ifdef P_PA1_EN rtc_gpio_hold_en((gpio_num_t)P_PA1_EN); @@ -9,8 +11,6 @@ void StationG3Board::powerOff() { #ifdef P_PRIMARY_LNA_EN rtc_gpio_hold_en((gpio_num_t)P_PRIMARY_LNA_EN); #endif - - ESP32Board::powerOff(); } bool StationG3Board::setLoRaFemLnaEnabled(bool enable) { diff --git a/variants/station_g3_esp32/StationG3Board.h b/variants/station_g3_esp32/StationG3Board.h index 82ac18d5..84f978e2 100644 --- a/variants/station_g3_esp32/StationG3Board.h +++ b/variants/station_g3_esp32/StationG3Board.h @@ -56,7 +56,7 @@ public: bool canControlLoRaFemPaGain() const override; bool isLoRaFemPaGainEnabled() const override; - void powerOff() override; + void shutdownPeripherals() override; uint16_t getBattMilliVolts() override { return 0; diff --git a/variants/t1000-e/T1000eBoard.h b/variants/t1000-e/T1000eBoard.h index 1111d3c4..84021fac 100644 --- a/variants/t1000-e/T1000eBoard.h +++ b/variants/t1000-e/T1000eBoard.h @@ -49,7 +49,9 @@ public: return 0; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + #ifdef HAS_GPS digitalWrite(GPS_VRTC_EN, LOW); digitalWrite(GPS_RESET, LOW); @@ -87,7 +89,5 @@ public: #ifdef BUTTON_PIN nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH); #endif - - NRF52Board::powerOff(); } }; diff --git a/variants/thinknode_m1/ThinkNodeM1Board.h b/variants/thinknode_m1/ThinkNodeM1Board.h index 94224d9c..e5af3690 100644 --- a/variants/thinknode_m1/ThinkNodeM1Board.h +++ b/variants/thinknode_m1/ThinkNodeM1Board.h @@ -32,14 +32,12 @@ public: return "Elecrow ThinkNode-M1"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); // turn off all leds, sd_power_system_off will not do this for us #ifdef P_LORA_TX_LED digitalWrite(P_LORA_TX_LED, LOW); #endif - - // power off board - NRF52Board::powerOff(); } }; diff --git a/variants/thinknode_m3/ThinkNodeM3Board.h b/variants/thinknode_m3/ThinkNodeM3Board.h index 9e8f4989..496ee2e0 100644 --- a/variants/thinknode_m3/ThinkNodeM3Board.h +++ b/variants/thinknode_m3/ThinkNodeM3Board.h @@ -42,13 +42,12 @@ public: return 0; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + // turn off all leds, sd_power_system_off will not do this for us digitalWrite(PIN_LED_BLUE, !LED_STATE_ON); digitalWrite(PIN_LED_GREEN, !LED_STATE_ON); digitalWrite(PIN_LED_RED, !LED_STATE_ON); - - // power off board - NRF52Board::powerOff(); } }; diff --git a/variants/thinknode_m6/ThinkNodeM6Board.h b/variants/thinknode_m6/ThinkNodeM6Board.h index 78815e2c..25f6255c 100644 --- a/variants/thinknode_m6/ThinkNodeM6Board.h +++ b/variants/thinknode_m6/ThinkNodeM6Board.h @@ -36,14 +36,12 @@ public: return "Elecrow ThinkNode M6"; } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); // turn off all leds, sd_power_system_off will not do this for us #ifdef P_LORA_TX_LED digitalWrite(P_LORA_TX_LED, LOW); #endif - - // power off board - NRF52Board::powerOff(); } }; diff --git a/variants/wio-tracker-l1/WioTrackerL1Board.h b/variants/wio-tracker-l1/WioTrackerL1Board.h index e376e066..1b1f8040 100644 --- a/variants/wio-tracker-l1/WioTrackerL1Board.h +++ b/variants/wio-tracker-l1/WioTrackerL1Board.h @@ -33,8 +33,4 @@ public: const char* getManufacturerName() const override { return "Seeed Wio Tracker L1"; } - - void powerOff() override { - NRF52Board::powerOff(); - } }; diff --git a/variants/xiao_nrf52/XiaoNrf52Board.h b/variants/xiao_nrf52/XiaoNrf52Board.h index 82b3817b..0c97a139 100644 --- a/variants/xiao_nrf52/XiaoNrf52Board.h +++ b/variants/xiao_nrf52/XiaoNrf52Board.h @@ -39,7 +39,9 @@ public: #endif } - void powerOff() override { + void shutdownPeripherals() override { + NRF52Board::shutdownPeripherals(); + // set led on and wait for button release before poweroff digitalWrite(PIN_LED, LOW); #ifdef PIN_USER_BTN @@ -53,8 +55,6 @@ public: // configure button press to wake up when in powered off state nrf_gpio_cfg_sense_input(digitalPinToInterrupt(g_ADigitalPinMap[PIN_USER_BTN]), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); #endif - - NRF52Board::powerOff(); } };