From c082d130754caf725a38a01041891e84322e7a7a Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Mon, 22 Apr 2019 14:09:24 +0800 Subject: [PATCH 1/6] uart/driver: Add module reset before enabling This commit prevents infinite restarts caused due to an interrupt flag was left uncleared. Closes: https://github.com/espressif/esp-idf/issues/1981 Closes: IDF-188 --- components/driver/uart.c | 44 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/components/driver/uart.c b/components/driver/uart.c index 3367d1d04..253475a99 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -665,20 +665,35 @@ esp_err_t uart_set_tx_idle_num(uart_port_t uart_num, uint16_t idle_num) return ESP_OK; } +static periph_module_t get_periph_module(uart_port_t uart_num) +{ + periph_module_t periph_module = PERIPH_UART0_MODULE; + if (uart_num == UART_NUM_0) { + periph_module = PERIPH_UART0_MODULE; + } else if (uart_num == UART_NUM_1) { + periph_module = PERIPH_UART1_MODULE; + } +#if SOC_UART_NUM > 2 + else if (uart_num == UART_NUM_2) { + periph_module = PERIPH_UART2_MODULE; + } +#endif + else { + assert(0 && "uart_num error"); + } + return periph_module; +} + esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config) { esp_err_t r; UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_FAIL); UART_CHECK((uart_config), "param null", ESP_FAIL); - if(uart_num == UART_NUM_0) { - periph_module_enable(PERIPH_UART0_MODULE); - } else if(uart_num == UART_NUM_1) { - periph_module_enable(PERIPH_UART1_MODULE); -#if UART_NUM > 2 - } else if(uart_num == UART_NUM_2) { - periph_module_enable(PERIPH_UART2_MODULE); -#endif + periph_module_t periph_module = get_periph_module(uart_num); + if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM) { + periph_module_reset(periph_module); } + periph_module_enable(periph_module); r = uart_set_hw_flow_ctrl(uart_num, uart_config->flow_ctrl, uart_config->rx_flow_ctrl_thresh); if (r != ESP_OK) return r; @@ -1463,16 +1478,9 @@ esp_err_t uart_driver_delete(uart_port_t uart_num) free(p_uart_obj[uart_num]); p_uart_obj[uart_num] = NULL; - if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM ) { - if(uart_num == UART_NUM_0) { - periph_module_disable(PERIPH_UART0_MODULE); - } else if(uart_num == UART_NUM_1) { - periph_module_disable(PERIPH_UART1_MODULE); -#if UART_NUM > 2 - } else if(uart_num == UART_NUM_2) { - periph_module_disable(PERIPH_UART2_MODULE); -#endif - } + if (uart_num != CONFIG_ESP_CONSOLE_UART_NUM) { + periph_module_t periph_module = get_periph_module(uart_num); + periph_module_disable(periph_module); } return ESP_OK; } From d064cd485c0011bbc1edbc83133a1d41461f1f60 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Mon, 13 May 2019 19:45:18 +0800 Subject: [PATCH 2/6] can/driver: Add module reset before enabling --- components/driver/can.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/driver/can.c b/components/driver/can.c index ec843e492..933994b05 100644 --- a/components/driver/can.c +++ b/components/driver/can.c @@ -677,6 +677,7 @@ esp_err_t can_driver_install(const can_general_config_t *g_config, const can_tim ret = ESP_ERR_INVALID_STATE; goto err; } + periph_module_reset(PERIPH_CAN_MODULE); periph_module_enable(PERIPH_CAN_MODULE); //Enable APB CLK to CAN peripheral configASSERT(can_enter_reset_mode() == ESP_OK); //Must enter reset mode to write to config registers can_config_pelican(); //Use PeliCAN addresses From 437228e9477608cdb9dc5ad973bff909fe1329d9 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Mon, 13 May 2019 19:56:41 +0800 Subject: [PATCH 3/6] i2s/driver: Add module reset before enabling --- components/driver/i2s.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index fe90c9c78..10a38b15b 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -886,12 +886,6 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_t *i2s_co I2S_CHECK(!((i2s_config->mode & I2S_MODE_DAC_BUILT_IN) && (i2s_num != I2S_NUM_0)), "I2S DAC built-in only support on I2S0", ESP_ERR_INVALID_ARG); I2S_CHECK(!((i2s_config->mode & I2S_MODE_PDM) && (i2s_num != I2S_NUM_0)), "I2S DAC PDM only support on I2S0", ESP_ERR_INVALID_ARG); - if (i2s_num == I2S_NUM_1) { - periph_module_enable(PERIPH_I2S1_MODULE); - } else { - periph_module_enable(PERIPH_I2S0_MODULE); - } - if(i2s_config->mode & I2S_MODE_ADC_BUILT_IN) { //in ADC built-in mode, we need to call i2s_set_adc_mode to //initialize the specific ADC channel. @@ -1099,8 +1093,10 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, //To make sure hardware is enabled before any hardware register operations. if (i2s_num == I2S_NUM_1) { + periph_module_reset(PERIPH_I2S1_MODULE); periph_module_enable(PERIPH_I2S1_MODULE); } else { + periph_module_reset(PERIPH_I2S0_MODULE); periph_module_enable(PERIPH_I2S0_MODULE); } From 5c560e0cd1abb33aa6f7b5eb18843f4c3e5e5c11 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Mon, 13 May 2019 20:39:16 +0800 Subject: [PATCH 4/6] sdmmc_host/driver: Add module reset before enabling --- components/driver/sdmmc_host.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/driver/sdmmc_host.c b/components/driver/sdmmc_host.c index c1361829b..bab540175 100644 --- a/components/driver/sdmmc_host.c +++ b/components/driver/sdmmc_host.c @@ -222,6 +222,7 @@ esp_err_t sdmmc_host_init(void) return ESP_ERR_INVALID_STATE; } + periph_module_reset(PERIPH_SDMMC_MODULE); periph_module_enable(PERIPH_SDMMC_MODULE); // Enable clock to peripheral. Use smallest divider first. From a418b603d0b0b91699d80a144e8e00726d5adb89 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Tue, 14 May 2019 20:01:35 +0800 Subject: [PATCH 5/6] pcnt/driver: Add module reset before enabling --- components/driver/pcnt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/driver/pcnt.c b/components/driver/pcnt.c index 249a7f828..32ceb2348 100644 --- a/components/driver/pcnt.c +++ b/components/driver/pcnt.c @@ -58,6 +58,11 @@ esp_err_t pcnt_unit_config(const pcnt_config_t *pcnt_config) PCNT_CHECK((pcnt_config->pos_mode < PCNT_COUNT_MAX) && (pcnt_config->neg_mode < PCNT_COUNT_MAX), PCNT_COUNT_MODE_ERR_STR, ESP_ERR_INVALID_ARG); PCNT_CHECK((pcnt_config->hctrl_mode < PCNT_MODE_MAX) && (pcnt_config->lctrl_mode < PCNT_MODE_MAX), PCNT_CTRL_MODE_ERR_STR, ESP_ERR_INVALID_ARG); /*Enalbe hardware module*/ + static bool pcnt_enable = false; + if (pcnt_enable == false) { + periph_module_reset(PERIPH_PCNT_MODULE); + pcnt_enable = true; + } periph_module_enable(PERIPH_PCNT_MODULE); /*Set counter range*/ pcnt_set_event_value(unit, PCNT_EVT_H_LIM, pcnt_config->counter_h_lim); From 9a669bfbb913a8e4df927330c9b0aeb642088ba5 Mon Sep 17 00:00:00 2001 From: Konstantin Kondrashov Date: Tue, 14 May 2019 20:02:01 +0800 Subject: [PATCH 6/6] rmt/driver: Add module reset before enabling --- components/driver/rmt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/driver/rmt.c b/components/driver/rmt.c index 38380da30..966600a95 100644 --- a/components/driver/rmt.c +++ b/components/driver/rmt.c @@ -424,6 +424,11 @@ esp_err_t rmt_config(const rmt_config_t* rmt_param) RMT_CHECK((!carrier_en || carrier_freq_hz > 0), "RMT carrier frequency can't be zero", ESP_ERR_INVALID_ARG); } + static bool rmt_enable = false; + if (rmt_enable == false) { + periph_module_reset(PERIPH_RMT_MODULE); + rmt_enable = true; + } periph_module_enable(PERIPH_RMT_MODULE); RMT.conf_ch[channel].conf0.div_cnt = clk_div;