From 855492fa2e8a8102e6fcfcbfa122ac683f610e51 Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Wed, 6 Aug 2025 19:42:35 +0800 Subject: [PATCH] change(hal): add hal interface to configure pau regdma wait timeout parameter --- components/esp_hw_support/port/pau_regdma.c | 4 ++++ components/hal/esp32c6/include/hal/pau_ll.h | 10 ++++++++++ components/hal/esp32c6/pau_hal.c | 7 +++++++ components/hal/esp32h2/include/hal/pau_ll.h | 10 ++++++++++ components/hal/esp32h2/pau_hal.c | 7 +++++++ components/hal/include/hal/pau_hal.h | 9 +++++++++ 6 files changed, 47 insertions(+) diff --git a/components/esp_hw_support/port/pau_regdma.c b/components/esp_hw_support/port/pau_regdma.c index 0ff2a8e6cd..1ce4646e3f 100644 --- a/components/esp_hw_support/port/pau_regdma.c +++ b/components/esp_hw_support/port/pau_regdma.c @@ -15,6 +15,9 @@ #include "esp_private/esp_pau.h" #include "esp_private/periph_ctrl.h" +#define PAU_REGDMA_LINK_WAIT_RETRY_COUNT (1000) +#define PAU_REGDMA_LINK_WAIT_READ_INTERNAL (32) + static __attribute__((unused)) const char *TAG = "pau_regdma"; typedef struct { @@ -32,6 +35,7 @@ pau_context_t * __attribute__((weak)) IRAM_ATTR PAU_instance(void) if (pau_hal.dev == NULL) { pau_hal.dev = &PAU; periph_module_enable(PERIPH_REGDMA_MODULE); + pau_hal_set_regdma_wait_timeout(&pau_hal, PAU_REGDMA_LINK_WAIT_RETRY_COUNT, PAU_REGDMA_LINK_WAIT_READ_INTERNAL); } return &pau_context; diff --git a/components/hal/esp32c6/include/hal/pau_ll.h b/components/hal/esp32c6/include/hal/pau_ll.h index 8fb18d7146..139d44403e 100644 --- a/components/hal/esp32c6/include/hal/pau_ll.h +++ b/components/hal/esp32c6/include/hal/pau_ll.h @@ -150,6 +150,16 @@ static inline void pau_ll_clear_regdma_backup_error_intr_state(pau_dev_t *dev) dev->int_clr.error_int_clr = 1; } +static inline void pau_ll_set_regdma_link_wait_retry_count(pau_dev_t *dev, int count) +{ + dev->regdma_bkp_conf.link_tout_thres = count; +} + +static inline void pau_ll_set_regdma_link_wait_read_interval(pau_dev_t *dev, int interval) +{ + dev->regdma_bkp_conf.read_interval = interval; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c6/pau_hal.c b/components/hal/esp32c6/pau_hal.c index 53be6120c3..a7b918d8d6 100644 --- a/components/hal/esp32c6/pau_hal.c +++ b/components/hal/esp32c6/pau_hal.c @@ -56,3 +56,10 @@ void IRAM_ATTR pau_hal_stop_regdma_extra_link(pau_hal_context_t *hal) pau_ll_select_regdma_entry_link(hal->dev, 0); /* restore link select to default */ pau_ll_clear_regdma_backup_done_intr_state(hal->dev); } + +void pau_hal_set_regdma_wait_timeout(pau_hal_context_t *hal, int count, int interval) +{ + HAL_ASSERT(count > 0 && interval > 0); + pau_ll_set_regdma_link_wait_retry_count(hal->dev, count); + pau_ll_set_regdma_link_wait_read_interval(hal->dev, interval); +} diff --git a/components/hal/esp32h2/include/hal/pau_ll.h b/components/hal/esp32h2/include/hal/pau_ll.h index 98f730ff25..3bd45e9b7f 100644 --- a/components/hal/esp32h2/include/hal/pau_ll.h +++ b/components/hal/esp32h2/include/hal/pau_ll.h @@ -120,6 +120,16 @@ static inline __attribute__((always_inline)) void pau_ll_clear_regdma_backup_err dev->int_clr.error_int_clr = 1; } +static inline void pau_ll_set_regdma_link_wait_retry_count(pau_dev_t *dev, int count) +{ + dev->regdma_bkp_conf.link_tout_thres = count; +} + +static inline void pau_ll_set_regdma_link_wait_read_interval(pau_dev_t *dev, int interval) +{ + dev->regdma_bkp_conf.read_interval = interval; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/pau_hal.c b/components/hal/esp32h2/pau_hal.c index 6eeaaef002..0cbc01ca80 100644 --- a/components/hal/esp32h2/pau_hal.c +++ b/components/hal/esp32h2/pau_hal.c @@ -41,3 +41,10 @@ void IRAM_ATTR pau_hal_regdma_clock_configure(pau_hal_context_t *hal, bool enabl HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.regdma_conf, regdma_rst_en, !enable); HAL_FORCE_MODIFY_U32_REG_FIELD(PCR.regdma_conf, regdma_clk_en, enable); } + +void pau_hal_set_regdma_wait_timeout(pau_hal_context_t *hal, int count, int interval) +{ + HAL_ASSERT(count > 0 && interval > 0); + pau_ll_set_regdma_link_wait_retry_count(hal->dev, count); + pau_ll_set_regdma_link_wait_read_interval(hal->dev, interval); +} diff --git a/components/hal/include/hal/pau_hal.h b/components/hal/include/hal/pau_hal.h index 4853cfa304..8893b95de9 100644 --- a/components/hal/include/hal/pau_hal.h +++ b/components/hal/include/hal/pau_hal.h @@ -111,6 +111,15 @@ void pau_hal_stop_regdma_extra_link(pau_hal_context_t *hal); void pau_hal_regdma_clock_configure(pau_hal_context_t *hal, bool enable); #endif +/** + * @brief Set regdma link wait timeout, include wait retry count and register read interval + * + * @param hal regdma hal context + * @param count the maximum number of regdma wait retry count + * @param interval the interval of regdma wait link to read register + */ +void pau_hal_set_regdma_wait_timeout(pau_hal_context_t *hal, int count, int interval); + #endif #ifdef __cplusplus