From 6397820d0b2c67d34aed11bd1b4a2a8627942cd8 Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Fri, 16 May 2025 17:38:22 +0800 Subject: [PATCH] fix(rmt): only call esp_pm APIs when CONFIG_PM_ENABLE is enabled --- components/esp_driver_rmt/src/rmt_common.c | 4 ++-- components/esp_driver_rmt/src/rmt_private.h | 2 +- components/esp_driver_rmt/src/rmt_rx.c | 7 +++++++ components/esp_driver_rmt/src/rmt_tx.c | 6 ++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_rmt/src/rmt_common.c b/components/esp_driver_rmt/src/rmt_common.c index ba6c0a5e7d..83d4b6eb3d 100644 --- a/components/esp_driver_rmt/src/rmt_common.c +++ b/components/esp_driver_rmt/src/rmt_common.c @@ -143,7 +143,7 @@ void rmt_release_group_handle(rmt_group_t *group) } #if !SOC_RMT_CHANNEL_CLK_INDEPENDENT -static esp_err_t s_rmt_set_group_prescale(rmt_channel_t *chan, uint32_t expect_resolution_hz, uint32_t *ret_channel_prescale) +static esp_err_t rmt_set_group_prescale(rmt_channel_t *chan, uint32_t expect_resolution_hz, uint32_t *ret_channel_prescale) { uint32_t periph_src_clk_hz = 0; rmt_group_t *group = chan->group; @@ -256,7 +256,7 @@ esp_err_t rmt_select_periph_clock(rmt_channel_handle_t chan, rmt_clock_source_t real_div = (group->resolution_hz + expect_channel_resolution / 2) / expect_channel_resolution; #else // set division for group clock source, to achieve highest resolution while guaranteeing the channel resolution. - ESP_RETURN_ON_ERROR(s_rmt_set_group_prescale(chan, expect_channel_resolution, &real_div), TAG, "set rmt group prescale failed"); + ESP_RETURN_ON_ERROR(rmt_set_group_prescale(chan, expect_channel_resolution, &real_div), TAG, "set rmt group prescale failed"); #endif // SOC_RMT_CHANNEL_CLK_INDEPENDENT if (chan->direction == RMT_CHANNEL_DIRECTION_TX) { diff --git a/components/esp_driver_rmt/src/rmt_private.h b/components/esp_driver_rmt/src/rmt_private.h index 73c97f6fb5..0d073a4333 100644 --- a/components/esp_driver_rmt/src/rmt_private.h +++ b/components/esp_driver_rmt/src/rmt_private.h @@ -159,8 +159,8 @@ struct rmt_channel_t { rmt_channel_direction_t direction; // channel direction rmt_symbol_word_t *hw_mem_base; // base address of RMT channel hardware memory gdma_channel_handle_t dma_chan; // DMA channel - esp_pm_lock_handle_t pm_lock; // power management lock #if CONFIG_PM_ENABLE + esp_pm_lock_handle_t pm_lock; // power management lock char pm_lock_name[RMT_PM_LOCK_NAME_LEN_MAX]; // pm lock name #endif // RMT channel common interface diff --git a/components/esp_driver_rmt/src/rmt_rx.c b/components/esp_driver_rmt/src/rmt_rx.c index 2b1b88bb68..31e481d3fb 100644 --- a/components/esp_driver_rmt/src/rmt_rx.c +++ b/components/esp_driver_rmt/src/rmt_rx.c @@ -148,9 +148,11 @@ static esp_err_t rmt_rx_destroy(rmt_rx_channel_t *rx_channel) if (rx_channel->base.intr) { ESP_RETURN_ON_ERROR(esp_intr_free(rx_channel->base.intr), TAG, "delete interrupt service failed"); } +#if CONFIG_PM_ENABLE if (rx_channel->base.pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_delete(rx_channel->base.pm_lock), TAG, "delete pm_lock failed"); } +#endif #if SOC_RMT_SUPPORT_DMA if (rx_channel->base.dma_chan) { ESP_RETURN_ON_ERROR(gdma_del_channel(rx_channel->base.dma_chan), TAG, "delete dma channel failed"); @@ -499,10 +501,13 @@ static esp_err_t rmt_rx_enable(rmt_channel_handle_t channel) rmt_hal_context_t *hal = &group->hal; int channel_id = channel->channel_id; +#if CONFIG_PM_ENABLE // acquire power manager lock if (channel->pm_lock) { esp_pm_lock_acquire(channel->pm_lock); } +#endif + if (channel->dma_chan) { #if SOC_RMT_SUPPORT_DMA // enable the DMA access mode @@ -560,10 +565,12 @@ static esp_err_t rmt_rx_disable(rmt_channel_handle_t channel) portEXIT_CRITICAL(&group->spinlock); } +#if CONFIG_PM_ENABLE // release power manager lock if (channel->pm_lock) { esp_pm_lock_release(channel->pm_lock); } +#endif // now we can switch the state to init atomic_store(&channel->fsm, RMT_FSM_INIT); diff --git a/components/esp_driver_rmt/src/rmt_tx.c b/components/esp_driver_rmt/src/rmt_tx.c index 79bd447cda..cec8bc4c22 100644 --- a/components/esp_driver_rmt/src/rmt_tx.c +++ b/components/esp_driver_rmt/src/rmt_tx.c @@ -203,9 +203,11 @@ static esp_err_t rmt_tx_destroy(rmt_tx_channel_t *tx_channel) if (tx_channel->base.intr) { ESP_RETURN_ON_ERROR(esp_intr_free(tx_channel->base.intr), TAG, "delete interrupt service failed"); } +#if CONFIG_PM_ENABLE if (tx_channel->base.pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_delete(tx_channel->base.pm_lock), TAG, "delete pm_lock failed"); } +#endif #if SOC_RMT_SUPPORT_DMA if (tx_channel->base.dma_chan) { ESP_RETURN_ON_ERROR(gdma_del_channel(tx_channel->base.dma_chan), TAG, "delete dma channel failed"); @@ -766,10 +768,12 @@ static esp_err_t rmt_tx_enable(rmt_channel_handle_t channel) ESP_ERR_INVALID_STATE, TAG, "channel not in init state"); rmt_tx_channel_t *tx_chan = __containerof(channel, rmt_tx_channel_t, base); +#if CONFIG_PM_ENABLE // acquire power manager lock if (channel->pm_lock) { esp_pm_lock_acquire(channel->pm_lock); } +#endif #if SOC_RMT_SUPPORT_DMA rmt_group_t *group = channel->group; @@ -860,10 +864,12 @@ static esp_err_t rmt_tx_disable(rmt_channel_handle_t channel) } tx_chan->cur_trans = NULL; +#if CONFIG_PM_ENABLE // release power manager lock if (channel->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_release(channel->pm_lock), TAG, "release pm_lock failed"); } +#endif // finally we switch to the INIT state atomic_store(&channel->fsm, RMT_FSM_INIT);