From 3ce896429cc884ca185c8e9d219da311c1aba30c Mon Sep 17 00:00:00 2001 From: Li Shuai Date: Fri, 23 Dec 2022 19:54:58 +0800 Subject: [PATCH] periph clock: implemented the modem module enable, disable and reset for esp32c6 --- components/esp_hw_support/periph_ctrl.c | 20 ++++++++++++++++ components/esp_phy/src/phy_init.c | 4 ---- .../port/soc/esp32c6/system_internal.c | 6 ++--- .../hal/esp32c6/include/hal/clk_gate_ll.h | 24 ------------------- .../soc/esp32c6/include/soc/periph_defs.h | 15 ++++++++---- 5 files changed, 33 insertions(+), 36 deletions(-) diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c index 8a226b236f..2d15173e8f 100644 --- a/components/esp_hw_support/periph_ctrl.c +++ b/components/esp_hw_support/periph_ctrl.c @@ -8,6 +8,10 @@ #include "esp_attr.h" #include "esp_private/periph_ctrl.h" +#if SOC_MODEM_CLOCK_IS_INDEPENDENT +#include "esp_private/esp_modem_clock.h" +#endif + static portMUX_TYPE periph_spinlock = portMUX_INITIALIZER_UNLOCKED; static uint8_t ref_counts[PERIPH_MODULE_MAX] = {0}; @@ -45,35 +49,51 @@ void periph_module_reset(periph_module_t periph) #if CONFIG_ESP32_WIFI_ENABLED IRAM_ATTR void wifi_bt_common_module_enable(void) { +#if SOC_MODEM_CLOCK_IS_INDEPENDENT + modem_clock_module_enable(PERIPH_PHY_MODULE); +#else portENTER_CRITICAL_SAFE(&periph_spinlock); if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { periph_ll_wifi_bt_module_enable_clk_clear_rst(); } ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; portEXIT_CRITICAL_SAFE(&periph_spinlock); +#endif } IRAM_ATTR void wifi_bt_common_module_disable(void) { +#if SOC_MODEM_CLOCK_IS_INDEPENDENT + modem_clock_module_disable(PERIPH_PHY_MODULE); +#else portENTER_CRITICAL_SAFE(&periph_spinlock); ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { periph_ll_wifi_bt_module_disable_clk_set_rst(); } portEXIT_CRITICAL_SAFE(&periph_spinlock); +#endif } void wifi_module_enable(void) { +#if SOC_MODEM_CLOCK_IS_INDEPENDENT + modem_clock_module_enable(PERIPH_WIFI_MODULE); +#else portENTER_CRITICAL_SAFE(&periph_spinlock); periph_ll_wifi_module_enable_clk_clear_rst(); portEXIT_CRITICAL_SAFE(&periph_spinlock); +#endif } void wifi_module_disable(void) { +#if SOC_MODEM_CLOCK_IS_INDEPENDENT + modem_clock_module_disable(PERIPH_WIFI_MODULE); +#else portENTER_CRITICAL_SAFE(&periph_spinlock); periph_ll_wifi_module_disable_clk_set_rst(); portEXIT_CRITICAL_SAFE(&periph_spinlock); +#endif } #endif // CONFIG_ESP32_WIFI_ENABLED diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index 1819dec6db..d6bfec15b3 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -205,16 +205,12 @@ static inline void phy_update_wifi_mac_time(bool en_clock_stopped, int64_t now) IRAM_ATTR void esp_phy_common_clock_enable(void) { -#if !CONFIG_IDF_TARGET_ESP32C6 // IDF-5679 wifi_bt_common_module_enable(); -#endif } IRAM_ATTR void esp_phy_common_clock_disable(void) { -#if !CONFIG_IDF_TARGET_ESP32C6 // IDF-5679 wifi_bt_common_module_disable(); -#endif } static inline void phy_digital_regs_store(void) diff --git a/components/esp_system/port/soc/esp32c6/system_internal.c b/components/esp_system/port/soc/esp32c6/system_internal.c index 70ebee49d8..a3661e43ac 100644 --- a/components/esp_system/port/soc/esp32c6/system_internal.c +++ b/components/esp_system/port/soc/esp32c6/system_internal.c @@ -19,6 +19,7 @@ #include "soc/rtc_periph.h" #include "soc/uart_reg.h" #include "hal/wdt_hal.h" +#include "hal/modem_syscon_ll.h" #include "esp_private/cache_err_int.h" #include "esp32c6/rom/cache.h" @@ -66,13 +67,12 @@ void IRAM_ATTR esp_restart_noos(void) // Reset wifi/bluetooth/ethernet/sdio (bb/mac) // Moved to module internal // SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, - // SYSTEM_WIFIMAC_RST | // TODO: IDF-5679 (esp_wifi) // SYSTEM_SDIO_RST | // SDIO_HINF_HINF_SDIO_RST? // SYSTEM_EMAC_RST | SYSTEM_MACPWR_RST | // TODO: IDF-5325 (ethernet) - // SYSTEM_BTBB_RST | SYSTEM_BTBB_REG_RST | // TODO: IDF-5727 (bt) - // SYSTEM_RW_BTMAC_RST | SYSTEM_RW_BTLP_RST | SYSTEM_RW_BTMAC_REG_RST | SYSTEM_RW_BTLP_REG_RST); // REG_WRITE(SYSTEM_CORE_RST_EN_REG, 0); + modem_syscon_ll_reset_all(&MODEM_SYSCON); + // Set Peripheral clk rst SET_PERI_REG_MASK(PCR_TIMERGROUP0_CONF_REG, PCR_TG0_RST_EN); SET_PERI_REG_MASK(PCR_TIMERGROUP1_CONF_REG, PCR_TG1_RST_EN); diff --git a/components/hal/esp32c6/include/hal/clk_gate_ll.h b/components/hal/esp32c6/include/hal/clk_gate_ll.h index 5d664bbea9..60e402a5ef 100644 --- a/components/hal/esp32c6/include/hal/clk_gate_ll.h +++ b/components/hal/esp32c6/include/hal/clk_gate_ll.h @@ -321,18 +321,6 @@ static inline void periph_ll_disable_clk_set_rst(periph_module_t periph) DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); } -static inline void IRAM_ATTR periph_ll_wifi_bt_module_enable_clk_clear_rst(void) -{ - // DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);// TODO: IDF-5679 - // DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); -} - -static inline void IRAM_ATTR periph_ll_wifi_bt_module_disable_clk_set_rst(void) -{ - // DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_BT_COMMON_M);// TODO: IDF-5679 - // DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); -} - static inline void periph_ll_reset(periph_module_t periph) { DPORT_SET_PERI_REG_MASK(periph_ll_get_rst_en_reg(periph), periph_ll_get_rst_en_mask(periph, false)); @@ -345,18 +333,6 @@ static inline bool IRAM_ATTR periph_ll_periph_enabled(periph_module_t periph) DPORT_REG_GET_BIT(periph_ll_get_clk_en_reg(periph), periph_ll_get_clk_en_mask(periph)) != 0; } -static inline void periph_ll_wifi_module_enable_clk_clear_rst(void) -{ - // DPORT_SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_EN_M); // TODO: IDF-5679 - // DPORT_CLEAR_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); -} - -static inline void periph_ll_wifi_module_disable_clk_set_rst(void) -{ - // DPORT_CLEAR_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_WIFI_EN_M); // TODO: IDF-5679 - // DPORT_SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG, 0); -} - #ifdef __cplusplus } #endif diff --git a/components/soc/esp32c6/include/soc/periph_defs.h b/components/soc/esp32c6/include/soc/periph_defs.h index 0214b03077..e2b2713aa7 100644 --- a/components/soc/esp32c6/include/soc/periph_defs.h +++ b/components/soc/esp32c6/include/soc/periph_defs.h @@ -27,11 +27,6 @@ typedef enum { PERIPH_TWAI0_MODULE, PERIPH_TWAI1_MODULE, PERIPH_RNG_MODULE, - PERIPH_WIFI_MODULE, - PERIPH_BT_MODULE, - PERIPH_WIFI_BT_COMMON_MODULE, - PERIPH_BT_BASEBAND_MODULE, - PERIPH_BT_LC_MODULE, PERIPH_RSA_MODULE, PERIPH_AES_MODULE, PERIPH_SHA_MODULE, @@ -44,9 +39,19 @@ typedef enum { PERIPH_SYSTIMER_MODULE, PERIPH_SARADC_MODULE, PERIPH_TEMPSENSOR_MODULE, + PERIPH_WIFI_MODULE, + PERIPH_BT_MODULE, + PERIPH_IEEE802154_MODULE, + PERIPH_COEX_MODULE, + PERIPH_PHY_MODULE, PERIPH_MODULE_MAX } periph_module_t; +#define PERIPH_MODEM_MODULE_MIN PERIPH_WIFI_MODULE +#define PERIPH_MODEM_MODULE_MAX PERIPH_PHY_MODULE +#define PERIPH_MODEM_MODULE_NUM (PERIPH_MODEM_MODULE_MAX - PERIPH_MODEM_MODULE_MIN + 1) +#define IS_MODEM_MODULE(periph) ((periph>=PERIPH_MODEM_MODULE_MIN) && (periph<=PERIPH_MODEM_MODULE_MAX)) + typedef enum { ETS_WIFI_MAC_INTR_SOURCE = 0, /**< interrupt of WiFi MAC, level*/ ETS_WIFI_MAC_NMI_SOURCE, /**< interrupt of WiFi MAC, NMI, use if MAC have bug to fix in NMI*/