From 671320b5d1dbe0ab1a1f03f2c018ccd8aefa728a Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Mon, 12 Jan 2026 16:07:55 +0000 Subject: [PATCH] echoplayer: implement basic power-on / power-off logic Use cpu_power_on as a GPIO to keep the main power supply enabled when running from battery. Change-Id: Ic79283a0cc640585a0297e11f9dcc2264ec9af26 --- bootloader/echoplayer.c | 4 ++++ .../target/arm/stm32/echoplayer/power-echoplayer.c | 14 ++++++++++++++ .../arm/stm32/echoplayer/system-echoplayer.c | 2 +- firmware/target/arm/stm32/system-stm32h7.c | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bootloader/echoplayer.c b/bootloader/echoplayer.c index 2afa85819d..982f16ac96 100644 --- a/bootloader/echoplayer.c +++ b/bootloader/echoplayer.c @@ -119,6 +119,10 @@ void main(void) demo_page -= 1; break; + case BUTTON_X: + power_off(); + break; + default: break; } diff --git a/firmware/target/arm/stm32/echoplayer/power-echoplayer.c b/firmware/target/arm/stm32/echoplayer/power-echoplayer.c index 3482d884eb..7e4b2e78a3 100644 --- a/firmware/target/arm/stm32/echoplayer/power-echoplayer.c +++ b/firmware/target/arm/stm32/echoplayer/power-echoplayer.c @@ -67,10 +67,24 @@ void power_init(void) void power_off(void) { + gpio_set_level(GPIO_CPU_POWER_ON, 0); + + /* TODO: reset to bootloader if USB is plugged in */ + while (1) + core_idle(); } void system_reboot(void) { + /* + * TODO: support reboot + * + * For R1-Rev1 PCBs doing a CPU reset will cut power when + * running on battery (because cpu_power_on is no longer + * being driven high). The RTC alarm could be used to wake + * the system instead. + */ + power_off(); } unsigned int power_input_status(void) diff --git a/firmware/target/arm/stm32/echoplayer/system-echoplayer.c b/firmware/target/arm/stm32/echoplayer/system-echoplayer.c index f00545bb2b..97dbb9644a 100644 --- a/firmware/target/arm/stm32/echoplayer/system-echoplayer.c +++ b/firmware/target/arm/stm32/echoplayer/system-echoplayer.c @@ -56,7 +56,7 @@ static const struct gpio_setting gpios[] = { STM_DEFGPIO(GPIO_BUTTON_VOL_DOWN, F_INPUT_PU), STM_DEFGPIO(GPIO_BUTTON_POWER, F_INPUT_PD), STM_DEFGPIO(GPIO_BUTTON_HOLD, F_INPUT_PU), - STM_DEFGPIO(GPIO_CPU_POWER_ON, F_LPTIM4_OUT), + STM_DEFGPIO(GPIO_CPU_POWER_ON, F_OUT_LS(1)), /* active high */ STM_DEFGPIO(GPIO_POWER_1V8, F_OUT_LS(0)), /* active high */ STM_DEFGPIO(GPIO_CODEC_AVDD_EN, F_OUT_LS(1)), /* active low */ STM_DEFGPIO(GPIO_CODEC_DVDD_EN, F_OUT_LS(1)), /* active low */ diff --git a/firmware/target/arm/stm32/system-stm32h7.c b/firmware/target/arm/stm32/system-stm32h7.c index 0ab2769643..b58fd76322 100644 --- a/firmware/target/arm/stm32/system-stm32h7.c +++ b/firmware/target/arm/stm32/system-stm32h7.c @@ -20,6 +20,7 @@ ****************************************************************************/ #include "system.h" #include "tick.h" +#include "button.h" #include "clock-stm32h7.h" #include "gpio-stm32h7.h" #include "regs/cortex-m/cm_scb.h" @@ -154,7 +155,11 @@ void mdelay(uint32_t ms) void system_exception_wait(void) { +#if defined(ECHO_R1) + while (button_read_device() != (BUTTON_POWER | BUTTON_START)); +#else while (1); +#endif } int system_memory_guard(int newmode)