Skip to content

Commit c7d5320

Browse files
Merge branch 'feature/esp32c61_light_sleep_support_stage_2' into 'master'
feat(esp_hw_support): esp32c61 sleep support (Stage 2: support basic pmu sleep function) Closes IDF-9248, IDF-9247, IDF-9246, IDF-10993, IDF-9250, PM-203, and IDF-9244 See merge request espressif/esp-idf!33294
2 parents 832e08c + d242b66 commit c7d5320

File tree

45 files changed

+1591
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1591
-178
lines changed

components/esp_driver_gptimer/test_apps/gptimer/main/test_gptimer_sleep.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ static void test_gptimer_sleep_retention(bool back_up_before_sleep)
152152
TEST_ESP_OK(gptimer_get_raw_count(timer, &count_value_after_sleep));
153153
printf("gptimer count value: %llu\n", count_value_after_sleep);
154154
// the count value should near the reload value
155-
TEST_ASSERT_INT_WITHIN(1, 5000, count_value_after_sleep);
155+
TEST_ASSERT_INT_WITHIN(5, 5000, count_value_after_sleep);
156156

157157
TEST_ESP_OK(gptimer_disable(timer));
158158
TEST_ESP_OK(gptimer_del_timer(timer));

components/esp_hw_support/CMakeLists.txt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,6 @@ if(NOT BOOTLOADER_BUILD)
140140
if(CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX OR CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX)
141141
list(APPEND srcs "esp_clock_output.c")
142142
endif()
143-
144-
if(CONFIG_IDF_TARGET_ESP32C61) # TODO: [ESP32C61] IDF-9245, IDF-9247, IDF-9248
145-
list(REMOVE_ITEM srcs
146-
"sleep_cpu.c"
147-
"sleep_modem.c"
148-
"sleep_modes.c"
149-
"sleep_wake_stub.c"
150-
"sleep_gpio.c"
151-
)
152-
endif()
153143
else()
154144
# Requires "_esp_error_check_failed()" function
155145
list(APPEND priv_requires "esp_system")

components/esp_hw_support/lowpower/port/esp32c3/sleep_cpu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ typedef struct {
4545
rtc_cntl_sleep_retent_t retent;
4646
} sleep_cpu_retention_t;
4747

48-
static DRAM_ATTR __attribute__((unused)) sleep_cpu_retention_t s_cpu_retention;
48+
static DRAM_ATTR sleep_cpu_retention_t s_cpu_retention;
4949

5050
esp_err_t esp_sleep_cpu_pd_low_init(void)
5151
{

components/esp_hw_support/lowpower/port/esp32c5/sleep_cpu.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ typedef struct {
6565
} retent;
6666
} sleep_cpu_retention_t;
6767

68-
static DRAM_ATTR __attribute__((unused)) sleep_cpu_retention_t s_cpu_retention;
68+
static DRAM_ATTR sleep_cpu_retention_t s_cpu_retention;
6969

7070
#define CUSTOM_CSR_MTVT (0x307)
7171
#define CUSTOM_CSR_MINTTHRESH (0x347)
@@ -103,7 +103,8 @@ static void * cpu_domain_dev_sleep_frame_alloc_and_init(const cpu_domain_dev_reg
103103
static inline void * cpu_domain_cache_config_sleep_frame_alloc_and_init(void)
104104
{
105105
const static cpu_domain_dev_regs_region_t regions[] = {
106-
{ .start = CACHE_L1_ICACHE_CTRL_REG, .end = CACHE_L1_BYPASS_CACHE_CONF_REG + 4 }
106+
{ .start = CACHE_L1_ICACHE_CTRL_REG, .end = CACHE_L1_BYPASS_CACHE_CONF_REG + 4 },
107+
{ .start = CACHE_L1_CACHE_AUTOLOAD_CTRL_REG, .end = CACHE_L1_CACHE_AUTOLOAD_SCT1_SIZE_REG + 4 },
107108
};
108109
return cpu_domain_dev_sleep_frame_alloc_and_init(regions, sizeof(regions) / sizeof(regions[0]));
109110
}

components/esp_hw_support/lowpower/port/esp32c6/sleep_cpu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ typedef struct {
6666
} retent;
6767
} sleep_cpu_retention_t;
6868

69-
static DRAM_ATTR __attribute__((unused)) sleep_cpu_retention_t s_cpu_retention;
69+
static DRAM_ATTR sleep_cpu_retention_t s_cpu_retention;
7070

7171
#define CUSTOM_CSR_PCER_MACHINE 0x7e0
7272
#define CUSTOM_CSR_PCMR_MACHINE 0x7e1
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2023-2024 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_MISA, misa)
115+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TSELECT, tselect)
116+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TDATA1, tdata1)
117+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TDATA2, tdata2)
118+
STRUCT_FIELD (long, 4, RV_SLP_CTX_TCONTROL, tcontrol)
119+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR0, pmpaddr0)
120+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR1, pmpaddr1)
121+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR2, pmpaddr2)
122+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR3, pmpaddr3)
123+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR4, pmpaddr4)
124+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR5, pmpaddr5)
125+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR6, pmpaddr6)
126+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR7, pmpaddr7)
127+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR8, pmpaddr8)
128+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR9, pmpaddr9)
129+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR10, pmpaddr10)
130+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR11, pmpaddr11)
131+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR12, pmpaddr12)
132+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR13, pmpaddr13)
133+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR14, pmpaddr14)
134+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPADDR15, pmpaddr15)
135+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG0, pmpcfg0)
136+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG1, pmpcfg1)
137+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG2, pmpcfg2)
138+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMPCFG3, pmpcfg3)
139+
140+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR0, pmaaddr0)
141+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR1, pmaaddr1)
142+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR2, pmaaddr2)
143+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR3, pmaaddr3)
144+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR4, pmaaddr4)
145+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR5, pmaaddr5)
146+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR6, pmaaddr6)
147+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR7, pmaaddr7)
148+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR8, pmaaddr8)
149+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR9, pmaaddr9)
150+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR10, pmaaddr10)
151+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR11, pmaaddr11)
152+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR12, pmaaddr12)
153+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR13, pmaaddr13)
154+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR14, pmaaddr14)
155+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMAADDR15, pmaaddr15)
156+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG0, pmacfg0)
157+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG1, pmacfg1)
158+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG2, pmacfg2)
159+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG3, pmacfg3)
160+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG4, pmacfg4)
161+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG5, pmacfg5)
162+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG6, pmacfg6)
163+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG7, pmacfg7)
164+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG8, pmacfg8)
165+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG9, pmacfg9)
166+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG10, pmacfg10)
167+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG11, pmacfg11)
168+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG12, pmacfg12)
169+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG13, pmacfg13)
170+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG14, pmacfg14)
171+
STRUCT_FIELD (long, 4, RV_SLP_CTX_PMACFG15, pmacfg15)
172+
173+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MCYCLE, mcycle)
174+
175+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MTVT, mtvt)
176+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MINTTHRESH, mintthresh)
177+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MINTSTATUS, mintstatus)
178+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MXSTATUS, mxstatus)
179+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MHCR, mhcr)
180+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MHINT, mhint)
181+
STRUCT_FIELD (long, 4, RV_SLP_CTX_MEXSTATUS, mexstatus)
182+
STRUCT_FIELD (long, 4, RV_SLP_CTX_JVT, jvt)
183+
#if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME
184+
STRUCT_FIELD (long, 4, RV_SLP_NCSF_CTX_CRC, frame_crc) /* Used to check RvCoreNonCriticalSleepFrame integrity */
185+
#endif
186+
STRUCT_END(RvCoreNonCriticalSleepFrame)
187+
188+
#endif /* #ifndef __RVSLEEP_FRAMES_H__ */

0 commit comments

Comments
 (0)