From 0dd9b899b731154cda1361a90fca1f76bc4e623b Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Mon, 2 Oct 2017 17:48:16 +1100 Subject: [PATCH] periph_ctrl: Refactor to add periph_module_reset(), avoid potential race in SPI DMA workaround Also refactor use of direct clock access in unit test ref_clock (probably not a real issue) --- .../driver/include/driver/periph_ctrl.h | 17 + components/driver/periph_ctrl.c | 382 ++++++++---------- components/driver/spi_common.c | 6 +- .../components/unity/ref_clock.c | 13 +- 4 files changed, 190 insertions(+), 228 deletions(-) diff --git a/components/driver/include/driver/periph_ctrl.h b/components/driver/include/driver/periph_ctrl.h index cd09a78f53..e523598fa0 100644 --- a/components/driver/include/driver/periph_ctrl.h +++ b/components/driver/include/driver/periph_ctrl.h @@ -56,6 +56,7 @@ typedef enum { * * @param[in] periph : Peripheral module name * + * Clock for the module will be ungated, and reset de-asserted. * * @return NULL * @@ -67,12 +68,28 @@ void periph_module_enable(periph_module_t periph); * * @param[in] periph : Peripheral module name * + * Clock for the module will be gated, reset asserted. * * @return NULL * */ void periph_module_disable(periph_module_t periph); +/** + * @brief reset peripheral module + * + * @param[in] periph : Peripheral module name + * + * Reset will asserted then de-assrted for the peripheral. + * + * Calling this function does not enable or disable the clock for the module. + * + * @return NULL + * + */ +void periph_module_reset(periph_module_t periph); + + #ifdef __cplusplus } #endif diff --git a/components/driver/periph_ctrl.c b/components/driver/periph_ctrl.c index 72cecf9e09..61793f290b 100644 --- a/components/driver/periph_ctrl.c +++ b/components/driver/periph_ctrl.c @@ -21,230 +21,180 @@ static portMUX_TYPE periph_spinlock = portMUX_INITIALIZER_UNLOCKED; +/* Static functions to return register address & mask for clk_en / rst of each peripheral */ +static uint32_t get_clk_en_mask(periph_module_t periph); +static uint32_t get_rst_en_mask(periph_module_t periph); +static uint32_t get_clk_en_reg(periph_module_t periph); +static uint32_t get_rst_en_reg(periph_module_t periph); + void periph_module_enable(periph_module_t periph) { portENTER_CRITICAL(&periph_spinlock); - switch(periph) { - case PERIPH_RMT_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); - break; - case PERIPH_LEDC_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_LEDC_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_LEDC_RST); - break; - case PERIPH_UART0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART_RST); - break; - case PERIPH_UART1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART1_RST); - break; - case PERIPH_UART2_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART2_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART2_RST); - break; - case PERIPH_I2C0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2C_EXT0_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2C_EXT0_RST); - break; - case PERIPH_I2C1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2C_EXT1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2C_EXT1_RST); - break; - case PERIPH_I2S0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S0_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S0_RST); - break; - case PERIPH_I2S1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S1_RST); - break; - case PERIPH_TIMG0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_TIMERGROUP_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_TIMERGROUP_RST); - break; - case PERIPH_TIMG1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_TIMERGROUP1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_TIMERGROUP1_RST); - break; - case PERIPH_PWM0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM0_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM0_RST); - break; - case PERIPH_PWM1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM1_RST); - break; - case PERIPH_PWM2_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM2_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM2_RST); - break; - case PERIPH_PWM3_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM3_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM3_RST); - break; - case PERIPH_UHCI0_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UHCI0_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UHCI0_RST); - break; - case PERIPH_UHCI1_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UHCI1_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UHCI1_RST); - break; - case PERIPH_PCNT_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PCNT_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PCNT_RST); - break; - case PERIPH_SPI_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN_1); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST_1); - break; - case PERIPH_HSPI_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST); - break; - case PERIPH_VSPI_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN_2); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST_2); - break; - case PERIPH_SPI_DMA_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_DMA_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); - break; - case PERIPH_SDMMC_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_SDIO_HOST_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_SDIO_HOST_RST); - break; - case PERIPH_SDIO_SLAVE_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_SDIOSLAVE_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_SDIO_RST); - break; - case PERIPH_CAN_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST); - break; - case PERIPH_EMAC_MODULE: - DPORT_SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_EMAC_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_EMAC_RST); - break; - default: - break; - } + DPORT_SET_PERI_REG_MASK(get_clk_en_reg(periph), get_clk_en_mask(periph)); + DPORT_CLEAR_PERI_REG_MASK(get_rst_en_reg(periph), get_rst_en_mask(periph)); portEXIT_CRITICAL(&periph_spinlock); } void periph_module_disable(periph_module_t periph) { portENTER_CRITICAL(&periph_spinlock); - switch(periph) { - case PERIPH_RMT_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); - break; - case PERIPH_LEDC_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_LEDC_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_LEDC_RST); - break; - case PERIPH_UART0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART_RST); - break; - case PERIPH_UART1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART1_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART1_RST); - break; - case PERIPH_UART2_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UART2_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UART2_RST); - break; - case PERIPH_I2C0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2C_EXT0_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2C_EXT0_RST); - break; - case PERIPH_I2C1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2C_EXT0_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2C_EXT1_RST); - break; - case PERIPH_I2S0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S0_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S0_RST); - break; - case PERIPH_I2S1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_I2S1_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_I2S1_RST); - break; - case PERIPH_TIMG0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_TIMERGROUP_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_TIMERGROUP_RST); - break; - case PERIPH_TIMG1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_TIMERGROUP1_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_TIMERGROUP1_RST); - break; - case PERIPH_PWM0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM0_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM0_RST); - break; - case PERIPH_PWM1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM1_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM1_RST); - break; - case PERIPH_PWM2_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM2_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM2_RST); - break; - case PERIPH_PWM3_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PWM3_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PWM3_RST); - break; - case PERIPH_UHCI0_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UHCI0_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UHCI0_RST); - break; - case PERIPH_UHCI1_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_UHCI1_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_UHCI1_RST); - break; - case PERIPH_PCNT_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PCNT_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PCNT_RST); - break; - case PERIPH_SPI_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN_1); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST_1); - break; - case PERIPH_HSPI_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST); - break; - case PERIPH_VSPI_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN_2); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_RST_2); - break; - case PERIPH_SPI_DMA_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_DMA_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); - break; - case PERIPH_SDMMC_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_SDIO_HOST_EN); - DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_SDIO_HOST_RST); - break; - case PERIPH_SDIO_SLAVE_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_SDIOSLAVE_EN); - DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_SDIO_RST); - break; - case PERIPH_CAN_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST); - break; - case PERIPH_EMAC_MODULE: - DPORT_CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, DPORT_WIFI_CLK_EMAC_EN); - DPORT_SET_PERI_REG_MASK(DPORT_CORE_RST_EN_REG, DPORT_EMAC_RST); - break; - default: - break; - } + DPORT_CLEAR_PERI_REG_MASK(get_clk_en_reg(periph), get_clk_en_mask(periph)); + DPORT_SET_PERI_REG_MASK(get_rst_en_reg(periph), get_rst_en_mask(periph)); portEXIT_CRITICAL(&periph_spinlock); } + +void periph_module_reset(periph_module_t periph) +{ + portENTER_CRITICAL(&periph_spinlock); + uint32_t rst_en = get_rst_en_mask(periph); + uint32_t mask = get_clk_en_mask(periph); + DPORT_SET_PERI_REG_MASK(rst_en, mask); + DPORT_CLEAR_PERI_REG_MASK(rst_en, mask); + portEXIT_CRITICAL(&periph_spinlock); +} + +static uint32_t get_clk_en_mask(periph_module_t periph) +{ + switch(periph) { + case PERIPH_RMT_MODULE: + return DPORT_RMT_CLK_EN; + case PERIPH_LEDC_MODULE: + return DPORT_LEDC_CLK_EN; + case PERIPH_UART0_MODULE: + return DPORT_UART_CLK_EN; + case PERIPH_UART1_MODULE: + return DPORT_UART1_CLK_EN; + case PERIPH_UART2_MODULE: + return DPORT_UART2_CLK_EN; + case PERIPH_I2C0_MODULE: + return DPORT_I2C_EXT0_CLK_EN; + case PERIPH_I2C1_MODULE: + return DPORT_I2C_EXT1_CLK_EN; + case PERIPH_I2S0_MODULE: + return DPORT_I2S0_CLK_EN; + case PERIPH_I2S1_MODULE: + return DPORT_I2S1_CLK_EN; + case PERIPH_TIMG0_MODULE: + return DPORT_TIMERGROUP_CLK_EN; + case PERIPH_TIMG1_MODULE: + return DPORT_TIMERGROUP1_CLK_EN; + case PERIPH_PWM0_MODULE: + return DPORT_PWM0_CLK_EN; + case PERIPH_PWM1_MODULE: + return DPORT_PWM1_CLK_EN; + case PERIPH_PWM2_MODULE: + return DPORT_PWM2_CLK_EN; + case PERIPH_PWM3_MODULE: + return DPORT_PWM3_CLK_EN; + case PERIPH_UHCI0_MODULE: + return DPORT_UHCI0_CLK_EN; + case PERIPH_UHCI1_MODULE: + return DPORT_UHCI1_CLK_EN; + case PERIPH_PCNT_MODULE: + return DPORT_PCNT_CLK_EN; + case PERIPH_SPI_MODULE: + return DPORT_SPI_CLK_EN_1; + case PERIPH_HSPI_MODULE: + return DPORT_SPI_CLK_EN; + case PERIPH_VSPI_MODULE: + return DPORT_SPI_CLK_EN_2; + case PERIPH_SPI_DMA_MODULE: + return DPORT_SPI_DMA_CLK_EN; + case PERIPH_SDMMC_MODULE: + return DPORT_WIFI_CLK_SDIO_HOST_EN; + case PERIPH_SDIO_SLAVE_MODULE: + return DPORT_WIFI_CLK_SDIOSLAVE_EN; + case PERIPH_CAN_MODULE: + return DPORT_CAN_CLK_EN; + case PERIPH_EMAC_MODULE: + return DPORT_WIFI_CLK_EMAC_EN; + default: + return 0; + } +} + +static uint32_t get_rst_en_mask(periph_module_t periph) +{ + switch(periph) { + case PERIPH_RMT_MODULE: + return DPORT_RMT_RST; + case PERIPH_LEDC_MODULE: + return DPORT_LEDC_RST; + case PERIPH_UART0_MODULE: + return DPORT_UART_RST; + case PERIPH_UART1_MODULE: + return DPORT_UART1_RST; + case PERIPH_UART2_MODULE: + return DPORT_UART2_RST; + case PERIPH_I2C0_MODULE: + return DPORT_I2C_EXT0_RST; + case PERIPH_I2C1_MODULE: + return DPORT_I2C_EXT1_RST; + case PERIPH_I2S0_MODULE: + return DPORT_I2S0_RST; + case PERIPH_I2S1_MODULE: + return DPORT_I2S1_RST; + case PERIPH_TIMG0_MODULE: + return DPORT_TIMERGROUP_RST; + case PERIPH_TIMG1_MODULE: + return DPORT_TIMERGROUP1_RST; + case PERIPH_PWM0_MODULE: + return DPORT_PWM0_RST; + case PERIPH_PWM1_MODULE: + return DPORT_PWM1_RST; + case PERIPH_PWM2_MODULE: + return DPORT_PWM2_RST; + case PERIPH_PWM3_MODULE: + return DPORT_PWM3_RST; + case PERIPH_UHCI0_MODULE: + return DPORT_UHCI0_RST; + case PERIPH_UHCI1_MODULE: + return DPORT_UHCI1_RST; + case PERIPH_PCNT_MODULE: + return DPORT_PCNT_RST; + case PERIPH_SPI_MODULE: + return DPORT_SPI_RST_1; + case PERIPH_HSPI_MODULE: + return DPORT_SPI_RST; + case PERIPH_VSPI_MODULE: + return DPORT_SPI_RST_2; + case PERIPH_SPI_DMA_MODULE: + return DPORT_SPI_DMA_RST; + case PERIPH_SDMMC_MODULE: + return DPORT_WIFI_CLK_SDIO_HOST_EN; + case PERIPH_SDIO_SLAVE_MODULE: + return DPORT_WIFI_CLK_SDIOSLAVE_EN; + case PERIPH_CAN_MODULE: + return DPORT_CAN_RST; + case PERIPH_EMAC_MODULE: + return DPORT_WIFI_CLK_EMAC_EN; + default: + return 0; + } +} + +static bool is_wifi_clk_peripheral(periph_module_t periph) +{ + /* A small subset of peripherals use WIFI_CLK_EN_REG and + CORE_RST_EN_REG for their clock & reset registers */ + switch(periph) { + case PERIPH_SDMMC_MODULE: + case PERIPH_SDIO_SLAVE_MODULE: + case PERIPH_EMAC_MODULE: + return true; + default: + return false; + } +} + +static uint32_t get_clk_en_reg(periph_module_t periph) +{ + return is_wifi_clk_peripheral(periph) ? DPORT_WIFI_CLK_EN_REG : DPORT_PERIP_CLK_EN_REG; +} + +static uint32_t get_rst_en_reg(periph_module_t periph) +{ + return is_wifi_clk_peripheral(periph) ? DPORT_CORE_RST_EN_REG : DPORT_PERIP_RST_EN_REG; +} + + diff --git a/components/driver/spi_common.c b/components/driver/spi_common.c index 01c6c41015..89d1f8c017 100644 --- a/components/driver/spi_common.c +++ b/components/driver/spi_common.c @@ -396,8 +396,7 @@ bool IRAM_ATTR spicommon_dmaworkaround_req_reset(int dmachan, dmaworkaround_cb_t ret = false; } else { //Reset DMA - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); + periph_module_reset( PERIPH_SPI_DMA_MODULE ); ret = true; } portEXIT_CRITICAL(&dmaworkaround_mux); @@ -415,8 +414,7 @@ void IRAM_ATTR spicommon_dmaworkaround_idle(int dmachan) dmaworkaround_channels_busy[dmachan-1] = 0; if (dmaworkaround_waiting_for_chan == dmachan) { //Reset DMA - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI_DMA_RST); + periph_module_reset( PERIPH_SPI_DMA_MODULE ); dmaworkaround_waiting_for_chan = 0; //Call callback dmaworkaround_cb(dmaworkaround_cb_arg); diff --git a/tools/unit-test-app/components/unity/ref_clock.c b/tools/unit-test-app/components/unity/ref_clock.c index ab732970bf..696bd0a4d3 100644 --- a/tools/unit-test-app/components/unity/ref_clock.c +++ b/tools/unit-test-app/components/unity/ref_clock.c @@ -41,6 +41,7 @@ #include "driver/gpio.h" #include "esp_intr_alloc.h" #include "freertos/FreeRTOS.h" +#include "driver/periph_ctrl.h" /* Select which RMT and PCNT channels, and GPIO to use */ #define REF_CLOCK_RMT_CHANNEL 7 @@ -64,8 +65,7 @@ void ref_clock_init() // Initialize RMT - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); + periph_module_enable(PERIPH_RMT_MODULE); RMT.apb_conf.fifo_mask = 1; rmt_item32_t data = { .duration0 = 1, @@ -101,8 +101,7 @@ void ref_clock_init() } // Initialize PCNT - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PCNT_CLK_EN); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PCNT_RST); + periph_module_enable(PERIPH_PCNT_MODULE); PCNT.conf_unit[REF_CLOCK_PCNT_UNIT].conf0.ch0_hctrl_mode = 0; PCNT.conf_unit[REF_CLOCK_PCNT_UNIT].conf0.ch0_lctrl_mode = 0; @@ -147,13 +146,11 @@ void ref_clock_deinit() // Disable RMT RMT.conf_ch[REF_CLOCK_RMT_CHANNEL].conf1.tx_start = 0; RMT.conf_ch[REF_CLOCK_RMT_CHANNEL].conf0.clk_en = 0; - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_RMT_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_RMT_RST); + periph_module_disable(PERIPH_RMT_MODULE); // Disable PCNT PCNT.ctrl.val |= ~(BIT(REF_CLOCK_PCNT_UNIT * 2 + 1)); - DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_PCNT_CLK_EN); - DPORT_SET_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_PCNT_RST); + periph_module_disable(PERIPH_PCNT_MODULE); } uint64_t ref_clock_get()