/* * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include "sdkconfig.h" #include "soc/soc_caps.h" #include "phy_init_data.h" #include "esp_private/phy.h" #include "esp_check.h" const char __attribute__((section(".rodata"))) phy_init_magic_pre[] = PHY_INIT_MAGIC; /** * @brief Structure containing default recommended PHY initialization parameters. */ const esp_phy_init_data_t phy_init_data= { { 0x1, 0x0, LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x54), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x54), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x48), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x44), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x48), 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x51 } }; const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_MAGIC; #if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #include "esp_private/sleep_retention.h" static const char* TAG = "phy_sleep"; static _lock_t s_phy_fe_retention_lock; uint8_t s_phy_fe_retention_ref = 0; #endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD static esp_err_t sleep_retention_wifi_bb_init(void *arg) { #define N_REGS_WIFI_AGC() (130) #define N_REGS_WIFI_TX() (30) #define N_REGS_WIFI_NRX() (145) #define N_REGS_WIFI_BB() (82) #define N_REGS_WIFI_BRX() (39) const static sleep_retention_entries_config_t bb_regs_retention[] = { [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b00, 0x600a7000, 0x600a7000, N_REGS_WIFI_AGC(), 0, 0), .owner = BIT(0) | BIT(1) }, /* AGC */ [1] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b01, 0x600a7400, 0x600a7400, N_REGS_WIFI_TX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* TX */ [2] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b02, 0x600a7800, 0x600a7800, N_REGS_WIFI_NRX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* NRX */ [3] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b03, 0x600a7c00, 0x600a7c00, N_REGS_WIFI_BB(), 0, 0), .owner = BIT(0) | BIT(1) }, /* BB */ [4] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b04, 0x600a8000, 0x600a8000, N_REGS_WIFI_BRX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* BRX */ }; esp_err_t err = sleep_retention_entries_create(bb_regs_retention, ARRAY_SIZE(bb_regs_retention), 3, SLEEP_RETENTION_MODULE_WIFI_BB); ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for modem (%s) retention", "WiFi BB"); ESP_LOGD(TAG, "WiFi BB sleep retention initialization"); return ESP_OK; } esp_err_t esp_phy_wifi_bb_sleep_retention_attach(void) { esp_err_t err = sleep_retention_module_attach(SLEEP_RETENTION_MODULE_WIFI_BB); if (err != ESP_OK) { ESP_LOGW(TAG, "failed to attach sleep retention linked list for wifi bb retention"); } return err; } esp_err_t esp_phy_wifi_bb_sleep_retention_detach(void) { esp_err_t err = sleep_retention_module_detach(SLEEP_RETENTION_MODULE_WIFI_BB); if (err != ESP_OK) { ESP_LOGW(TAG, "failed to detach sleep retention linked list for wifi bb retention"); } return err; } void esp_phy_sleep_data_init(void) { sleep_retention_module_init_param_t init_param = { .cbs = { .create = { .handle = sleep_retention_wifi_bb_init, .arg = NULL } }, .attribute = SLEEP_RETENTION_MODULE_ATTR_ATTACH, .depends = RETENTION_MODULE_BITMAP_INIT(CLOCK_MODEM) }; RETENTION_MODULE_BITMAP_SET(&init_param.depends, SLEEP_RETENTION_MODULE_PHY_FE); esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_WIFI_BB, &init_param); if (err != ESP_OK) { ESP_LOGW(TAG, "WiFi BB sleep retention init failed"); return; } err = sleep_retention_module_allocate(SLEEP_RETENTION_MODULE_WIFI_BB); if (err != ESP_OK) { ESP_LOGW(TAG, "failed to allocate sleep retention linked list for wifi bb retention"); } } void esp_phy_sleep_data_deinit(void) { esp_err_t err = sleep_retention_module_free(SLEEP_RETENTION_MODULE_WIFI_BB); if (err != ESP_OK) { ESP_LOGW(TAG, "failed to free sleep retention linked list for wifi bb retention"); return; } err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_WIFI_BB); if (err != ESP_OK) { ESP_LOGW(TAG, "WiFi BB sleep retention deinit failed"); } } #endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD. #if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) static esp_err_t sleep_retention_phy_fe_init(void *arg) { #define N_REGS_FE_COEX() (21) #define N_REGS_FE_DATA() (34) #define N_REGS_FE_CTRL() (56) #define N_REGS_FE_DATA_WIFI() (21) #define REG_FECOEX_BASE 0x600a0000 #define REG_FEDATA_BASE 0x600a0400 #define REG_FECTRL_BASE 0x600a0800 #define REG_FEDATAWIFI_BASE 0x600a0c00 const static sleep_retention_entries_config_t phy_fe_regs_retention[] = { [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(0), REG_FECOEX_BASE, REG_FECOEX_BASE, N_REGS_FE_COEX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE COEX */ [1] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(1), REG_FEDATA_BASE, REG_FEDATA_BASE, N_REGS_FE_DATA(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE DATA */ [2] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(2), REG_FECTRL_BASE, REG_FECTRL_BASE, N_REGS_FE_CTRL(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE CTRL */ [3] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(3), REG_FEDATAWIFI_BASE, REG_FEDATAWIFI_BASE, N_REGS_FE_DATA_WIFI(),0, 0), .owner = BIT(0) | BIT(1) } /* FE WIFI DATA */ }; esp_err_t err = sleep_retention_entries_create(phy_fe_regs_retention, ARRAY_SIZE(phy_fe_regs_retention), 3, SLEEP_RETENTION_MODULE_PHY_FE); ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for modem (%s) retention", "PHY FE"); ESP_LOGD(TAG, "PHY FE sleep retention initialization"); return ESP_OK; } esp_err_t esp_phy_fe_sleep_data_init(void) { _lock_acquire(&s_phy_fe_retention_lock); if (s_phy_fe_retention_ref++ == 0) { sleep_retention_module_init_param_t init_param = { .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH }; esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); if (err != ESP_OK) { ESP_LOGW(TAG, "PHY FE sleep retention init failed"); s_phy_fe_retention_ref --; _lock_release(&s_phy_fe_retention_lock); return err; } } _lock_release(&s_phy_fe_retention_lock); return ESP_OK; } void esp_phy_fe_sleep_data_deinit(void) { _lock_acquire(&s_phy_fe_retention_lock); if (s_phy_fe_retention_ref == 0) { _lock_release(&s_phy_fe_retention_lock); return; } if (--s_phy_fe_retention_ref == 0) { esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); if (err != ESP_OK) { ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); } } _lock_release(&s_phy_fe_retention_lock); } #endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF)