From 57aa65eeed3efa2698a91772aad45864a6012a9a Mon Sep 17 00:00:00 2001 From: Liu Ning Date: Wed, 23 Dec 2020 14:45:36 +0800 Subject: [PATCH] components/pm: Add sleep related code iram opt chioce --- components/esp_common/linker.lf | 6 ++++++ components/esp_hw_support/linker.lf | 2 ++ components/esp_pm/CMakeLists.txt | 3 ++- components/esp_pm/Kconfig | 18 ++++++++++++++++++ components/esp_pm/component.mk | 1 + components/esp_pm/linker.lf | 6 ++++++ components/esp_system/linker.lf | 6 ++++++ components/esp_timer/CMakeLists.txt | 3 ++- components/esp_timer/component.mk | 2 ++ components/esp_timer/linker.lf | 10 ++++++++++ components/newlib/newlib.lf | 7 +++++++ 11 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 components/esp_pm/linker.lf create mode 100644 components/esp_timer/linker.lf diff --git a/components/esp_common/linker.lf b/components/esp_common/linker.lf index b6913ecff1..bfc8cdad1a 100644 --- a/components/esp_common/linker.lf +++ b/components/esp_common/linker.lf @@ -2,3 +2,9 @@ archive: libesp_common.a entries: esp_err (noflash) + if PM_RTOS_IDLE_OPT = y: + freertos_hooks:esp_vApplicationIdleHook (noflash) + task_wdt:idle_hook_cb (noflash) + task_wdt:esp_task_wdt_reset (noflash) + task_wdt:find_task_in_twdt_list (noflash) + task_wdt:reset_hw_timer (noflash) diff --git a/components/esp_hw_support/linker.lf b/components/esp_hw_support/linker.lf index 9abbe07e38..96e27d5032 100644 --- a/components/esp_hw_support/linker.lf +++ b/components/esp_hw_support/linker.lf @@ -11,3 +11,5 @@ entries: rtc_sleep (noflash_text) rtc_time (noflash_text) rtc_wdt (noflash_text) + if PM_SLP_IRAM_OPT = y: + rtc_init:rtc_vddsdio_get_config (noflash) diff --git a/components/esp_pm/CMakeLists.txt b/components/esp_pm/CMakeLists.txt index 384419be1f..b802986ec1 100644 --- a/components/esp_pm/CMakeLists.txt +++ b/components/esp_pm/CMakeLists.txt @@ -1,2 +1,3 @@ idf_component_register(SRCS "pm_locks.c" "pm_trace.c" "pm_impl.c" - INCLUDE_DIRS include) + INCLUDE_DIRS include + LDFRAGMENTS linker.lf) diff --git a/components/esp_pm/Kconfig b/components/esp_pm/Kconfig index 13c0b5b119..c581d9753f 100644 --- a/components/esp_pm/Kconfig +++ b/components/esp_pm/Kconfig @@ -59,5 +59,23 @@ menu "Power Management" of power management implementation, and should be kept disabled in applications. + config PM_SLP_IRAM_OPT + bool "Put lightsleep related codes in internal RAM" + depends on FREERTOS_USE_TICKLESS_IDLE + default n + help + If enabled, about 1.8KB of lightsleep related codes would be in IRAM and chip would sleep + longer for 760us at most each time. + This feature is intended to be used when a lower power management mode is needed + regardless of the internal memory. + config PM_RTOS_IDLE_OPT + bool "Put RTOS IDLE related codes in internal RAM" + depends on FREERTOS_USE_TICKLESS_IDLE + default n + help + If enabled, about 260B of RTOS_IDLE related codes would be in IRAM and chip would sleep + longer for 40us at most each time. + This feature is intended to be used when a lower power management mode is needed + regardless of the internal memory. endmenu # "Power Management" diff --git a/components/esp_pm/component.mk b/components/esp_pm/component.mk index f88ff46f54..0afe7e3428 100644 --- a/components/esp_pm/component.mk +++ b/components/esp_pm/component.mk @@ -1,2 +1,3 @@ COMPONENT_SRCDIRS := . COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_ADD_LDFRAGMENTS += linker.lf diff --git a/components/esp_pm/linker.lf b/components/esp_pm/linker.lf new file mode 100644 index 0000000000..e04ce24164 --- /dev/null +++ b/components/esp_pm/linker.lf @@ -0,0 +1,6 @@ +[mapping:esp_pm] +archive: libesp_pm.a +entries: + if PM_RTOS_IDLE_OPT = y: + pm_impl:esp_pm_impl_idle_hook (noflash) + pm_impl:esp_pm_impl_waiti (noflash) diff --git a/components/esp_system/linker.lf b/components/esp_system/linker.lf index 17ab599c35..c4b3ac055e 100644 --- a/components/esp_system/linker.lf +++ b/components/esp_system/linker.lf @@ -23,6 +23,12 @@ entries: usb_console:esp_usb_console_cdc_acm_cb (noflash) usb_console:esp_usb_console_dfu_detach_cb (noflash) usb_console:esp_usb_console_before_restart (noflash) + if PM_SLP_IRAM_OPT = y: + sleep_modes:esp_light_sleep_start (noflash) + sleep_modes:esp_sleep_enable_timer_wakeup (noflash) + sleep_modes:timer_wakeup_prepare (noflash) + sleep_modes:get_power_down_flags (noflash) + [mapping:vfs_cdcacm] archive: libvfs.a diff --git a/components/esp_timer/CMakeLists.txt b/components/esp_timer/CMakeLists.txt index 0fbbee530b..bd5a566aeb 100644 --- a/components/esp_timer/CMakeLists.txt +++ b/components/esp_timer/CMakeLists.txt @@ -15,4 +15,5 @@ idf_component_register(SRCS "${srcs}" INCLUDE_DIRS include PRIV_INCLUDE_DIRS private_include REQUIRES esp_common - PRIV_REQUIRES soc driver "${target}") + PRIV_REQUIRES soc driver "${target}" + LDFRAGMENTS linker.lf) diff --git a/components/esp_timer/component.mk b/components/esp_timer/component.mk index 43b72dec6c..d179111cda 100644 --- a/components/esp_timer/component.mk +++ b/components/esp_timer/component.mk @@ -20,3 +20,5 @@ ifdef CONFIG_IDF_TARGET_ESP32 else $(error esp_timer is only supported by the Make build system for esp32 chip. For other chips, use the Cmake build system) endif + +COMPONENT_ADD_LDFRAGMENTS += linker.lf diff --git a/components/esp_timer/linker.lf b/components/esp_timer/linker.lf new file mode 100644 index 0000000000..743b8d6f13 --- /dev/null +++ b/components/esp_timer/linker.lf @@ -0,0 +1,10 @@ +[mapping:esp_timer] +archive: libesp_timer.a +entries: + if PM_SLP_IRAM_OPT = y: + esp_timer_impl_lac:esp_timer_impl_lock (noflash) + esp_timer_impl_lac:esp_timer_impl_unlock (noflash) + esp_timer_impl_lac:esp_timer_impl_advance (noflash) + esp_timer_impl_systimer:esp_timer_impl_lock (noflash) + esp_timer_impl_systimer:esp_timer_impl_unlock (noflash) + esp_timer_impl_systimer:esp_timer_impl_advance (noflash) diff --git a/components/newlib/newlib.lf b/components/newlib/newlib.lf index 63a93164a2..46410048cd 100644 --- a/components/newlib/newlib.lf +++ b/components/newlib/newlib.lf @@ -3,3 +3,10 @@ archive: libnewlib.a entries: heap (noflash) abort (noflash) + if PM_SLP_IRAM_OPT = y: + esp_time_impl:esp_time_impl_set_boot_time (noflash) + esp_time_impl:esp_time_impl_get_boot_time (noflash) + esp_time_impl:esp_clk_slowclk_cal_get (noflash) + esp_time_impl:esp_rtc_get_time_us (noflash) + esp_time_impl:esp_clk_slowclk_cal_set (noflash) + esp_time_impl:esp_set_time_from_rtc (noflash)