From 28788a96f2255bd3580e633cf6af0f0c42ef4eed Mon Sep 17 00:00:00 2001 From: cjin Date: Sun, 25 Jun 2023 14:47:32 +0800 Subject: [PATCH] ble:support esp32h2 power save example --- examples/bluetooth/.build-test-rules.yml | 2 +- .../bluetooth/nimble/power_save/README.md | 22 ++++++------- .../nimble/power_save/main/Kconfig.projbuild | 15 +++++++-- .../nimble/power_save/sdkconfig.32m.esp32h2 | 23 +++++++++++++ .../power_save/sdkconfig.defaults.esp32h2 | 32 +++++++++++++++++++ 5 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 examples/bluetooth/nimble/power_save/sdkconfig.32m.esp32h2 create mode 100644 examples/bluetooth/nimble/power_save/sdkconfig.defaults.esp32h2 diff --git a/examples/bluetooth/.build-test-rules.yml b/examples/bluetooth/.build-test-rules.yml index af37d6904c..7f75c6dc7f 100644 --- a/examples/bluetooth/.build-test-rules.yml +++ b/examples/bluetooth/.build-test-rules.yml @@ -270,6 +270,6 @@ examples/bluetooth/nimble/hci: examples/bluetooth/nimble/power_save: enable: - - if: IDF_TARGET in ["esp32", "esp32c3", "esp32s3", "esp32c6"] + - if: IDF_TARGET in ["esp32", "esp32c3", "esp32s3", "esp32c6", "esp32h2"] temporary: true reason: the other targets are not tested yet diff --git a/examples/bluetooth/nimble/power_save/README.md b/examples/bluetooth/nimble/power_save/README.md index 5fc296e65b..afab7854f8 100644 --- a/examples/bluetooth/nimble/power_save/README.md +++ b/examples/bluetooth/nimble/power_save/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-C6 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | Bluetooth Power Save Example ================================= @@ -10,7 +10,6 @@ If the modem sleep mode is enabled, bluetooth will switch periodically between a In sleep state, RF, PHY and BB are turned off in order to reduce power consumption. This example contains five build configurations. For each configuration, a few configuration options are set: - - `sdkconfig.defaults.esp32`: ESP32 uses 32kHz XTAL as low power clock in light sleep enabled. - `sdkconfig.defaults.esp32c3`: ESP32C3 uses 32kHz XTAL as low power clock in light sleep enabled. - `sdkconfig.40m.esp32c3`: ESP32C3 uses main XTAL as low power clock in light sleep enabled. @@ -18,12 +17,13 @@ This example contains five build configurations. For each configuration, a few c - `sdkconfig.40m.esp32c6`: ESP32C6 uses main XTAL as low power clock in light sleep enabled. - `sdkconfig.defaults.esp32s3`: ESP32S3 uses 32kHz XTAL as low power clock in light sleep enabled. - `sdkconfig.40m.esp32s3`: ESP32S3 uses main XTAL as low power clock in light sleep enabled. - +- `sdkconfig.defaults.esp32h2`: ESP32H2 uses 32kHz XTAL as low power clock in light sleep enabled. +- `sdkconfig.40m.esp32h2`: ESP32H2 uses main XTAL as low power clock in light sleep enabled. ## How to use example ### Hardware Required -This example should be able to run on any commonly available ESP32/ESP32-C3/ESP32-S3/ESP32-C6 development board. +This example should be able to run on any commonly available ESP32/ESP32-C3/ESP32-S3/ESP32-H2/ESP32-C6 development board. ### Configure the project @@ -37,11 +37,10 @@ idf.py menuconfig - `Component config > Power Management > [*] Support for power management` 3. Configure FreeRTOS: - `Component config > FreeRTOS > Kernel` - - `(1000) configTICK_RATE_HZ` - - `[*] configUSE_TICKLESS_IDLE` - - `(3) configEXPECTED_IDLE_TIME_BEFORE_SLEEP` - -#### For ESP32/ESP32-C3/ESP32-S3 Chip: + - `(1000) configTICK_RATE_HZ` + - `[*] configUSE_TICKLESS_IDLE` + - `(3) configEXPECTED_IDLE_TIME_BEFORE_SLEEP` +#### For Chip ESP32/ESP32-C3/ESP32-S3: 4. Enable power down MAC and baseband: - `Component config > PHY > [*] Power down MAC and baseband of Wi-Fi and Bluetooth when PHY is disabled` @@ -54,7 +53,7 @@ idf.py menuconfig 7. Enable power up main XTAL during light sleep: - `Component config > Bluetooth > Controller Options > MODEM SLEEP Options > [*] power up main XTAL during light sleep` -#### For ESP32-C6 Chip: +#### For Chip ESP32-C6/ESP32-H2 4. Enable bluetooth modem sleep: - `Component config > Bluetooth > Controller Options` @@ -129,6 +128,7 @@ I (463) NimBLE: | ESP32C3 | 262 mA | 12 mA | 2.3 mA | 140 uA | | ESP32S3 | 240 mA | 17.9 mA | 3.3 mA | 230 uA | | ESP32C6 | 240 mA | 22 mA | 3.3 mA | 34 uA | +| ESP32H2 | 82 mA | 16.0 mA | 4.0 mA | 24 uA | X: This feature is currently not supported. ## Example Breakdown diff --git a/examples/bluetooth/nimble/power_save/main/Kconfig.projbuild b/examples/bluetooth/nimble/power_save/main/Kconfig.projbuild index 0819133cc1..0058681e32 100644 --- a/examples/bluetooth/nimble/power_save/main/Kconfig.projbuild +++ b/examples/bluetooth/nimble/power_save/main/Kconfig.projbuild @@ -2,13 +2,17 @@ menu "Example Configuration" choice EXAMPLE_MAX_CPU_FREQ prompt "Maximum CPU frequency" - default EXAMPLE_MAX_CPU_FREQ_160 + default EXAMPLE_MAX_CPU_FREQ_160 if !IDF_TARGET_ESP32H2 + default EXAMPLE_MAX_CPU_FREQ_96 if IDF_TARGET_ESP32H2 depends on PM_ENABLE help Maximum CPU frequency to use for dynamic frequency scaling. config EXAMPLE_MAX_CPU_FREQ_80 bool "80 MHz" + config EXAMPLE_MAX_CPU_FREQ_96 + bool "96 MHz" + depends on IDF_TARGET_ESP32H2 config EXAMPLE_MAX_CPU_FREQ_160 bool "160 MHz" config EXAMPLE_MAX_CPU_FREQ_240 @@ -19,12 +23,14 @@ menu "Example Configuration" config EXAMPLE_MAX_CPU_FREQ_MHZ int default 80 if EXAMPLE_MAX_CPU_FREQ_80 + default 96 if EXAMPLE_MAX_CPU_FREQ_96 default 160 if EXAMPLE_MAX_CPU_FREQ_160 default 240 if EXAMPLE_MAX_CPU_FREQ_240 choice EXAMPLE_MIN_CPU_FREQ prompt "Minimum CPU frequency" - default EXAMPLE_MIN_CPU_FREQ_40M + default EXAMPLE_MIN_CPU_FREQ_40M if !IDF_TARGET_ESP32H2 + default EXAMPLE_MIN_CPU_FREQ_32M if IDF_TARGET_ESP32H2 depends on PM_ENABLE help Minimum CPU frequency to use for dynamic frequency scaling. @@ -42,6 +48,10 @@ menu "Example Configuration" config EXAMPLE_MIN_CPU_FREQ_40M bool "40 MHz (use with 40MHz XTAL)" depends on XTAL_FREQ_40 || XTAL_FREQ_AUTO + config EXAMPLE_MIN_CPU_FREQ_32M + bool "32 MHz (use with 32MHz XTAL)" + depends on IDF_TARGET_ESP32H2 + depends on XTAL_FREQ_32 || XTAL_FREQ_AUTO config EXAMPLE_MIN_CPU_FREQ_20M bool "20 MHz (use with 40MHz XTAL)" depends on XTAL_FREQ_40 || XTAL_FREQ_AUTO @@ -54,6 +64,7 @@ menu "Example Configuration" int default 80 if EXAMPLE_MIN_CPU_FREQ_80M default 40 if EXAMPLE_MIN_CPU_FREQ_40M + default 32 if EXAMPLE_MIN_CPU_FREQ_32M default 20 if EXAMPLE_MIN_CPU_FREQ_20M default 10 if EXAMPLE_MIN_CPU_FREQ_10M diff --git a/examples/bluetooth/nimble/power_save/sdkconfig.32m.esp32h2 b/examples/bluetooth/nimble/power_save/sdkconfig.32m.esp32h2 new file mode 100644 index 0000000000..272c259232 --- /dev/null +++ b/examples/bluetooth/nimble/power_save/sdkconfig.32m.esp32h2 @@ -0,0 +1,23 @@ +CONFIG_IDF_TARGET="esp32h2" + +# Bluetooth Low Power Config +CONFIG_BT_LE_SLEEP_ENABLE=y +# CONFIG_BT_LE_WAKEUP_SOURCE_CPU_RTC_TIMER is not set +CONFIG_BT_LE_WAKEUP_SOURCE_BLE_RTC_TIMER=y +CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL=y +# CONFIG_BT_LE_LP_CLK_SRC_DEFAULT is not set + +# +# Power Management +# +CONFIG_PM_ENABLE=y +CONFIG_PM_DFS_INIT_AUTO=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +# end of Power Management + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y +# end of Sleep Config diff --git a/examples/bluetooth/nimble/power_save/sdkconfig.defaults.esp32h2 b/examples/bluetooth/nimble/power_save/sdkconfig.defaults.esp32h2 new file mode 100644 index 0000000000..d034fa5973 --- /dev/null +++ b/examples/bluetooth/nimble/power_save/sdkconfig.defaults.esp32h2 @@ -0,0 +1,32 @@ +CONFIG_IDF_TARGET="esp32h2" + +# Bluetooth Low Power Config +CONFIG_BT_LE_SLEEP_ENABLE=y +# CONFIG_BT_LE_WAKEUP_SOURCE_CPU_RTC_TIMER is not set +CONFIG_BT_LE_WAKEUP_SOURCE_BLE_RTC_TIMER=y +# CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL is not set +CONFIG_BT_LE_LP_CLK_SRC_DEFAULT=y + +# +# Power Management +# +CONFIG_PM_ENABLE=y +CONFIG_PM_DFS_INIT_AUTO=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP=y +# end of Power Management + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y +# end of Sleep Config + +# +# RTC Clock Config +# +# CONFIG_RTC_CLK_SRC_INT_RC is not set +CONFIG_RTC_CLK_SRC_EXT_CRYS=y +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_RC32K is not set +# end of RTC Clock Config