From 22ad981b011248b28fce42e0920e7094595a945a Mon Sep 17 00:00:00 2001 From: Mateusz Date: Wed, 4 Sep 2019 13:43:27 +0200 Subject: [PATCH] WiP: Suspend/Resume procedure implementation + testing --- module-bsp/CMakeLists.txt | 1 + module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp | 55 +++++++ module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp | 34 +++++ module-bsp/board/rt1051/common/board.cpp | 47 +----- .../board/rt1051/common/clock_config.cpp | 134 +++++++++++++++++- module-bsp/board/rt1051/common/clock_config.h | 3 +- module-bsp/board/rt1051/common/pin_mux.c | 8 +- module-bsp/bsp/lpm/bsp_lpm.cpp | 41 ++++++ module-bsp/bsp/lpm/bsp_lpm.hpp | 40 ++++++ module-bsp/targets/Target_RT1051.cmake | 2 + module-cellular/Modem/MuxDaemon.cpp | 5 +- .../service-appmgr/ApplicationManager.cpp | 4 + module-services/service-eink/ServiceEink.cpp | 24 +++- module-sys/CMakeLists.txt | 2 - module-sys/SystemManager/SystemManager.cpp | 11 +- module-sys/SystemManager/SystemManager.hpp | 3 + source/main.cpp | 7 +- 17 files changed, 356 insertions(+), 65 deletions(-) create mode 100644 module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp create mode 100644 module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp create mode 100644 module-bsp/bsp/lpm/bsp_lpm.cpp create mode 100644 module-bsp/bsp/lpm/bsp_lpm.hpp diff --git a/module-bsp/CMakeLists.txt b/module-bsp/CMakeLists.txt index 2482fd31b..4350fb6bd 100644 --- a/module-bsp/CMakeLists.txt +++ b/module-bsp/CMakeLists.txt @@ -20,6 +20,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BUILD_DIRECTORY}) set(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/bsp/cellular/bsp_cellular.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/bsp/audio/bsp_audio.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/bsp/lpm/bsp_lpm.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/drivers/pll/DriverPLL.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/drivers/dmamux/DriverDMAMux.cpp" diff --git a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp new file mode 100644 index 000000000..b9232d61f --- /dev/null +++ b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp @@ -0,0 +1,55 @@ +/* + * @file RT1051LPM.cpp + * @author Mateusz Piesta (mateusz.piesta@mudita.com) + * @date 04.09.19 + * @brief + * @copyright Copyright (C) 2019 mudita.com + * @details + */ + + + +#include "RT1051LPM.hpp" + +#include "board.h" +#include "fsl_iomuxc.h" +#include "fsl_dcdc.h" +#include "fsl_gpc.h" +#include "log/log.hpp" + + +namespace bsp{ + + int32_t RT1051LPM::Switch(const bsp::LowPowerMode::Mode mode) { + switch (mode){ + case Mode ::FullSpeed: + return EnterFullSpeed(); + case Mode ::LowPowerRun: + return EnterLowPowerRun(); + case Mode ::LowPowerIdle: + return EnterLowPowerIdle(); + case Mode ::Suspend: + return EnterSuspend(); + } + } + + + int32_t RT1051LPM::EnterFullSpeed() { + LPM_EnterFullSpeed(); + return 0; + } + + int32_t RT1051LPM::EnterLowPowerRun() { + LPM_EnterLowPowerRun(); + return 0; + } + + int32_t RT1051LPM::EnterLowPowerIdle() { + LPM_EnterLowPowerIdle(); + return 0; + } + + int32_t RT1051LPM::EnterSuspend() { + return 0; + } +} \ No newline at end of file diff --git a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp new file mode 100644 index 000000000..ef9381ca1 --- /dev/null +++ b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp @@ -0,0 +1,34 @@ +/* + * @file RT1051LPM.hpp + * @author Mateusz Piesta (mateusz.piesta@mudita.com) + * @date 04.09.19 + * @brief + * @copyright Copyright (C) 2019 mudita.com + * @details + */ + + + +#ifndef PUREPHONE_RT1051LPM_HPP +#define PUREPHONE_RT1051LPM_HPP + +#include "bsp/lpm/bsp_lpm.hpp" + +namespace bsp { + + class RT1051LPM : public LowPowerMode { + public: + int32_t Switch(const Mode mode) override final; + private: + int32_t EnterLowPowerRun(); + int32_t EnterFullSpeed(); + int32_t EnterLowPowerIdle(); + int32_t EnterSuspend(); + + Mode currentMode = Mode::FullSpeed; + }; + +} + + +#endif //PUREPHONE_RT1051LPM_HPP diff --git a/module-bsp/board/rt1051/common/board.cpp b/module-bsp/board/rt1051/common/board.cpp index 88af916a6..5fdadfdbc 100644 --- a/module-bsp/board/rt1051/common/board.cpp +++ b/module-bsp/board/rt1051/common/board.cpp @@ -154,46 +154,6 @@ namespace bsp { SCB_EnableICache(); } - void BOARD_PrintClocks( void ) { - const char *_PLLNames[22] = { - "kCLOCK_CpuClk", /*!< CPU clock */ - "kCLOCK_AhbClk", /*!< AHB clock */ - "kCLOCK_SemcClk", /*!< SEMC clock */ - "kCLOCK_IpgClk", /*!< IPG clock */ - - "kCLOCK_OscClk", /*!< OSC clock selected by PMU_LOWPWR_CTRL[OSC_SEL]. */ - "kCLOCK_RtcClk", /*!< RTC clock. (RTCCLK) */ - - "kCLOCK_ArmPllClk", /*!< ARMPLLCLK. */ - - "kCLOCK_Usb1PllClk", /*!< USB1PLLCLK. */ - "kCLOCK_Usb1PllPfd0Clk", /*!< USB1PLLPDF0CLK. */ - "kCLOCK_Usb1PllPfd1Clk", /*!< USB1PLLPFD1CLK. */ - "kCLOCK_Usb1PllPfd2Clk", /*!< USB1PLLPFD2CLK. */ - "kCLOCK_Usb1PllPfd3Clk", /*!< USB1PLLPFD3CLK. */ - - "kCLOCK_Usb2PllClk", /*!< USB2PLLCLK. */ - - "kCLOCK_SysPllClk", /*!< SYSPLLCLK. */ - "kCLOCK_SysPllPfd0Clk", /*!< SYSPLLPDF0CLK. */ - "kCLOCK_SysPllPfd1Clk", /*!< SYSPLLPFD1CLK. */ - "kCLOCK_SysPllPfd2Clk", /*!< SYSPLLPFD2CLK. */ - "kCLOCK_SysPllPfd3Clk", /*!< SYSPLLPFD3CLK. */ - - "kCLOCK_EnetPll0Clk", /*!< Enet PLLCLK ref_enetpll0. */ - "kCLOCK_EnetPll1Clk", /*!< Enet PLLCLK ref_enetpll1. */ - - "kCLOCK_AudioPllClk", /*!< Audio PLLCLK. */ - "kCLOCK_VideoPllClk", /*!< Video PLLCLK. */ - }; - int i; - - for (i=0; i<22; i++) { - LOG_PRINTF("%s: %i Hz\r\n", _PLLNames[i], CLOCK_GetFreq(static_cast(i))); - } - - } - void Power_SW_Init( void ) { gpio_pin_config_t gpio_config = {kGPIO_DigitalInput, 0, kGPIO_NoIntmode}; @@ -217,12 +177,7 @@ namespace bsp { irq_gpio_Init(); - BOARD_PrintClocks(); - PrintPerphSourceClocks(); - - - - + PrintSystemClocks(); } diff --git a/module-bsp/board/rt1051/common/clock_config.cpp b/module-bsp/board/rt1051/common/clock_config.cpp index 1979d61e1..d18625f92 100644 --- a/module-bsp/board/rt1051/common/clock_config.cpp +++ b/module-bsp/board/rt1051/common/clock_config.cpp @@ -962,7 +962,46 @@ uint32_t GetPerphSourceClock(PerphClock_t clock) { } } -void PrintPerphSourceClocks() { +void PrintSystemClocks() { + + + const char *_PLLNames[22] = { + "kCLOCK_CpuClk", /*!< CPU clock */ + "kCLOCK_AhbClk", /*!< AHB clock */ + "kCLOCK_SemcClk", /*!< SEMC clock */ + "kCLOCK_IpgClk", /*!< IPG clock */ + + "kCLOCK_OscClk", /*!< OSC clock selected by PMU_LOWPWR_CTRL[OSC_SEL]. */ + "kCLOCK_RtcClk", /*!< RTC clock. (RTCCLK) */ + + "kCLOCK_ArmPllClk", /*!< ARMPLLCLK. */ + + "kCLOCK_Usb1PllClk", /*!< USB1PLLCLK. */ + "kCLOCK_Usb1PllPfd0Clk", /*!< USB1PLLPDF0CLK. */ + "kCLOCK_Usb1PllPfd1Clk", /*!< USB1PLLPFD1CLK. */ + "kCLOCK_Usb1PllPfd2Clk", /*!< USB1PLLPFD2CLK. */ + "kCLOCK_Usb1PllPfd3Clk", /*!< USB1PLLPFD3CLK. */ + + "kCLOCK_Usb2PllClk", /*!< USB2PLLCLK. */ + + "kCLOCK_SysPllClk", /*!< SYSPLLCLK. */ + "kCLOCK_SysPllPfd0Clk", /*!< SYSPLLPDF0CLK. */ + "kCLOCK_SysPllPfd1Clk", /*!< SYSPLLPFD1CLK. */ + "kCLOCK_SysPllPfd2Clk", /*!< SYSPLLPFD2CLK. */ + "kCLOCK_SysPllPfd3Clk", /*!< SYSPLLPFD3CLK. */ + + "kCLOCK_EnetPll0Clk", /*!< Enet PLLCLK ref_enetpll0. */ + "kCLOCK_EnetPll1Clk", /*!< Enet PLLCLK ref_enetpll1. */ + + "kCLOCK_AudioPllClk", /*!< Audio PLLCLK. */ + "kCLOCK_VideoPllClk", /*!< Video PLLCLK. */ + }; + int i; + + for (i=0; i<22; i++) { + LOG_PRINTF("%s: %i Hz\r\n", _PLLNames[i], CLOCK_GetFreq(static_cast(i))); + } + LOG_PRINTF("PerphSourceClock_I2C: %lu\r\n", GetPerphSourceClock(PerphClock_I2C)); LOG_PRINTF("PerphSourceClock_LPSPI: %lu\r\n", GetPerphSourceClock(PerphClock_LPSPI)); LOG_PRINTF("PerphSourceClock_LPUART: %lu\r\n", GetPerphSourceClock(PerphClock_LPUART)); @@ -1006,6 +1045,20 @@ void EnableWeakLDO(void) LPM_DELAY(40); } +void DisableWeakLDO(void) +{ + /* Disable Weak LDO 2P5 and 1P1 */ + PMU->REG_2P5_CLR = PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK; + PMU->REG_1P1_CLR = PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK; +} + +void EnableRegularLDO(void) +{ + /* Enable Regular LDO 2P5 and 1P1 */ + PMU->REG_2P5_SET = PMU_REG_2P5_ENABLE_LINREG_MASK; + PMU->REG_1P1_SET = PMU_REG_1P1_ENABLE_LINREG_MASK; +} + void DisableRegularLDO(void) { /* Disable Regular LDO 2P5 and 1P1 */ @@ -1019,6 +1072,17 @@ void BandgapOff(void) PMU->MISC0_SET = PMU_MISC0_REFTOP_PWD_MASK; } +void BandgapOn(void) +{ + /* Turn on regular bandgap and wait for stable */ + PMU->MISC0_CLR = PMU_MISC0_REFTOP_PWD_MASK; + while ((PMU->MISC0 & PMU_MISC0_REFTOP_VBGUP_MASK) == 0) + { + } + /* Low power band gap disable */ + XTALOSC24M->LOWPWR_CTRL_CLR = XTALOSC24M_LOWPWR_CTRL_LPBG_SEL_MASK; +} + void LPM_SetWaitModeConfig(void) { uint32_t clpcr; @@ -1138,6 +1202,70 @@ void LPM_EnterLowPowerRun(){ } +void LPM_EnterFullSpeed(void) +{ + /* CCM Mode */ + DCDC_BootIntoCCM(DCDC); + + /* Connect internal the load resistor */ + DCDC->REG1 |= DCDC_REG1_REG_RLOAD_SW_MASK; + /* Adjust SOC voltage to 1.275V */ + DCDC_AdjustTargetVoltage(DCDC, 0x13, 0x1); + + /* Enable FET ODRIVE */ + PMU->REG_CORE_SET = PMU_REG_CORE_FET_ODRIVE_MASK; + /* Connect vdd_high_in and connect vdd_snvs_in */ + PMU->MISC0_CLR = PMU_MISC0_DISCON_HIGH_SNVS_MASK; + + BandgapOn(); + EnableRegularLDO(); + DisableWeakLDO(); + + /* Switch clock source to external OSC. */ + CLOCK_SwitchOsc(kCLOCK_XtalOsc); + /* Set Oscillator ready counter value. */ + CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127); + /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */ + /* OSC_CLK (24M) */ + CLOCK_SetMux(kCLOCK_PeriphClk2Mux, + 1); //CBCMR (13-12) 0 - pll3_sw_clk, 1 - osc_clk (pll1_ref_clk), 2 - pll2_bypass_clk, 3 - reserved + /* PERIPH_CLK2_SEL */ + CLOCK_SetMux(kCLOCK_PeriphMux, 1); //CBCDR (25) 0 - pre_periph_clk_sel, 1 - periph_clk2_clk_divided + + /* Set AHB_PODF. */ + CLOCK_SetDiv(kCLOCK_AhbDiv, 0); //CBCDR + + /* Set IPG_PODF. */ + /* AHB_CLK/4 */ + CLOCK_SetDiv(kCLOCK_IpgDiv, 3); //CBCDR + + /* Set ARM_PODF. */ + /* PLL1/2 (864MHz / 2 = 432 MHz) */ + CLOCK_SetDiv(kCLOCK_ArmDiv, 1); //CACRR + + /* Set PERCLK_PODF. */ + /* IPG_CLK_ROOT/2 */ + CLOCK_SetDiv(kCLOCK_PerclkDiv, 1); //CSCMR1 + /* Set per clock source. */ + CLOCK_SetMux(kCLOCK_PerclkMux, 0); //CSCMR1 (6) 0 - ipg_clk_root, 1 - osc_clk - PIT, GPT + + + /* Set preperiph clock source. */ + /* PLL1/2 = 432MHz */ + CLOCK_SetMux(kCLOCK_PrePeriphMux, 0); //CBCMR (19-18) 0 - PLL2, 1 - PLL2_PFD2, 2 - PLL2_PFD0, 3 - PLL1 + /* Set periph clock source. */ + /* PRE_PERIPH_CLK <- PLL1/2 = 432MHz */ + CLOCK_SetMux(kCLOCK_PeriphMux, 0); //CBCDR (25) 0 - pre_periph_clk_sel, 1 - periph_clk2_clk_divided + + /* Set SystemCoreClock variable. */ + SystemCoreClockUpdate(); + + /* Adjust SOC voltage to 1.15V */ + DCDC_AdjustTargetVoltage(DCDC, 0xe, 0x1); + + PrintSystemClocks(); +} + void LPM_EnterLowPowerIdle(void) { LPM_SetWaitModeConfig(); @@ -1182,7 +1310,7 @@ void LPM_EnterLowPowerIdle(void) PeripheralEnterDozeMode(); - clkPLL2setup(CLK_DISABLE); + //clkPLL2setup(CLK_DISABLE); - __WFI(); + //__WFI(); } diff --git a/module-bsp/board/rt1051/common/clock_config.h b/module-bsp/board/rt1051/common/clock_config.h index 8cd1f11ac..a63c8540d 100644 --- a/module-bsp/board/rt1051/common/clock_config.h +++ b/module-bsp/board/rt1051/common/clock_config.h @@ -142,8 +142,9 @@ typedef enum{ }PerphClock_t; uint32_t GetPerphSourceClock(PerphClock_t clock); -void PrintPerphSourceClocks(); +void PrintSystemClocks(); +void LPM_EnterFullSpeed(void); void LPM_EnterLowPowerRun(); void LPM_EnterLowPowerIdle(void); diff --git a/module-bsp/board/rt1051/common/pin_mux.c b/module-bsp/board/rt1051/common/pin_mux.c index fced9388b..94616e69b 100644 --- a/module-bsp/board/rt1051/common/pin_mux.c +++ b/module-bsp/board/rt1051/common/pin_mux.c @@ -1563,11 +1563,11 @@ void PINMUX_InitCellular(void) PINMUX_CELLULAR_UART_TX, PAD_CONFIG_SLEW_RATE_SLOW | - PAD_CONFIG_DRIVER_STRENGTH_LVL_7 | - PAD_CONFIG_SPEED_MEDIUM_1_100MHz | + PAD_CONFIG_DRIVER_STRENGTH_LVL_1 | + PAD_CONFIG_SPEED_SLOW_50MHz | PAD_CONFIG_PULL_KEEPER_ENABLED | PAD_CONFIG_SELECT_PULL | - PAD_CONFIG_PULL_UP_22kOhm | + PAD_CONFIG_PULL_DOWN_100kOhm | PAD_CONFIG_HYSTERESIS_DISABLED ); @@ -1677,6 +1677,8 @@ void PINMUX_InitCellular(void) PAD_CONFIG_DRIVER_STRENGTH_LVL_1 | PAD_CONFIG_SPEED_SLOW_50MHz | PAD_CONFIG_PULL_KEEPER_DISABLED | + PAD_CONFIG_SELECT_PULL | + PAD_CONFIG_PULL_DOWN_100kOhm | PAD_CONFIG_HYSTERESIS_DISABLED); IOMUXC_SetPinConfig( diff --git a/module-bsp/bsp/lpm/bsp_lpm.cpp b/module-bsp/bsp/lpm/bsp_lpm.cpp new file mode 100644 index 000000000..2824775ae --- /dev/null +++ b/module-bsp/bsp/lpm/bsp_lpm.cpp @@ -0,0 +1,41 @@ +/* + * @file bsp_lpm.cpp + * @author Mateusz Piesta (mateusz.piesta@mudita.com) + * @date 04.09.19 + * @brief + * @copyright Copyright (C) 2019 mudita.com + * @details + */ + + + +#include "bsp_lpm.hpp" + + +#if defined(TARGET_RT1051) +#include "board/rt1051/bsp/lpm/RT1051LPM.hpp" +#elif defined(TARGET_Linux) +#include "cellular/linux_cellular.hpp" +#else +#error "Unsupported target" +#endif + + +namespace bsp{ + + std::optional> LowPowerMode::Create() { + + std::unique_ptr inst; + +#if defined(TARGET_RT1051) + inst = std::make_unique(); +#elif defined(TARGET_Linux) + inst = std::make_unique(term); +#else +#error "Unsupported target" +#endif + + return inst; + } + +} \ No newline at end of file diff --git a/module-bsp/bsp/lpm/bsp_lpm.hpp b/module-bsp/bsp/lpm/bsp_lpm.hpp new file mode 100644 index 000000000..1ff46ff76 --- /dev/null +++ b/module-bsp/bsp/lpm/bsp_lpm.hpp @@ -0,0 +1,40 @@ +/* + * @file bsp_lpm.hpp + * @author Mateusz Piesta (mateusz.piesta@mudita.com) + * @date 04.09.19 + * @brief + * @copyright Copyright (C) 2019 mudita.com + * @details + */ + + + +#ifndef PUREPHONE_BSP_LPM_HPP +#define PUREPHONE_BSP_LPM_HPP + +#include +#include + +namespace bsp { + + class LowPowerMode { + public: + + enum class Mode{ + FullSpeed, + LowPowerRun, + LowPowerIdle, + Suspend + + }; + + static std::optional> Create(); + + virtual int32_t Switch(const Mode mode) = 0; + + }; + +} + + +#endif //PUREPHONE_BSP_LPM_HPP diff --git a/module-bsp/targets/Target_RT1051.cmake b/module-bsp/targets/Target_RT1051.cmake index 3174669ed..c2c758aaa 100644 --- a/module-bsp/targets/Target_RT1051.cmake +++ b/module-bsp/targets/Target_RT1051.cmake @@ -54,6 +54,8 @@ set(BOARD_SOURCES ${BOARD_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/keyboard/keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/lpm/RT1051LPM.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/rtc/rtc.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/board/rt1051/bsp/battery-charger/battery_charger.cpp" diff --git a/module-cellular/Modem/MuxDaemon.cpp b/module-cellular/Modem/MuxDaemon.cpp index 42136ef8a..6687db95f 100644 --- a/module-cellular/Modem/MuxDaemon.cpp +++ b/module-cellular/Modem/MuxDaemon.cpp @@ -212,8 +212,11 @@ MuxDaemon::ConfState MuxDaemon::ConfProcedure() { CheckATCommandResponse(inOutSerialDataWorker->SendATCommand("AT+CRC=1\r", 1)); // Turn on caller's number presentation CheckATCommandResponse(inOutSerialDataWorker->SendATCommand("AT+CLIP=1\r", 1)); + // Enable sleep mode - CheckATCommandResponse(inOutSerialDataWorker->SendATCommand("AT+QSCLK=1\r", 1)); + while(!CheckATCommandResponse(inOutSerialDataWorker->SendATCommand("AT+QSCLK=1\r", 1))){ + vTaskDelay(1000); + } /* // Set Message format to Text SendAT("AT+CMGF=1\r", 500); diff --git a/module-services/service-appmgr/ApplicationManager.cpp b/module-services/service-appmgr/ApplicationManager.cpp index 29b33a234..b09957ad2 100644 --- a/module-services/service-appmgr/ApplicationManager.cpp +++ b/module-services/service-appmgr/ApplicationManager.cpp @@ -226,9 +226,13 @@ sys::ReturnCodes ApplicationManager::SwitchPowerModeHandler(const sys::ServicePo switch (mode){ case sys::ServicePowerMode ::Active: + sys::SystemManager::ResumeService("ServiceEink",this); + sys::SystemManager::ResumeService("ServiceGUI",this); break; case sys::ServicePowerMode ::SuspendToRAM: case sys::ServicePowerMode ::SuspendToNVM: + sys::SystemManager::SuspendService("ServiceGUI",this); + sys::SystemManager::SuspendService("ServiceEink",this); break; } diff --git a/module-services/service-eink/ServiceEink.cpp b/module-services/service-eink/ServiceEink.cpp index f5ef8e958..1dd5519fd 100644 --- a/module-services/service-eink/ServiceEink.cpp +++ b/module-services/service-eink/ServiceEink.cpp @@ -205,11 +205,33 @@ sys::ReturnCodes ServiceEink::SwitchPowerModeHandler(const sys::ServicePowerMode switch (mode){ case sys::ServicePowerMode ::Active: + { + EinkStatus_e einkStatus = EinkResetAndInitialize(); + + if (einkStatus != EinkOK) + { + LOG_FATAL("Error: Could not initialize Eink display!\n"); + } + + //TODO remove screen clearing code below. EinkPowerOn(); + + uint8_t s_einkAmbientTemperature = EinkGetTemperatureInternal(); + // Make the saturation to the lower limit + if (s_einkAmbientTemperature < 0) + s_einkAmbientTemperature = 0; + + // Make the saturation to the higher limit + if (s_einkAmbientTemperature > 49) + s_einkAmbientTemperature = 49; + + // Clear the temperature timer count + deepClearScreen( s_einkAmbientTemperature ); + } break; case sys::ServicePowerMode ::SuspendToRAM: case sys::ServicePowerMode ::SuspendToNVM: - EinkPowerOff(); + EinkPowerDown(); break; } diff --git a/module-sys/CMakeLists.txt b/module-sys/CMakeLists.txt index 88542bfb5..213b02a10 100644 --- a/module-sys/CMakeLists.txt +++ b/module-sys/CMakeLists.txt @@ -3,8 +3,6 @@ cmake_minimum_required(VERSION 3.14) project(module-sys VERSION 1.0 DESCRIPTION "Core module library") -set(CMAKE_CXX_STANDARD 14) - if(NOT DEFINED PROJECT_LIB_DIRECTORY ) set(PROJECT_LIB_DIRECTORY "${CMAKE_SOURCE_DIR}/lib/" CACHE STRING "Output path for static libraries") message("Setting PROJECT_LIB_DIRECTORY to ${PROJECT_LIB_DIRECTORY}") diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index 6ae627815..90b737a9d 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -57,6 +57,8 @@ namespace sys { userInit = init; + lowPowerMode = bsp::LowPowerMode::Create().value_or(nullptr); + // Start System manager StartService(); @@ -87,9 +89,15 @@ namespace sys { } } } + + lowPowerMode->Switch(bsp::LowPowerMode::Mode::LowPowerIdle); + } bool SystemManager::ResumeSystem(Service *caller) { + + lowPowerMode->Switch(bsp::LowPowerMode::Mode::FullSpeed); + for(const auto &w : servicesList){ if(w->parent == "" && w->GetName() != caller->GetName()){ @@ -101,8 +109,6 @@ namespace sys { LOG_FATAL("Service %s failed to exit low-power mode",w->GetName().c_str()); } } - - } } @@ -249,5 +255,6 @@ namespace sys { std::vector> SystemManager::servicesList; cpp_freertos::MutexStandard SystemManager::destroyMutex; + std::unique_ptr SystemManager::lowPowerMode; } diff --git a/module-sys/SystemManager/SystemManager.hpp b/module-sys/SystemManager/SystemManager.hpp index 29361073d..18482795b 100644 --- a/module-sys/SystemManager/SystemManager.hpp +++ b/module-sys/SystemManager/SystemManager.hpp @@ -13,6 +13,7 @@ #include "timer.hpp" #include "condition_variable.hpp" #include "mutex.hpp" +#include "bsp/lpm/bsp_lpm.hpp" #include "Service/Mailbox.hpp" #include "Service/Bus.hpp" #include "Service/Service.hpp" @@ -91,6 +92,8 @@ private: static std::vector> servicesList; static cpp_freertos::MutexStandard destroyMutex; + static std::unique_ptr lowPowerMode; + }; diff --git a/source/main.cpp b/source/main.cpp index fe36428e9..9dc7f0d8e 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -123,14 +123,11 @@ int main() { LOG_PRINTF("Launching PurePhone..\n"); bsp::BoardInit(); - LPM_EnterLowPowerIdle(); -#if 1 auto sysmgr = std::make_shared(5000); sysmgr->StartSystem([sysmgr]()->int{ -#if 0 vfs.Init(); bool ret = false; @@ -138,7 +135,7 @@ int main() { ret = sys::SystemManager::CreateService(std::make_shared("EventManager"), sysmgr.get()); ret |= sys::SystemManager::CreateService(std::make_shared(), sysmgr.get()); ret |= sys::SystemManager::CreateService(std::make_shared("Blinky"), sysmgr.get()); - //ret |= sys::SystemManager::CreateService(std::make_shared(), sysmgr.get()); + ret |= sys::SystemManager::CreateService(std::make_shared(), sysmgr.get()); ret |= sys::SystemManager::CreateService(std::make_shared(), sysmgr.get()); //vector with launchers to applications @@ -169,7 +166,6 @@ int main() { return 0; } -#endif return 0; @@ -177,6 +173,5 @@ int main() { }); cpp_freertos::Thread::StartScheduler(); -#endif return 0; }