Skip to content

Commit 7daa7c8

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'feat/esp32h21_system_sleep_cpu' into 'master'
Stage 4: Support esp32h21 CPU domain power down and retention Closes PM-351 See merge request espressif/esp-idf!37510
2 parents f407fab + 6899247 commit 7daa7c8

File tree

5 files changed

+1028
-0
lines changed

5 files changed

+1028
-0
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef __RVSLEEP_FRAMES_H__
8+
#define __RVSLEEP_FRAMES_H__
9+
10+
#include "sdkconfig.h"
11+
12+
/* Align a value up to nearest n-byte boundary, where n is a power of 2. */
13+
#define ALIGNUP(n, val) (((val) + (n) - 1) & -(n))
14+
15+
#ifdef STRUCT_BEGIN
16+
#undef STRUCT_BEGIN
17+
#undef STRUCT_FIELD
18+
#undef STRUCT_AFIELD
19+
#undef STRUCT_END
20+
#endif
21+
22+
#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
23+
#ifdef __clang__
24+
#define STRUCT_BEGIN .set RV_STRUCT_OFFSET, 0
25+
#define STRUCT_FIELD(ctype,size,asname,name) .set asname, RV_STRUCT_OFFSET; .set RV_STRUCT_OFFSET, asname + size
26+
#define STRUCT_AFIELD(ctype,size,asname,name,n) .set asname, RV_STRUCT_OFFSET;\
27+
.set RV_STRUCT_OFFSET, asname + (size)*(n);
28+
#define STRUCT_END(sname) .set sname##Size, RV_STRUCT_OFFSET;
29+
#else // __clang__
30+
#define STRUCT_BEGIN .pushsection .text; .struct 0
31+
#define STRUCT_FIELD(ctype,size,asname,name) asname: .space size
32+
#define STRUCT_AFIELD(ctype,size,asname,name,n) asname: .space (size)*(n)
33+
#define STRUCT_END(sname) sname##Size:; .popsection
34+
#endif // __clang__
35+
#else
36+
#define STRUCT_BEGIN typedef struct {
37+
#define STRUCT_FIELD(ctype,size,asname,name) ctype name;
38+
#define STRUCT_AFIELD(ctype,size,asname,name,n) ctype name[n];
39+
#define STRUCT_END(sname) } sname;
40+
#endif
41+
42+
/*
43+
* -------------------------------------------------------------------------------
44+
* RISC-V CORE CRITICAL REGISTER CONTEXT LAYOUT FOR SLEEP
45+
* -------------------------------------------------------------------------------
46+
*/
47+
STRUCT_BEGIN
48+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MEPC, mepc) /* Machine Exception Program Counter */
49+
STRUCT_FIELD (long, 4, RV_SLP_CTX_RA, ra) /* Return address */
50+
STRUCT_FIELD (long, 4, RV_SLP_CTX_SP, sp) /* Stack pointer */
51+
STRUCT_FIELD (long, 4, RV_SLP_CTX_GP, gp) /* Global pointer */
52+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TP, tp) /* Thread pointer */
53+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T0, t0) /* Temporary/alternate link register */
54+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T1, t1) /* t1-2: Temporaries */
55+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T2, t2)
56+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S0, s0) /* Saved register/frame pointer */
57+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S1, s1) /* Saved register */
58+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A0, a0) /* a0-1: Function arguments/return address */
59+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A1, a1)
60+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A2, a2) /* a2-7: Function arguments */
61+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A3, a3)
62+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A4, a4)
63+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A5, a5)
64+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A6, a6)
65+
STRUCT_FIELD (long, 4, RV_SLP_CTX_A7, a7)
66+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S2, s2) /* s2-11: Saved registers */
67+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S3, s3)
68+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S4, s4)
69+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S5, s5)
70+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S6, s6)
71+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S7, s7)
72+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S8, s8)
73+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S9, s9)
74+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S10, s10)
75+
STRUCT_FIELD (long, 4, RV_SLP_CTX_S11, s11)
76+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T3, t3) /* t3-6: Temporaries */
77+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T4, t4)
78+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T5, t5)
79+
STRUCT_FIELD (long, 4, RV_SLP_CTX_T6, t6)
80+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MSTATUS, mstatus) /* Machine Status */
81+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MTVEC, mtvec) /* Machine Trap-Vector Base Address */
82+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MCAUSE, mcause) /* Machine Trap Cause */
83+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MTVAL, mtval) /* Machine Trap Value */
84+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MIE, mie) /* Machine intr enable */
85+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MIP, mip) /* Machine intr pending */
86+
87+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMUFUNC, pmufunc) /* A field is used to identify whether it is going
88+
* to sleep or has just been awakened. We use the
89+
* lowest 2 bits as indication information, 3 means
90+
* being awakened, 1 means going to sleep */
91+
#if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME
92+
STRUCT_FIELD (long, 4, RV_SLP_CSF_CTX_CRC, frame_crc) /* Used to check RvCoreCriticalSleepFrame integrity */
93+
#endif
94+
STRUCT_END(RvCoreCriticalSleepFrame)
95+
96+
#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
97+
#define RV_SLEEP_CTX_SZ1 RvCoreCriticalSleepFrameSize
98+
#else
99+
#define RV_SLEEP_CTX_SZ1 sizeof(RvCoreCriticalSleepFrame)
100+
#endif
101+
102+
/*
103+
* Sleep stack frame size, after align up to 16 bytes boundary
104+
*/
105+
#define RV_SLEEP_CTX_FRMSZ (ALIGNUP(0x10, RV_SLEEP_CTX_SZ1))
106+
107+
/*
108+
* -------------------------------------------------------------------------------
109+
* RISC-V CORE NON-CRITICAL REGISTER CONTEXT LAYOUT FOR SLEEP
110+
* -------------------------------------------------------------------------------
111+
*/
112+
STRUCT_BEGIN
113+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MSCRATCH, mscratch)
114+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MIDELEG, mideleg)
115+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MISA, misa)
116+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TSELECT, tselect)
117+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TDATA1, tdata1)
118+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TDATA2, tdata2)
119+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TCONTROL, tcontrol)
120+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR0, pmpaddr0)
121+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR1, pmpaddr1)
122+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR2, pmpaddr2)
123+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR3, pmpaddr3)
124+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR4, pmpaddr4)
125+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR5, pmpaddr5)
126+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR6, pmpaddr6)
127+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR7, pmpaddr7)
128+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR8, pmpaddr8)
129+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR9, pmpaddr9)
130+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR10, pmpaddr10)
131+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR11, pmpaddr11)
132+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR12, pmpaddr12)
133+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR13, pmpaddr13)
134+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR14, pmpaddr14)
135+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR15, pmpaddr15)
136+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG0, pmpcfg0)
137+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG1, pmpcfg1)
138+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG2, pmpcfg2)
139+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG3, pmpcfg3)
140+
141+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR0, pmaaddr0)
142+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR1, pmaaddr1)
143+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR2, pmaaddr2)
144+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR3, pmaaddr3)
145+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR4, pmaaddr4)
146+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR5, pmaaddr5)
147+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR6, pmaaddr6)
148+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR7, pmaaddr7)
149+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR8, pmaaddr8)
150+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR9, pmaaddr9)
151+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR10, pmaaddr10)
152+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR11, pmaaddr11)
153+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR12, pmaaddr12)
154+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR13, pmaaddr13)
155+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR14, pmaaddr14)
156+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR15, pmaaddr15)
157+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG0, pmacfg0)
158+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG1, pmacfg1)
159+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG2, pmacfg2)
160+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG3, pmacfg3)
161+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG4, pmacfg4)
162+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG5, pmacfg5)
163+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG6, pmacfg6)
164+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG7, pmacfg7)
165+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG8, pmacfg8)
166+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG9, pmacfg9)
167+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG10, pmacfg10)
168+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG11, pmacfg11)
169+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG12, pmacfg12)
170+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG13, pmacfg13)
171+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG14, pmacfg14)
172+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG15, pmacfg15)
173+
174+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UTVEC, utvec)
175+
STRUCT_FIELD (long, 4, RV_SLP_CTX_USTATUS, ustatus)
176+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UEPC, uepc)
177+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UCAUSE, ucause)
178+
179+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MPCER, mpcer)
180+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MPCMR, mpcmr)
181+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MPCCR, mpccr)
182+
STRUCT_FIELD (long, 4, RV_SLP_CTX_CPU_TESTBUS_CTRL, cpu_testbus_ctrl)
183+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UPCER, upcer)
184+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UPCMR, upcmr)
185+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UPCCR, upccr)
186+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UGPIO_OEN, ugpio_oen)
187+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UGPIO_IN, ugpio_in)
188+
STRUCT_FIELD (long, 4, RV_SLP_CTX_UGPIO_OUT, ugpio_out)
189+
#if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME
190+
STRUCT_FIELD (long, 4, RV_SLP_NCSF_CTX_CRC, frame_crc) /* Used to check RvCoreNonCriticalSleepFrame integrity */
191+
#endif
192+
STRUCT_END(RvCoreNonCriticalSleepFrame)
193+
194+
#endif /* #ifndef __RVSLEEP_FRAMES_H__ */
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "esp_private/sleep_clock.h"
8+
#include "soc/i2c_ana_mst_reg.h"
9+
#include "soc/regi2c_defs.h"
10+
#include "soc/pcr_reg.h"
11+
#include "soc/regi2c_defs.h"
12+
#include "modem/modem_syscon_reg.h"
13+
#include "modem/modem_lpcon_reg.h"
14+
15+
16+
static const char *TAG = "sleep_clock";
17+
18+
esp_err_t sleep_clock_system_retention_init(void *arg)
19+
{
20+
#define N_REGS_PCR() (((PCR_PWDET_SAR_CLK_CONF_REG - DR_REG_PCR_BASE) / 4) + 1)
21+
22+
const static sleep_retention_entries_config_t pcr_regs_retention[] = {
23+
/* Enable i2c master clock */
24+
[0] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(0), MODEM_LPCON_CLK_CONF_REG, MODEM_LPCON_CLK_I2C_MST_EN, MODEM_LPCON_CLK_I2C_MST_EN_M, 1, 0), .owner = ENTRY(0) },
25+
/* Start BBPLL self-calibration */
26+
[1] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(1), I2C_MST_ANA_CONF0_REG, 0, I2C_MST_BBPLL_STOP_FORCE_HIGH, 1, 0), .owner = ENTRY(0) },
27+
[2] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(2), I2C_MST_ANA_CONF0_REG, I2C_MST_BBPLL_STOP_FORCE_LOW, I2C_MST_BBPLL_STOP_FORCE_LOW, 1, 0), .owner = ENTRY(0) },
28+
/* Wait calibration done */
29+
[3] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PCR_LINK(3), I2C_MST_ANA_CONF0_REG, I2C_MST_BBPLL_CAL_DONE, I2C_MST_BBPLL_CAL_DONE, 1, 0), .owner = ENTRY(0) },
30+
/* Stop BBPLL self-calibration */
31+
[4] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(4), I2C_MST_ANA_CONF0_REG, 0, I2C_MST_BBPLL_STOP_FORCE_LOW, 1, 0), .owner = ENTRY(0) },
32+
[5] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(5), I2C_MST_ANA_CONF0_REG, I2C_MST_BBPLL_STOP_FORCE_HIGH, I2C_MST_BBPLL_STOP_FORCE_HIGH, 1, 0), .owner = ENTRY(0) },
33+
/* Clock configuration retention */
34+
[6] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_PCR_LINK(6), DR_REG_PCR_BASE, DR_REG_PCR_BASE, N_REGS_PCR(), 0, 0), .owner = ENTRY(0) | ENTRY(2) },
35+
[7] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_PCR_LINK(7), PCR_RESET_EVENT_BYPASS_REG, PCR_RESET_EVENT_BYPASS_REG, 1, 0, 0), .owner = ENTRY(0) | ENTRY(2) },
36+
[8] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_PCR_LINK(8), PCR_BUS_CLK_UPDATE_REG, PCR_BUS_CLOCK_UPDATE, PCR_BUS_CLOCK_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) },
37+
[9] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PCR_LINK(9), PCR_BUS_CLK_UPDATE_REG, 0x0, PCR_BUS_CLOCK_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) },
38+
};
39+
40+
esp_err_t err = sleep_retention_entries_create(pcr_regs_retention, ARRAY_SIZE(pcr_regs_retention), REGDMA_LINK_PRI_SYS_CLK, SLEEP_RETENTION_MODULE_CLOCK_SYSTEM);
41+
ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for system (PCR) retention");
42+
ESP_LOGI(TAG, "System Power, Clock and Reset sleep retention initialization");
43+
return ESP_OK;
44+
45+
#undef N_REGS_PCR
46+
}
47+
48+
#if CONFIG_MAC_BB_PD || CONFIG_BT_LE_SLEEP_ENABLE || CONFIG_IEEE802154_SLEEP_ENABLE
49+
esp_err_t sleep_clock_modem_retention_init(void *arg)
50+
{
51+
#define N_REGS_SYSCON() (((MODEM_SYSCON_MEM_CONF_REG - MODEM_SYSCON_TEST_CONF_REG) / 4) + 1)
52+
#define N_REGS_LPCON() (((MODEM_LPCON_MEM_CONF_REG - MODEM_LPCON_TEST_CONF_REG) / 4) + 1)
53+
54+
const static sleep_retention_entries_config_t modem_regs_retention[] = {
55+
[0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEMSYSCON_LINK(0), MODEM_SYSCON_TEST_CONF_REG, MODEM_SYSCON_TEST_CONF_REG, N_REGS_SYSCON(), 0, 0), .owner = ENTRY(0) | ENTRY(1) }, /* MODEM SYSCON */
56+
#if SOC_PM_RETENTION_SW_TRIGGER_REGDMA
57+
[1] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEMLPCON_LINK(0), MODEM_LPCON_TEST_CONF_REG, MODEM_LPCON_TEST_CONF_REG, N_REGS_LPCON(), 0, 0), .owner = ENTRY(0) | ENTRY(1) } /* MODEM LPCON */
58+
#endif
59+
};
60+
61+
esp_err_t err = sleep_retention_entries_create(modem_regs_retention, ARRAY_SIZE(modem_regs_retention), REGDMA_LINK_PRI_MODEM_CLK, SLEEP_RETENTION_MODULE_CLOCK_MODEM);
62+
ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for modem (SYSCON) retention, 1 level priority");
63+
ESP_LOGI(TAG, "Modem Power, Clock and Reset sleep retention initialization");
64+
return ESP_OK;
65+
66+
#undef N_REGS_LPCON
67+
#undef N_REGS_SYSCON
68+
}
69+
#endif
70+
71+
bool clock_domain_pd_allowed(void)
72+
{
73+
const sleep_retention_module_bitmap_t inited_modules = sleep_retention_get_inited_modules();
74+
const sleep_retention_module_bitmap_t created_modules = sleep_retention_get_created_modules();
75+
const sleep_retention_module_bitmap_t sys_clk_dep_modules = (sleep_retention_module_bitmap_t){ .bitmap[SLEEP_RETENTION_MODULE_SYS_PERIPH >> 5] = BIT(SLEEP_RETENTION_MODULE_SYS_PERIPH % 32) };
76+
77+
/* The clock and reset of MODEM (WiFi, BLE and 15.4) modules are managed
78+
* through MODEM_SYSCON, when one or more MODEMs are initialized, it is
79+
* necessary to check the state of CLOCK_MODEM to determine MODEM domain on
80+
* or off. The clock and reset of digital peripherals are managed through
81+
* PCR, with TOP domain similar to MODEM domain. */
82+
sleep_retention_module_bitmap_t modem_clk_dep_modules = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } };
83+
#if SOC_BT_SUPPORTED
84+
modem_clk_dep_modules.bitmap[SLEEP_RETENTION_MODULE_BLE_MAC >> 5] |= BIT(SLEEP_RETENTION_MODULE_BLE_MAC % 32);
85+
modem_clk_dep_modules.bitmap[SLEEP_RETENTION_MODULE_BT_BB >> 5] |= BIT(SLEEP_RETENTION_MODULE_BT_BB % 32);
86+
#endif
87+
#if SOC_IEEE802154_SUPPORTED
88+
modem_clk_dep_modules.bitmap[SLEEP_RETENTION_MODULE_802154_MAC >> 5] |= BIT(SLEEP_RETENTION_MODULE_802154_MAC % 32);
89+
modem_clk_dep_modules.bitmap[SLEEP_RETENTION_MODULE_BT_BB >> 5] |= BIT(SLEEP_RETENTION_MODULE_BT_BB % 32);
90+
#endif
91+
92+
const sleep_retention_module_bitmap_t null_module = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } };
93+
94+
sleep_retention_module_bitmap_t mask = (sleep_retention_module_bitmap_t){ .bitmap = { 0 } };
95+
const sleep_retention_module_bitmap_t system_modules = sleep_retention_module_bitmap_and(inited_modules, sys_clk_dep_modules);
96+
if (!sleep_retention_module_bitmap_eq(system_modules, null_module)) {
97+
mask.bitmap[SLEEP_RETENTION_MODULE_CLOCK_SYSTEM >> 5] |= BIT(SLEEP_RETENTION_MODULE_CLOCK_SYSTEM % 32);
98+
}
99+
#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED
100+
const sleep_retention_module_bitmap_t modem_modules = sleep_retention_module_bitmap_and(inited_modules, modem_clk_dep_modules);
101+
if (!sleep_retention_module_bitmap_eq(modem_modules, null_module)) {
102+
mask.bitmap[SLEEP_RETENTION_MODULE_CLOCK_MODEM >> 5] |= BIT(SLEEP_RETENTION_MODULE_CLOCK_MODEM % 32);
103+
}
104+
#endif
105+
106+
const sleep_retention_module_bitmap_t clock_domain_inited_modules = sleep_retention_module_bitmap_and(inited_modules, mask);
107+
const sleep_retention_module_bitmap_t clock_domain_created_modules = sleep_retention_module_bitmap_and(created_modules, mask);
108+
return sleep_retention_module_bitmap_eq(clock_domain_inited_modules, clock_domain_created_modules);
109+
}
110+
111+
ESP_SYSTEM_INIT_FN(sleep_clock_startup_init, SECONDARY, BIT(0), 106)
112+
{
113+
sleep_retention_module_init_param_t init_param = {
114+
.cbs = { .create = { .handle = sleep_clock_system_retention_init, .arg = NULL } },
115+
.attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE
116+
};
117+
sleep_retention_module_init(SLEEP_RETENTION_MODULE_CLOCK_SYSTEM, &init_param);
118+
119+
#if CONFIG_MAC_BB_PD || CONFIG_BT_LE_SLEEP_ENABLE || CONFIG_IEEE802154_SLEEP_ENABLE
120+
init_param = (sleep_retention_module_init_param_t) {
121+
.cbs = { .create = { .handle = sleep_clock_modem_retention_init, .arg = NULL } },
122+
.attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE
123+
};
124+
sleep_retention_module_init(SLEEP_RETENTION_MODULE_CLOCK_MODEM, &init_param);
125+
#endif
126+
return ESP_OK;
127+
}

0 commit comments

Comments
 (0)