From 4223a3e8bbb146399c13bb305e92c95451deba00 Mon Sep 17 00:00:00 2001 From: Thomas Abbott Date: Fri, 30 Jan 2026 12:30:35 -0800 Subject: [PATCH 1/2] power saving: enable DCDC, reduce clock speeds and voltage --- variants/rpi_picow/PicoWBoard.cpp | 60 +++++++++++++++++++++++++++++++ variants/rpi_picow/PicoWBoard.h | 12 +++++++ variants/rpi_picow/platformio.ini | 1 + 3 files changed, 73 insertions(+) diff --git a/variants/rpi_picow/PicoWBoard.cpp b/variants/rpi_picow/PicoWBoard.cpp index f345f96df..d58875281 100644 --- a/variants/rpi_picow/PicoWBoard.cpp +++ b/variants/rpi_picow/PicoWBoard.cpp @@ -19,6 +19,66 @@ static void disconnect_callback(uint16_t conn_handle, uint8_t reason) { } void PicoWBoard::begin() { + // 1. Force SMPS to PFM (Power Save) Mode + pinMode(PIN_SMPS_MODE, OUTPUT); + digitalWrite(PIN_SMPS_MODE, LOW); + + // 2. Detect Power Source + pinMode(PIN_VBUS_DET, INPUT); + bool usb_connected = digitalRead(PIN_VBUS_DET); + + if (usb_connected) { + // --- USB MODE (Performance) --- + // Must run at 48MHz+ for USB to work + set_sys_clock_khz(48000, true); + + // Ensure USB Clock is enabled + clock_configure(clk_usb, + 0, + CLOCKS_CLK_USB_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB, + 48 * MHZ, + 48 * MHZ); + + // Ensure ADC runs from USB PLL (Standard 48MHz) + clock_configure(clk_adc, + 0, + CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB, + 48 * MHZ, + 48 * MHZ); + + } else { + // --- BATTERY MODE (Deep Power Saving) --- + + // A. Move ADC to System Clock BEFORE killing USB PLL + // This keeps the ADC alive, even though USB PLL is about to die. + // It will run at 18MHz (Slower, but fine for battery reading). + clock_configure(clk_adc, + 0, + CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS, + 18 * MHZ, + 18 * MHZ); + + // B. Drop System Clock to 18 MHz + set_sys_clock_khz(18000, true); + + // C. Disable USB Clock & PLL + // The USB PLL consumes ~2-3mA. We turn it off it here. + clock_stop(clk_usb); + pll_deinit(pll_usb); + + // D. Lower Core Voltage to 0.95V + vreg_set_voltage(VREG_VOLTAGE_0_95); + } + + // 3. Reconfigure Peripheral Clock to match System Clock + // This ensures UART/SPI timings stay correct at the new 18MHz speed + clock_configure(clk_peri, + 0, + CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS, // Run peripherals from Sys Clock + usb_connected ? 48000 * 1000 : 18000 * 1000, + usb_connected ? 48000 * 1000 : 18000 * 1000); + + // for future use, sub-classes SHOULD call this from their begin() startup_reason = BD_STARTUP_NORMAL; pinMode(PIN_VBAT_READ, INPUT); diff --git a/variants/rpi_picow/PicoWBoard.h b/variants/rpi_picow/PicoWBoard.h index 708e96558..c58b5ce99 100644 --- a/variants/rpi_picow/PicoWBoard.h +++ b/variants/rpi_picow/PicoWBoard.h @@ -3,6 +3,18 @@ #include #include +// RP2040 Specific Includes for Clock/Power +#include "pico/stdlib.h" +#include "hardware/vreg.h" +#include "hardware/clocks.h" +#include "hardware/pll.h" +#include "hardware/structs/pll.h" +#include "hardware/structs/clocks.h" + +// Pico Standard Pins +#define PIN_SMPS_MODE 23 +#define PIN_VBUS_DET 24 + // built-ins #define PIN_VBAT_READ 26 #define ADC_MULTIPLIER (3.1 * 3.3 * 1000) // MT Uses 3.1 diff --git a/variants/rpi_picow/platformio.ini b/variants/rpi_picow/platformio.ini index ec5cdb839..9f0843777 100644 --- a/variants/rpi_picow/platformio.ini +++ b/variants/rpi_picow/platformio.ini @@ -17,6 +17,7 @@ build_flags = ${rp2040_base.build_flags} -D P_LORA_MOSI=11 -D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO3_TCXO_VOLTAGE=1.8 + -D SX126X_REGULATOR=RADIOLIB_SX126X_REGULATOR_DCDC -D SX126X_CURRENT_LIMIT=130 -D SX126X_RX_BOOSTED_GAIN=1 -D LORA_TX_POWER=22 From b3b118e01d1b6a358eef9ca992ee86cbb7c5c2da Mon Sep 17 00:00:00 2001 From: Thomas Abbott Date: Fri, 30 Jan 2026 15:47:29 -0800 Subject: [PATCH 2/2] Remove unused SX1262 regulator definition from platformio.ini Removed the DCDC regulator definition for SX1262. It's not used, not passed to Radiolib. DCDC is the default. --- variants/rpi_picow/platformio.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/variants/rpi_picow/platformio.ini b/variants/rpi_picow/platformio.ini index 9f0843777..ec5cdb839 100644 --- a/variants/rpi_picow/platformio.ini +++ b/variants/rpi_picow/platformio.ini @@ -17,7 +17,6 @@ build_flags = ${rp2040_base.build_flags} -D P_LORA_MOSI=11 -D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO3_TCXO_VOLTAGE=1.8 - -D SX126X_REGULATOR=RADIOLIB_SX126X_REGULATOR_DCDC -D SX126X_CURRENT_LIMIT=130 -D SX126X_RX_BOOSTED_GAIN=1 -D LORA_TX_POWER=22