@@ -162,6 +162,9 @@ static void mp_machine_lightsleep(size_t n_args, const mp_obj_t *args) {
162162 }
163163
164164clock_stop (clk_adc );
165+ #if PICO_RP2350
166+ clock_stop (clk_hstx );
167+ #endif
165168
166169// CLK_REF = XOSC
167170clock_configure (clk_ref ,CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC ,0 ,xosc_hz ,xosc_hz );
@@ -170,7 +173,9 @@ static void mp_machine_lightsleep(size_t n_args, const mp_obj_t *args) {
170173clock_configure (clk_sys ,CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLK_REF ,0 ,xosc_hz ,xosc_hz );
171174
172175// CLK_RTC = XOSC / 256
176+ #if PICO_RP2040
173177clock_configure (clk_rtc ,0 ,CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_XOSC_CLKSRC ,xosc_hz ,xosc_hz /256 );
178+ #endif
174179
175180// CLK_PERI = CLK_SYS
176181clock_configure (clk_peri ,0 ,CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS ,xosc_hz ,xosc_hz );
@@ -190,38 +195,63 @@ static void mp_machine_lightsleep(size_t n_args, const mp_obj_t *args) {
190195#endif
191196xosc_dormant ();
192197 }else {
193- uint32_t sleep_en0 = clocks_hw -> sleep_en0 ;
194- uint32_t sleep_en1 = clocks_hw -> sleep_en1 ;
195198bool timer3_enabled = irq_is_enabled (3 );
196199
197- clocks_hw -> sleep_en0 = CLOCKS_SLEEP_EN0_CLK_RTC_RTC_BITS ;
200+ const uint32_t alarm_num = 3 ;
201+ const uint32_t irq_num = TIMER_ALARM_IRQ_NUM (timer_hw ,alarm_num );
198202if (use_timer_alarm ) {
199203// Make sure ALARM3/IRQ3 is enabled on _this_ core
200- timer_hw -> inte |=1 <<3 ;
201204if (!timer3_enabled ) {
202- irq_set_enabled (3 , true);
205+ irq_set_enabled (irq_num , true);
203206 }
207+ hw_set_bits (& timer_hw -> inte ,1u <<alarm_num );
204208// Use timer alarm to wake.
209+ clocks_hw -> sleep_en0 = 0x0 ;
210+ #if PICO_RP2040
205211clocks_hw -> sleep_en1 = CLOCKS_SLEEP_EN1_CLK_SYS_TIMER_BITS ;
206- timer_hw -> alarm [3 ]= timer_hw -> timerawl + delay_ms * 1000 ;
212+ #elif PICO_RP2350
213+ clocks_hw -> sleep_en1 = CLOCKS_SLEEP_EN1_CLK_REF_TICKS_BITS |CLOCKS_SLEEP_EN1_CLK_SYS_TIMER0_BITS ;
214+ #else
215+ #error Unknown processor
216+ #endif
217+ timer_hw -> intr = 1u <<alarm_num ;// clear any IRQ
218+ timer_hw -> alarm [alarm_num ]= timer_hw -> timerawl + delay_ms * 1000 ;
207219 }else {
208220// TODO: Use RTC alarm to wake.
209- clocks_hw -> sleep_en1 = 0 ;
221+ clocks_hw -> sleep_en0 = 0x0 ;
222+ clocks_hw -> sleep_en1 = 0x0 ;
210223 }
211224
212225if (!disable_usb ) {
213226clocks_hw -> sleep_en0 |=CLOCKS_SLEEP_EN0_CLK_SYS_PLL_USB_BITS ;
227+ #if PICO_RP2040
214228clocks_hw -> sleep_en1 |=CLOCKS_SLEEP_EN1_CLK_USB_USBCTRL_BITS ;
229+ #elif PICO_RP2350
230+ clocks_hw -> sleep_en1 |=CLOCKS_SLEEP_EN1_CLK_SYS_USBCTRL_BITS ;
231+ #else
232+ #error Unknown processor
233+ #endif
215234 }
216235
236+ #if PICO_ARM
237+ // Configure SLEEPDEEP bits on Cortex-M CPUs.
238+ #if PICO_RP2040
217239scb_hw -> scr |=M0PLUS_SCR_SLEEPDEEP_BITS ;
240+ #elif PICO_RP2350
241+ scb_hw -> scr |=M33_SCR_SLEEPDEEP_BITS ;
242+ #else
243+ #error Unknown processor
244+ #endif
245+ #endif
246+
247+ // Go into low-power mode.
218248__wfi ();
219- scb_hw -> scr &= ~ M0PLUS_SCR_SLEEPDEEP_BITS ;
249+
220250if (!timer3_enabled ) {
221- irq_set_enabled (3 , false);
251+ irq_set_enabled (irq_num , false);
222252 }
223- clocks_hw -> sleep_en0 = sleep_en0 ;
224- clocks_hw -> sleep_en1 = sleep_en1 ;
253+ clocks_hw -> sleep_en0 |= ~( 0u ) ;
254+ clocks_hw -> sleep_en1 |= ~( 0u ) ;
225255 }
226256
227257// Enable ROSC.