mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-05 21:54:33 +02:00
periph clock: implemented the modem module enable, disable and reset for esp32c6
This commit is contained in:
@@ -8,6 +8,10 @@
|
|||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "esp_private/periph_ctrl.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 portMUX_TYPE periph_spinlock = portMUX_INITIALIZER_UNLOCKED;
|
||||||
|
|
||||||
static uint8_t ref_counts[PERIPH_MODULE_MAX] = {0};
|
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
|
#if CONFIG_ESP32_WIFI_ENABLED
|
||||||
IRAM_ATTR void wifi_bt_common_module_enable(void)
|
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);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
||||||
periph_ll_wifi_bt_module_enable_clk_clear_rst();
|
periph_ll_wifi_bt_module_enable_clk_clear_rst();
|
||||||
}
|
}
|
||||||
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++;
|
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++;
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
IRAM_ATTR void wifi_bt_common_module_disable(void)
|
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);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--;
|
ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--;
|
||||||
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) {
|
||||||
periph_ll_wifi_bt_module_disable_clk_set_rst();
|
periph_ll_wifi_bt_module_disable_clk_set_rst();
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wifi_module_enable(void)
|
void wifi_module_enable(void)
|
||||||
{
|
{
|
||||||
|
#if SOC_MODEM_CLOCK_IS_INDEPENDENT
|
||||||
|
modem_clock_module_enable(PERIPH_WIFI_MODULE);
|
||||||
|
#else
|
||||||
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
periph_ll_wifi_module_enable_clk_clear_rst();
|
periph_ll_wifi_module_enable_clk_clear_rst();
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wifi_module_disable(void)
|
void wifi_module_disable(void)
|
||||||
{
|
{
|
||||||
|
#if SOC_MODEM_CLOCK_IS_INDEPENDENT
|
||||||
|
modem_clock_module_disable(PERIPH_WIFI_MODULE);
|
||||||
|
#else
|
||||||
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
portENTER_CRITICAL_SAFE(&periph_spinlock);
|
||||||
periph_ll_wifi_module_disable_clk_set_rst();
|
periph_ll_wifi_module_disable_clk_set_rst();
|
||||||
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
portEXIT_CRITICAL_SAFE(&periph_spinlock);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif // CONFIG_ESP32_WIFI_ENABLED
|
#endif // CONFIG_ESP32_WIFI_ENABLED
|
||||||
|
@@ -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)
|
IRAM_ATTR void esp_phy_common_clock_enable(void)
|
||||||
{
|
{
|
||||||
#if !CONFIG_IDF_TARGET_ESP32C6 // IDF-5679
|
|
||||||
wifi_bt_common_module_enable();
|
wifi_bt_common_module_enable();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IRAM_ATTR void esp_phy_common_clock_disable(void)
|
IRAM_ATTR void esp_phy_common_clock_disable(void)
|
||||||
{
|
{
|
||||||
#if !CONFIG_IDF_TARGET_ESP32C6 // IDF-5679
|
|
||||||
wifi_bt_common_module_disable();
|
wifi_bt_common_module_disable();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void phy_digital_regs_store(void)
|
static inline void phy_digital_regs_store(void)
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#include "soc/rtc_periph.h"
|
#include "soc/rtc_periph.h"
|
||||||
#include "soc/uart_reg.h"
|
#include "soc/uart_reg.h"
|
||||||
#include "hal/wdt_hal.h"
|
#include "hal/wdt_hal.h"
|
||||||
|
#include "hal/modem_syscon_ll.h"
|
||||||
#include "esp_private/cache_err_int.h"
|
#include "esp_private/cache_err_int.h"
|
||||||
|
|
||||||
#include "esp32c6/rom/cache.h"
|
#include "esp32c6/rom/cache.h"
|
||||||
@@ -66,13 +67,12 @@ void IRAM_ATTR esp_restart_noos(void)
|
|||||||
// Reset wifi/bluetooth/ethernet/sdio (bb/mac)
|
// Reset wifi/bluetooth/ethernet/sdio (bb/mac)
|
||||||
// Moved to module internal
|
// Moved to module internal
|
||||||
// SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG,
|
// 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_SDIO_RST | // SDIO_HINF_HINF_SDIO_RST?
|
||||||
// SYSTEM_EMAC_RST | SYSTEM_MACPWR_RST | // TODO: IDF-5325 (ethernet)
|
// 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);
|
// REG_WRITE(SYSTEM_CORE_RST_EN_REG, 0);
|
||||||
|
|
||||||
|
modem_syscon_ll_reset_all(&MODEM_SYSCON);
|
||||||
|
|
||||||
// Set Peripheral clk rst
|
// Set Peripheral clk rst
|
||||||
SET_PERI_REG_MASK(PCR_TIMERGROUP0_CONF_REG, PCR_TG0_RST_EN);
|
SET_PERI_REG_MASK(PCR_TIMERGROUP0_CONF_REG, PCR_TG0_RST_EN);
|
||||||
SET_PERI_REG_MASK(PCR_TIMERGROUP1_CONF_REG, PCR_TG1_RST_EN);
|
SET_PERI_REG_MASK(PCR_TIMERGROUP1_CONF_REG, PCR_TG1_RST_EN);
|
||||||
|
@@ -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));
|
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)
|
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));
|
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;
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -27,11 +27,6 @@ typedef enum {
|
|||||||
PERIPH_TWAI0_MODULE,
|
PERIPH_TWAI0_MODULE,
|
||||||
PERIPH_TWAI1_MODULE,
|
PERIPH_TWAI1_MODULE,
|
||||||
PERIPH_RNG_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_RSA_MODULE,
|
||||||
PERIPH_AES_MODULE,
|
PERIPH_AES_MODULE,
|
||||||
PERIPH_SHA_MODULE,
|
PERIPH_SHA_MODULE,
|
||||||
@@ -44,9 +39,19 @@ typedef enum {
|
|||||||
PERIPH_SYSTIMER_MODULE,
|
PERIPH_SYSTIMER_MODULE,
|
||||||
PERIPH_SARADC_MODULE,
|
PERIPH_SARADC_MODULE,
|
||||||
PERIPH_TEMPSENSOR_MODULE,
|
PERIPH_TEMPSENSOR_MODULE,
|
||||||
|
PERIPH_WIFI_MODULE,
|
||||||
|
PERIPH_BT_MODULE,
|
||||||
|
PERIPH_IEEE802154_MODULE,
|
||||||
|
PERIPH_COEX_MODULE,
|
||||||
|
PERIPH_PHY_MODULE,
|
||||||
PERIPH_MODULE_MAX
|
PERIPH_MODULE_MAX
|
||||||
} periph_module_t;
|
} 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 {
|
typedef enum {
|
||||||
ETS_WIFI_MAC_INTR_SOURCE = 0, /**< interrupt of WiFi MAC, level*/
|
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*/
|
ETS_WIFI_MAC_NMI_SOURCE, /**< interrupt of WiFi MAC, NMI, use if MAC have bug to fix in NMI*/
|
||||||
|
Reference in New Issue
Block a user