From a0d03a60cddf73d95d6700d8650ade35868ad64e Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 29 Aug 2022 13:28:21 +0800 Subject: [PATCH 1/2] legacy_timer: propagate isr register failure Closes https://github.com/espressif/esp-idf/issues/9651 --- components/driver/deprecated/timer_legacy.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/components/driver/deprecated/timer_legacy.c b/components/driver/deprecated/timer_legacy.c index eaafd18733a..d18713d4652 100644 --- a/components/driver/deprecated/timer_legacy.c +++ b/components/driver/deprecated/timer_legacy.c @@ -284,16 +284,18 @@ esp_err_t timer_isr_callback_add(timer_group_t group_num, timer_idx_t timer_num, ESP_RETURN_ON_FALSE(group_num < TIMER_GROUP_MAX, ESP_ERR_INVALID_ARG, TIMER_TAG, TIMER_GROUP_NUM_ERROR); ESP_RETURN_ON_FALSE(timer_num < TIMER_MAX, ESP_ERR_INVALID_ARG, TIMER_TAG, TIMER_NUM_ERROR); ESP_RETURN_ON_FALSE(p_timer_obj[group_num][timer_num] != NULL, ESP_ERR_INVALID_ARG, TIMER_TAG, TIMER_NEVER_INIT_ERROR); + esp_err_t ret = ESP_OK; timer_disable_intr(group_num, timer_num); p_timer_obj[group_num][timer_num]->timer_isr_fun.fn = isr_handler; p_timer_obj[group_num][timer_num]->timer_isr_fun.args = args; p_timer_obj[group_num][timer_num]->timer_isr_fun.isr_timer_group = group_num; - timer_isr_register(group_num, timer_num, timer_isr_default, (void *)p_timer_obj[group_num][timer_num], - intr_alloc_flags, &(p_timer_obj[group_num][timer_num]->timer_isr_fun.timer_isr_handle)); + ret = timer_isr_register(group_num, timer_num, timer_isr_default, (void *)p_timer_obj[group_num][timer_num], + intr_alloc_flags, &(p_timer_obj[group_num][timer_num]->timer_isr_fun.timer_isr_handle)); + ESP_RETURN_ON_ERROR(ret, TIMER_TAG, "register interrupt service failed"); timer_enable_intr(group_num, timer_num); - return ESP_OK; + return ret; } esp_err_t timer_isr_callback_remove(timer_group_t group_num, timer_idx_t timer_num) From 731db1c8739ca3e43a5987ea7e8e29d09003e734 Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 29 Aug 2022 15:18:06 +0800 Subject: [PATCH 2/2] mcpwm: fix multiplication overflow in converting us to compare ticks Closes https://github.com/espressif/esp-idf/issues/9648 --- components/driver/deprecated/mcpwm_legacy.c | 6 ++++-- components/driver/include/driver/mcpwm_types.h | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/components/driver/deprecated/mcpwm_legacy.c b/components/driver/deprecated/mcpwm_legacy.c index c7aeaa944cc..f2e52fa4b3a 100644 --- a/components/driver/deprecated/mcpwm_legacy.c +++ b/components/driver/deprecated/mcpwm_legacy.c @@ -298,9 +298,11 @@ esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_critical_enter(mcpwm_num); int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); - unsigned long int real_timer_clk_hz = + // to avid multiplication overflow, use uint64_t here + uint64_t real_timer_clk_hz = MCPWM_GROUP_CLK_SRC_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); - mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, duty_in_us * real_timer_clk_hz / 1000000); + uint64_t compare_val = real_timer_clk_hz * duty_in_us / 1000000; + mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, (uint32_t)compare_val); mcpwm_ll_operator_enable_update_compare_on_tez(hal->dev, op, cmp, true); mcpwm_critical_exit(mcpwm_num); return ESP_OK; diff --git a/components/driver/include/driver/mcpwm_types.h b/components/driver/include/driver/mcpwm_types.h index d50ba3c36ba..fcd736ae3e0 100644 --- a/components/driver/include/driver/mcpwm_types.h +++ b/components/driver/include/driver/mcpwm_types.h @@ -98,11 +98,11 @@ typedef struct { * @brief MCPWM fault event callback function * * @param fault MCPWM fault handle - * @param ev_data MCPWM fault event data, fed by driver + * @param edata MCPWM fault event data, fed by driver * @param user_ctx User data, set in `mcpwm_fault_register_event_callbacks()` * @return whether a task switch is needed after the callback returns */ -typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *ev_data, void *user_ctx); +typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *edata, void *user_ctx); /** * @brief MCPWM compare event data @@ -134,7 +134,7 @@ typedef struct { * @brief MCPWM capture event callback function * * @param cap_channel MCPWM capture channel handle - * @param ev_data MCPWM capture event data, fed by driver + * @param edata MCPWM capture event data, fed by driver * @param user_ctx User data, set in `mcpwm_capture_channel_register_event_callbacks()` * @return Whether a high priority task has been waken up by this function */