Răsfoiți Sursa

periph clock: implemented the modem module enable, disable and reset for esp32c6

Li Shuai 3 ani în urmă
părinte
comite
3ce896429c

+ 20 - 0
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

+ 0 - 4
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)

+ 3 - 3
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);

+ 0 - 24
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

+ 10 - 5
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*/