From a583cee39b7acfb5aaad92d0253e16c90459eaf8 Mon Sep 17 00:00:00 2001 From: morris Date: Tue, 21 Apr 2026 19:20:28 +0800 Subject: [PATCH] feat(rmt): move rmt retention info from esp_hal_rmt to esp_driver_rmt --- components/esp_driver_rmt/CMakeLists.txt | 6 ++- .../esp_driver_rmt/esp32c5/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32c6/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32h2/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32h21/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32h4/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32p4/rmt_retention.c | 40 +++++++++++++++++++ .../esp_driver_rmt/esp32s31/rmt_retention.c | 38 ++++++++++++++++++ components/esp_driver_rmt/src/rmt_common.c | 12 +++--- components/esp_driver_rmt/src/rmt_private.h | 15 ++++++- components/esp_hal_rmt/esp32/rmt_periph.c | 2 +- components/esp_hal_rmt/esp32c3/rmt_periph.c | 1 + components/esp_hal_rmt/esp32c5/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32c6/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32h2/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32h21/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32h4/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32p4/rmt_periph.c | 36 +---------------- components/esp_hal_rmt/esp32s2/rmt_periph.c | 1 + components/esp_hal_rmt/esp32s3/rmt_periph.c | 1 + components/esp_hal_rmt/esp32s31/rmt_periph.c | 32 +-------------- .../esp_hal_rmt/include/hal/rmt_periph.h | 21 +--------- 22 files changed, 321 insertions(+), 264 deletions(-) create mode 100644 components/esp_driver_rmt/esp32c5/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32c6/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32h2/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32h21/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32h4/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32p4/rmt_retention.c create mode 100644 components/esp_driver_rmt/esp32s31/rmt_retention.c diff --git a/components/esp_driver_rmt/CMakeLists.txt b/components/esp_driver_rmt/CMakeLists.txt index c578213d6a4..44f229e6717 100644 --- a/components/esp_driver_rmt/CMakeLists.txt +++ b/components/esp_driver_rmt/CMakeLists.txt @@ -10,6 +10,9 @@ if(CONFIG_SOC_RMT_SUPPORTED) "src/rmt_encoder_simple.c" "src/rmt_rx.c" "src/rmt_tx.c") + if(CONFIG_SOC_PAU_SUPPORTED AND CONFIG_SOC_RMT_SUPPORT_SLEEP_RETENTION) + list(APPEND srcs "${target}/rmt_retention.c") + endif() if(CONFIG_SOC_BITSCRAMBLER_SUPPORTED AND CONFIG_SOC_RMT_SUPPORT_DMA) list(APPEND srcs "src/rmt_encoder_bs.c") endif() @@ -26,7 +29,8 @@ endif() idf_component_register(SRCS ${srcs} INCLUDE_DIRS ${public_include} + PRIV_INCLUDE_DIRS "src" REQUIRES "${requires}" PRIV_REQUIRES "${priv_requires}" LDFRAGMENTS "linker.lf" - ) + ) diff --git a/components/esp_driver_rmt/esp32c5/rmt_retention.c b/components/esp_driver_rmt/esp32c5/rmt_retention.c new file mode 100644 index 00000000000..898e6aee1f0 --- /dev/null +++ b/components/esp_driver_rmt/esp32c5/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 17 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) +static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32c6/rmt_retention.c b/components/esp_driver_rmt/esp32c6/rmt_retention.c new file mode 100644 index 00000000000..898e6aee1f0 --- /dev/null +++ b/components/esp_driver_rmt/esp32c6/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 17 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) +static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32h2/rmt_retention.c b/components/esp_driver_rmt/esp32h2/rmt_retention.c new file mode 100644 index 00000000000..898e6aee1f0 --- /dev/null +++ b/components/esp_driver_rmt/esp32h2/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 17 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) +static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32h21/rmt_retention.c b/components/esp_driver_rmt/esp32h21/rmt_retention.c new file mode 100644 index 00000000000..898e6aee1f0 --- /dev/null +++ b/components/esp_driver_rmt/esp32h21/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 17 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) +static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32h4/rmt_retention.c b/components/esp_driver_rmt/esp32h4/rmt_retention.c new file mode 100644 index 00000000000..898e6aee1f0 --- /dev/null +++ b/components/esp_driver_rmt/esp32h4/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 17 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) +static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32p4/rmt_retention.c b/components/esp_driver_rmt/esp32p4/rmt_retention.c new file mode 100644 index 00000000000..cdff9e2faa3 --- /dev/null +++ b/components/esp_driver_rmt/esp32p4/rmt_retention.c @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 31 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x20) +static const uint32_t rmt_regs_map[4] = {0xff400fff, 0x3ff, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + // backup stage: save configuration registers + // restore stage: restore the configuration registers + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries) + }, +}; diff --git a/components/esp_driver_rmt/esp32s31/rmt_retention.c b/components/esp_driver_rmt/esp32s31/rmt_retention.c new file mode 100644 index 00000000000..b6895be5d4c --- /dev/null +++ b/components/esp_driver_rmt/esp32s31/rmt_retention.c @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "soc/rmt_reg.h" +#include "rmt_private.h" + +/** + * RMT Registers to be saved during sleep retention + * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG + * - TX synchronization registers, e.g.: RMT_TX_SIM_REG + * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG + * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG + * - Global configuration registers, e.g.: RMT_SYS_CONF_REG + */ +#define RMT_RETENTION_REGS_CNT 31 +#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x20) +static const uint32_t rmt_regs_map[4] = {0xff400fff, 0x3ff, 0x0, 0x0}; +static const regdma_entries_config_t rmt_regdma_entries[] = { + [0] = { + .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), + RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, + RMT_RETENTION_REGS_CNT, 0, 0, + rmt_regs_map[0], rmt_regs_map[1], + rmt_regs_map[2], rmt_regs_map[3]), + .owner = ENTRY(0) | ENTRY(2), + }, +}; + +const rmt_retention_desc_t rmt_retention_infos[1] = { + [0] = { + .module = SLEEP_RETENTION_MODULE_RMT0, + .regdma_entry_array = rmt_regdma_entries, + .array_size = ARRAY_SIZE(rmt_regdma_entries), + }, +}; diff --git a/components/esp_driver_rmt/src/rmt_common.c b/components/esp_driver_rmt/src/rmt_common.c index d509fef5b39..8cec373f142 100644 --- a/components/esp_driver_rmt/src/rmt_common.c +++ b/components/esp_driver_rmt/src/rmt_common.c @@ -45,7 +45,7 @@ rmt_group_t *rmt_acquire_group_handle(int group_id) rmt_ll_reset_register(group_id); } #if RMT_USE_RETENTION_LINK - sleep_retention_module_t module = rmt_reg_retention_info[group_id].module; + sleep_retention_module_t module = rmt_retention_infos[group_id].module; sleep_retention_module_init_param_t init_param = { .cbs = { .create = { @@ -104,7 +104,7 @@ void rmt_release_group_handle(rmt_group_t *group) if (do_deinitialize) { #if RMT_USE_RETENTION_LINK - sleep_retention_module_t module = rmt_reg_retention_info[group_id].module; + sleep_retention_module_t module = rmt_retention_infos[group_id].module; if (sleep_retention_is_module_created(module)) { sleep_retention_module_free(module); } @@ -279,16 +279,16 @@ static esp_err_t rmt_create_sleep_retention_link_cb(void *arg) { rmt_group_t *group = (rmt_group_t *)arg; int group_id = group->group_id; - esp_err_t err = sleep_retention_entries_create(rmt_reg_retention_info[group_id].regdma_entry_array, - rmt_reg_retention_info[group_id].array_size, - REGDMA_LINK_PRI_RMT, rmt_reg_retention_info[group_id].module); + esp_err_t err = sleep_retention_entries_create(rmt_retention_infos[group_id].regdma_entry_array, + rmt_retention_infos[group_id].array_size, + REGDMA_LINK_PRI_RMT, rmt_retention_infos[group_id].module); return err; } void rmt_create_retention_module(rmt_group_t *group) { int group_id = group->group_id; - sleep_retention_module_t module = rmt_reg_retention_info[group_id].module; + sleep_retention_module_t module = rmt_retention_infos[group_id].module; _lock_acquire(&s_platform.mutex); if (sleep_retention_is_module_inited(module) && !sleep_retention_is_module_created(module)) { if (sleep_retention_module_allocate(module) != ESP_OK) { diff --git a/components/esp_driver_rmt/src/rmt_private.h b/components/esp_driver_rmt/src/rmt_private.h index ffd6a6865c5..71070099e5d 100644 --- a/components/esp_driver_rmt/src/rmt_private.h +++ b/components/esp_driver_rmt/src/rmt_private.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -94,6 +94,19 @@ extern "C" { #define RMT_USE_RETENTION_LINK (SOC_RMT_SUPPORT_SLEEP_RETENTION && CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP) +#if SOC_RMT_SUPPORT_SLEEP_RETENTION +typedef struct { + periph_retention_module_t module; + const regdma_entries_config_t *regdma_entry_array; + uint32_t array_size; +} rmt_retention_desc_t; + +// TODO: implement the retention link on the channel level, this can: +// - save memory when not all RMT channels are used +// - specify different retention dependency, e.g. only RMT channel x is capable to use DMA, we only want to add the DMA dependency for that channel +extern const rmt_retention_desc_t rmt_retention_infos[RMT_LL_GET(INST_NUM)]; +#endif // SOC_RMT_SUPPORT_SLEEP_RETENTION + ///!< Logging settings #define TAG "rmt" diff --git a/components/esp_hal_rmt/esp32/rmt_periph.c b/components/esp_hal_rmt/esp32/rmt_periph.c index f27af906959..1bb0f50bf40 100644 --- a/components/esp_hal_rmt/esp32/rmt_periph.c +++ b/components/esp_hal_rmt/esp32/rmt_periph.c @@ -6,7 +6,7 @@ #include "hal/rmt_periph.h" #include "soc/gpio_sig_map.h" -#include "soc/soc.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { diff --git a/components/esp_hal_rmt/esp32c3/rmt_periph.c b/components/esp_hal_rmt/esp32c3/rmt_periph.c index e938ee07b10..e5503960a5f 100644 --- a/components/esp_hal_rmt/esp32c3/rmt_periph.c +++ b/components/esp_hal_rmt/esp32c3/rmt_periph.c @@ -6,6 +6,7 @@ #include "hal/rmt_periph.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { diff --git a/components/esp_hal_rmt/esp32c5/rmt_periph.c b/components/esp_hal_rmt/esp32c5/rmt_periph.c index 69458a85948..9b9597635cf 100644 --- a/components/esp_hal_rmt/esp32c5/rmt_periph.c +++ b/components/esp_hal_rmt/esp32c5/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -32,35 +32,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 17 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) -static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0) | ENTRY(2), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32c6/rmt_periph.c b/components/esp_hal_rmt/esp32c6/rmt_periph.c index 51ee06886fc..8c3a0005eb7 100644 --- a/components/esp_hal_rmt/esp32c6/rmt_periph.c +++ b/components/esp_hal_rmt/esp32c6/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -32,35 +32,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 17 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) -static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0) | ENTRY(2), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32h2/rmt_periph.c b/components/esp_hal_rmt/esp32h2/rmt_periph.c index 51ee06886fc..8c3a0005eb7 100644 --- a/components/esp_hal_rmt/esp32h2/rmt_periph.c +++ b/components/esp_hal_rmt/esp32h2/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -32,35 +32,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 17 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) -static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0) | ENTRY(2), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32h21/rmt_periph.c b/components/esp_hal_rmt/esp32h21/rmt_periph.c index 8aa6b814472..82f96152ad5 100644 --- a/components/esp_hal_rmt/esp32h21/rmt_periph.c +++ b/components/esp_hal_rmt/esp32h21/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -32,35 +32,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 17 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) -static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0) | ENTRY(2), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32h4/rmt_periph.c b/components/esp_hal_rmt/esp32h4/rmt_periph.c index 8aa6b814472..82f96152ad5 100644 --- a/components/esp_hal_rmt/esp32h4/rmt_periph.c +++ b/components/esp_hal_rmt/esp32h4/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -32,35 +32,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 17 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x10) -static const uint32_t rmt_regs_map[4] = {0xffd03f, 0x0, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0) | ENTRY(2), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32p4/rmt_periph.c b/components/esp_hal_rmt/esp32p4/rmt_periph.c index a30d52d0ca7..8bc204a19a1 100644 --- a/components/esp_hal_rmt/esp32p4/rmt_periph.c +++ b/components/esp_hal_rmt/esp32p4/rmt_periph.c @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "hal/rmt_periph.h" -#include "soc/rmt_reg.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -48,35 +48,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG -*/ -#define RMT_RETENTION_REGS_CNT 31 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x20) -static const uint32_t rmt_regs_map[4] = {0xff400fff, 0x3ff, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - // backup stage: save configuration registers - // restore stage: restore the configuration registers - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries) - }, -}; diff --git a/components/esp_hal_rmt/esp32s2/rmt_periph.c b/components/esp_hal_rmt/esp32s2/rmt_periph.c index 7f346f58440..b62d20b0532 100644 --- a/components/esp_hal_rmt/esp32s2/rmt_periph.c +++ b/components/esp_hal_rmt/esp32s2/rmt_periph.c @@ -6,6 +6,7 @@ #include "hal/rmt_periph.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { diff --git a/components/esp_hal_rmt/esp32s3/rmt_periph.c b/components/esp_hal_rmt/esp32s3/rmt_periph.c index 309a4482591..b324972bec2 100644 --- a/components/esp_hal_rmt/esp32s3/rmt_periph.c +++ b/components/esp_hal_rmt/esp32s3/rmt_periph.c @@ -6,6 +6,7 @@ #include "hal/rmt_periph.h" #include "soc/gpio_sig_map.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { diff --git a/components/esp_hal_rmt/esp32s31/rmt_periph.c b/components/esp_hal_rmt/esp32s31/rmt_periph.c index bf6bb99b0bb..973ad1d2779 100644 --- a/components/esp_hal_rmt/esp32s31/rmt_periph.c +++ b/components/esp_hal_rmt/esp32s31/rmt_periph.c @@ -6,7 +6,7 @@ #include "hal/rmt_periph.h" #include "soc/gpio_sig_map.h" -#include "soc/rmt_reg.h" +#include "soc/interrupts.h" const soc_rmt_signal_desc_t soc_rmt_signals[1] = { [0] = { @@ -48,33 +48,3 @@ const soc_rmt_signal_desc_t soc_rmt_signals[1] = { } } }; - -/** - * RMT Registers to be saved during sleep retention - * - Channel configuration registers, e.g.: RMT_CH0CONF0_REG, RMT_CH3CONF0_REG, RMT_CH3CONF1_REG, RMT_CH0_TX_LIM_REG, RMT_CH3_RX_LIM_REG - * - TX synchronization registers, e.g.: RMT_TX_SIM_REG - * - Interrupt enable registers, e.g.: RMT_INT_ENA_REG - * - Carrier duty registers, e.g.: RMT_CH0CARRIER_DUTY_REG, RMT_CH3_RX_CARRIER_RM_REG - * - Global configuration registers, e.g.: RMT_SYS_CONF_REG - */ -#define RMT_RETENTION_REGS_CNT 31 -#define RMT_RETENTION_REGS_BASE (DR_REG_RMT_BASE + 0x20) -static const uint32_t rmt_regs_map[4] = {0xff400fff, 0x3ff, 0x0, 0x0}; -static const regdma_entries_config_t rmt_regdma_entries[] = { - [0] = { - .config = REGDMA_LINK_ADDR_MAP_INIT(REGDMA_RMT_LINK(0x00), - RMT_RETENTION_REGS_BASE, RMT_RETENTION_REGS_BASE, - RMT_RETENTION_REGS_CNT, 0, 0, - rmt_regs_map[0], rmt_regs_map[1], - rmt_regs_map[2], rmt_regs_map[3]), - .owner = ENTRY(0), - }, -}; - -const rmt_reg_retention_info_t rmt_reg_retention_info[1] = { - [0] = { - .module = SLEEP_RETENTION_MODULE_RMT0, - .regdma_entry_array = rmt_regdma_entries, - .array_size = ARRAY_SIZE(rmt_regdma_entries), - }, -}; diff --git a/components/esp_hal_rmt/include/hal/rmt_periph.h b/components/esp_hal_rmt/include/hal/rmt_periph.h index 4effffa3f8a..54685531d85 100644 --- a/components/esp_hal_rmt/include/hal/rmt_periph.h +++ b/components/esp_hal_rmt/include/hal/rmt_periph.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -7,16 +7,10 @@ #pragma once #include "soc/soc_caps.h" -#include "soc/periph_defs.h" -#include "soc/regdma.h" #if SOC_HAS(RMT) #include "hal/rmt_ll.h" #endif -#if SOC_RMT_SUPPORT_SLEEP_RETENTION -#include "soc/retention_periph_defs.h" -#endif - #ifdef __cplusplus extern "C" { #endif @@ -36,19 +30,6 @@ typedef struct { extern const soc_rmt_signal_desc_t soc_rmt_signals[RMT_LL_GET(INST_NUM)]; -#if SOC_RMT_SUPPORT_SLEEP_RETENTION -typedef struct { - periph_retention_module_t module; - const regdma_entries_config_t *regdma_entry_array; - uint32_t array_size; -} rmt_reg_retention_info_t; - -// TODO: implement the retention link on the channel level, this can: -// - save memory when not all RMT channels are used -// - specify different retention dependency, e.g. only RMT channel x is capable to use DMA, we only want to add the DMA dependency for that channel -extern const rmt_reg_retention_info_t rmt_reg_retention_info[RMT_LL_GET(INST_NUM)]; -#endif // SOC_RMT_SUPPORT_SLEEP_RETENTION - #endif // SOC_HAS(RMT) #ifdef __cplusplus