From da65442ad57922b0c35fac013d4e8859f3ba579e Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sat, 4 Nov 2023 12:27:33 +0100 Subject: [PATCH] Started to implement some functions of the watch power management system (dynamically change CPU clock), more to be done. --- .../watch_power_management.c | 40 +++++++++++++++++++ .../watch_power_management.h | 6 +++ 2 files changed, 46 insertions(+) diff --git a/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.c b/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.c index 550c417..c2a2b61 100644 --- a/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.c +++ b/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.c @@ -80,6 +80,46 @@ bool watch_power_management_check_current_power_state_is(watch_power_state_e pow return power_state == _watch_power_management.current_power_state; } +void watch_power_management_overwrite_default_cpu_clocks(enum CPU_CLK idle, enum CPU_CLK full_speed) +{ + if(CPU_CLK_NO_CHANGE != idle) _watch_power_management.cpu_clock_idle = idle; + if(CPU_CLK_NO_CHANGE != full_speed) _watch_power_management.cpu_clock_full_speed = full_speed; + + // Let's apply the restored clock + switch (_watch_power_management.current_power_state) + { + case WATCH_POWER_STATE_IDLE: + _set_cpu_clock(_watch_power_management.cpu_clock_idle); + break; + case WATCH_POWER_STATE_FULL_SPEED: + _set_cpu_clock(_watch_power_management.cpu_clock_full_speed); + break; + default: + // Nothing to do + break; + } +} + +void watch_power_management_restore_default_cpu_clocks(bool idle, bool full_speed) +{ + if(idle) _watch_power_management.cpu_clock_idle = CPU_CLK_80M; + if(full_speed) _watch_power_management.cpu_clock_full_speed = CPU_CLK_160M; + + // Let's apply the restored clock + switch (_watch_power_management.current_power_state) + { + case WATCH_POWER_STATE_IDLE: + _set_cpu_clock(_watch_power_management.cpu_clock_idle); + break; + case WATCH_POWER_STATE_FULL_SPEED: + _set_cpu_clock(_watch_power_management.cpu_clock_full_speed); + break; + default: + // Nothing to do + break; + } +} + static void _set_cpu_clock(enum CPU_CLK cpu_clock) { // First let's get the current clock speed diff --git a/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.h b/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.h index fb51690..a1ba4dd 100644 --- a/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.h +++ b/src/W800_SDK_v1.00.10/app/app_drivers/watch_power_management/watch_power_management.h @@ -15,6 +15,8 @@ #include "wm_type_def.h" #include "wm_cpu.h" +#define CPU_CLK_NO_CHANGE (0) + typedef enum watch_power_state { /** @@ -56,4 +58,8 @@ watch_power_state_e watch_power_management_get_current_power_state(void); bool watch_power_management_check_current_power_state_is(watch_power_state_e power_state); +void watch_power_management_overwrite_default_cpu_clocks(enum CPU_CLK idle, enum CPU_CLK full_speed); + +void watch_power_management_restore_default_cpu_clocks(bool idle, bool full_speed); + #endif //WATCH_POWER_MANAGEMENT_H \ No newline at end of file