1use super::SleepKind;
2use crate::{
3 peripherals::{APB_CTRL, BB, EXTMEM, LPWR, SPI0, SPI1, SYSTEM},
4 rtc_cntl::Rtc,
5 soc::regi2c,
6};
7
8pub const RTC_CNTL_DBIAS_0V90: u8 = 13;
13pub const RTC_CNTL_DBIAS_0V95: u8 = 16;
15pub const RTC_CNTL_DBIAS_1V00: u8 = 18;
17pub const RTC_CNTL_DBIAS_1V05: u8 = 20;
19pub const RTC_CNTL_DBIAS_1V10: u8 = 23;
21pub const RTC_CNTL_DBIAS_1V15: u8 = 25;
23pub const RTC_CNTL_DBIAS_1V20: u8 = 28;
25pub const RTC_CNTL_DBIAS_1V25: u8 = 30;
27pub const RTC_CNTL_DBIAS_1V30: u8 = 31;
29
30pub const RTC_CNTL_DBG_ATTEN_LIGHTSLEEP_DEFAULT: u8 = 5;
32pub const RTC_CNTL_DBG_ATTEN_LIGHTSLEEP_NODROP: u8 = 0;
34pub const RTC_CNTL_DBG_ATTEN_DEEPSLEEP_DEFAULT: u8 = 15;
36pub const RTC_CNTL_DBG_ATTEN_DEEPSLEEP_NODROP: u8 = 0;
38
39pub const RTC_CNTL_BIASSLP_SLEEP_DEFAULT: u8 = 1;
41pub const RTC_CNTL_BIASSLP_SLEEP_ON: u8 = 0;
43
44pub const RTC_CNTL_PD_CUR_SLEEP_DEFAULT: u8 = 1;
46pub const RTC_CNTL_PD_CUR_SLEEP_ON: u8 = 0;
48
49pub const RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT: u8 = 254;
51
52pub const RTC_CNTL_DBG_ATTEN_MONITOR_DEFAULT: u8 = 0;
54pub const RTC_CNTL_BIASSLP_MONITOR_DEFAULT: bool = false;
56pub const RTC_CNTL_PD_CUR_MONITOR_DEFAULT: bool = false;
58
59pub const RTC_CNTL_PLL_BUF_WAIT_DEFAULT: u8 = 20;
61pub const RTC_CNTL_XTL_BUF_WAIT_DEFAULT: u8 = 100;
63pub const RTC_CNTL_CK8M_WAIT_DEFAULT: u8 = 20;
65pub const RTC_CK8M_ENABLE_WAIT_DEFAULT: u8 = 5;
67
68pub const RTC_CNTL_MIN_SLP_VAL_MIN: u8 = 2;
70
71pub const OTHER_BLOCKS_POWERUP: u8 = 1;
73pub const OTHER_BLOCKS_WAIT: u16 = 1;
75
76pub const GPIO_INTR_DISABLE: u8 = 0;
78pub const GPIO_INTR_LOW_LEVEL: u8 = 4;
80pub const GPIO_INTR_HIGH_LEVEL: u8 = 5;
82
83pub const PIN_FUNC_GPIO: u8 = 1;
85pub const SIG_GPIO_OUT_IDX: u32 = 128;
87pub const GPIO_NUM_MAX: usize = 22;
89
90bitfield::bitfield! {
91 #[derive(Clone, Copy)]
92 pub struct RtcConfig(u32);
94 impl Debug;
95 pub u8, ck8m_wait, set_ck8m_wait: 7, 0;
97 pub u8, xtal_wait, set_xtal_wait: 15, 8;
99 pub u8, pll_wait, set_pll_wait: 23, 16;
101 pub clkctl_init, set_clkctl_init: 24;
103 pub pwrctl_init, set_pwrctl_init: 25;
105 pub rtc_dboost_fpd, set_rtc_dboost_fpd: 26;
107 pub xtal_fpu, set_xtal_fpu: 27;
109 pub bbpll_fpu, set_bbpll_fpu: 28;
111 pub cpu_waiti_clk_gate, set_cpu_waiti_clk_gate: 29;
113 pub cali_ocode, set_cali_ocode: 30;
115}
116
117impl Default for RtcConfig {
118 fn default() -> Self {
119 let mut cfg = Self(Default::default());
120 cfg.set_ck8m_wait(RTC_CNTL_CK8M_WAIT_DEFAULT);
121 cfg.set_xtal_wait(RTC_CNTL_XTL_BUF_WAIT_DEFAULT);
122 cfg.set_pll_wait(RTC_CNTL_PLL_BUF_WAIT_DEFAULT);
123 cfg.set_clkctl_init(true);
124 cfg.set_pwrctl_init(true);
125 cfg.set_rtc_dboost_fpd(true);
126 cfg.set_cpu_waiti_clk_gate(true);
127 cfg.set_bbpll_fpu(true);
128 cfg
129 }
130}
131
132bitfield::bitfield! {
133 #[derive(Clone, Copy)]
134 pub struct RtcInitConfig(u128);
136 impl Debug;
137 pub u8, wifi_powerup_cycles, set_wifi_powerup_cycles: 6, 0;
139 pub u16, wifi_wait_cycles, set_wifi_wait_cycles: 15, 7;
141 pub u8, bt_powerup_cycles, set_bt_powerup_cycles: 22, 16;
143 pub u16, bt_wait_cycles, set_bt_wait_cycles: 31, 23;
145 pub u8, cpu_top_powerup_cycles, set_cpu_top_powerup_cycles: 38, 32;
147 pub u16, cpu_top_wait_cycles, set_cpu_top_wait_cycles: 47, 39;
149 pub u8, dg_wrap_powerup_cycles, set_dg_wrap_powerup_cycles: 54, 48;
151 pub u16, dg_wrap_wait_cycles, set_dg_wrap_wait_cycles: 63, 55;
153 pub u8, dg_peri_powerup_cycles, set_dg_peri_powerup_cycles: 70, 64;
155 pub u16, dg_peri_wait_cycles, set_dg_peri_wait_cycles: 79, 71;
157}
158
159impl Default for RtcInitConfig {
160 fn default() -> Self {
161 let mut cfg = Self(Default::default());
162 cfg.set_wifi_powerup_cycles(OTHER_BLOCKS_POWERUP);
163 cfg.set_bt_powerup_cycles(OTHER_BLOCKS_POWERUP);
164 cfg.set_cpu_top_powerup_cycles(OTHER_BLOCKS_POWERUP);
165 cfg.set_dg_wrap_powerup_cycles(OTHER_BLOCKS_POWERUP);
166 cfg.set_dg_peri_powerup_cycles(OTHER_BLOCKS_POWERUP);
167 cfg.set_wifi_wait_cycles(OTHER_BLOCKS_WAIT);
168 cfg.set_bt_wait_cycles(OTHER_BLOCKS_WAIT);
169 cfg.set_cpu_top_wait_cycles(OTHER_BLOCKS_WAIT);
170 cfg.set_dg_wrap_wait_cycles(OTHER_BLOCKS_WAIT);
171 cfg.set_dg_peri_wait_cycles(OTHER_BLOCKS_WAIT);
172 cfg
173 }
174}
175
176bitfield::bitfield! {
177 #[derive(Clone, Copy)]
178 pub struct RtcSleepConfig(u64);
180 impl Debug;
181 pub lslp_mem_inf_fpu, set_lslp_mem_inf_fpu: 0;
183 pub rtc_mem_inf_follow_cpu, set_rtc_mem_inf_follow_cpu: 1;
185 pub rtc_fastmem_pd_en, set_rtc_fastmem_pd_en: 2;
187 pub rtc_slowmem_pd_en, set_rtc_slowmem_pd_en: 3;
189 pub rtc_peri_pd_en, set_rtc_peri_pd_en: 4;
191 pub wifi_pd_en, set_wifi_pd_en: 5;
193 pub bt_pd_en, set_bt_pd_en: 6;
195 pub cpu_pd_en, set_cpu_pd_en: 7;
197 pub int_8m_pd_en, set_int_8m_pd_en: 8;
199 pub dig_peri_pd_en, set_dig_peri_pd_en: 9;
201 pub deep_slp, set_deep_slp: 10;
203 pub wdt_flashboot_mod_en, set_wdt_flashboot_mod_en: 11;
205 pub u8, dig_dbias_slp, set_dig_dbias_slp: 16, 12;
207 pub u8, rtc_dbias_slp, set_rtc_dbias_slp: 21, 17;
209 pub u8, dbg_atten_slp, set_dbg_atten_slp: 25, 22;
211 pub bias_sleep_monitor, set_bias_sleep_monitor: 26;
213 pub bias_sleep_slp, set_bias_sleep_slp: 27;
215 pub pd_cur_slp, set_pd_cur_slp: 28;
217 pub vddsdio_pd_en, set_vddsdio_pd_en: 29;
219 pub xtal_fpu, set_xtal_fpu: 30;
221 pub rtc_regulator_fpu, set_rtc_regulator_fpu: 31;
223 pub deep_slp_reject, set_deep_slp_reject: 32;
225 pub light_slp_reject, set_light_slp_reject: 33;
227}
228
229impl Default for RtcSleepConfig {
230 fn default() -> Self {
231 let mut cfg = Self(Default::default());
232 cfg.set_deep_slp_reject(true);
233 cfg.set_light_slp_reject(true);
234 cfg.set_rtc_dbias_slp(RTC_CNTL_DBIAS_1V10);
235 cfg.set_dig_dbias_slp(RTC_CNTL_DBIAS_1V10);
236
237 cfg.set_rtc_regulator_fpu(true);
241 cfg.set_bias_sleep_monitor(true);
242 cfg.set_bias_sleep_slp(true);
243 cfg.set_pd_cur_slp(true);
244 cfg
245 }
246}
247
248const DR_REG_NRX_BASE: u32 = 0x6001CC00;
249const DR_REG_FE_BASE: u32 = 0x60006000;
250const DR_REG_FE2_BASE: u32 = 0x60005000;
251
252const NRXPD_CTRL: u32 = DR_REG_NRX_BASE + 0x00d4;
253const FE_GEN_CTRL: u32 = DR_REG_FE_BASE + 0x0090;
254const FE2_TX_INTERP_CTRL: u32 = DR_REG_FE2_BASE + 0x00f0;
255
256const SYSCON_SRAM_POWER_UP: u8 = 0x0000000F;
257const SYSCON_ROM_POWER_UP: u8 = 0x00000003;
258
259const NRX_RX_ROT_FORCE_PU: u32 = 1 << 5;
260const NRX_VIT_FORCE_PU: u32 = 1 << 3;
261const NRX_DEMAP_FORCE_PU: u32 = 1 << 1;
262
263const FE_IQ_EST_FORCE_PU: u32 = 1 << 5;
264const FE2_TX_INF_FORCE_PU: u32 = 1 << 10;
265
266fn modify_register(reg: u32, mask: u32, value: u32) {
267 let reg = reg as *mut u32;
268
269 unsafe { reg.write_volatile((reg.read_volatile() & !mask) | value) };
270}
271
272fn register_modify_bits(reg: u32, bits: u32, set: bool) {
273 if set {
274 modify_register(reg, bits, bits);
275 } else {
276 modify_register(reg, bits, 0);
277 }
278}
279
280fn rtc_sleep_pu(val: bool) {
281 LPWR::regs()
282 .dig_pwc()
283 .modify(|_, w| w.lslp_mem_force_pu().bit(val));
284
285 APB_CTRL::regs().front_end_mem_pd().modify(|_r, w| {
286 w.dc_mem_force_pu().bit(val);
287 w.pbus_mem_force_pu().bit(val);
288 w.agc_mem_force_pu().bit(val)
289 });
290
291 BB::regs()
292 .bbpd_ctrl()
293 .modify(|_r, w| w.fft_force_pu().bit(val).dc_est_force_pu().bit(val));
294
295 register_modify_bits(
296 NRXPD_CTRL,
297 NRX_RX_ROT_FORCE_PU | NRX_VIT_FORCE_PU | NRX_DEMAP_FORCE_PU,
298 val,
299 );
300
301 register_modify_bits(FE_GEN_CTRL, FE_IQ_EST_FORCE_PU, val);
302
303 register_modify_bits(FE2_TX_INTERP_CTRL, FE2_TX_INF_FORCE_PU, val);
304
305 APB_CTRL::regs().mem_power_up().modify(|_r, w| unsafe {
306 w.sram_power_up()
307 .bits(if val { SYSCON_SRAM_POWER_UP } else { 0 });
308 w.rom_power_up()
309 .bits(if val { SYSCON_ROM_POWER_UP } else { 0 })
310 });
311}
312
313impl RtcSleepConfig {
314 pub fn deep() -> Self {
316 let mut cfg = Self::default();
318
319 cfg.set_lslp_mem_inf_fpu(false);
320 cfg.set_rtc_mem_inf_follow_cpu(true); cfg.set_rtc_fastmem_pd_en(true);
322 cfg.set_rtc_slowmem_pd_en(true);
323 cfg.set_rtc_peri_pd_en(true);
324 cfg.set_wifi_pd_en(true);
325 cfg.set_bt_pd_en(true);
326 cfg.set_cpu_pd_en(true);
327 cfg.set_int_8m_pd_en(true);
328
329 cfg.set_dig_peri_pd_en(true);
330 cfg.set_dig_dbias_slp(0); cfg.set_deep_slp(true);
333 cfg.set_wdt_flashboot_mod_en(false);
334 cfg.set_vddsdio_pd_en(true);
335 cfg.set_xtal_fpu(false);
336 cfg.set_deep_slp_reject(true);
337 cfg.set_light_slp_reject(true);
338 cfg.set_rtc_dbias_slp(RTC_CNTL_DBIAS_1V10);
339
340 cfg.set_rtc_regulator_fpu(false);
342 cfg.set_dbg_atten_slp(RTC_CNTL_DBG_ATTEN_DEEPSLEEP_DEFAULT);
343
344 cfg.set_bias_sleep_monitor(true);
346 cfg.set_bias_sleep_slp(true);
347 cfg.set_pd_cur_slp(true);
348
349 cfg
350 }
351
352 pub(crate) fn is_deep_sleep(&self) -> bool {
353 self.deep_slp()
354 }
355
356 pub(crate) fn set_sleep_kind(&mut self, kind: SleepKind) {
357 self.set_deep_slp(kind == SleepKind::Deep);
358 }
359
360 pub(crate) fn base_settings(_rtc: &Rtc<'_>) {
361 let cfg = RtcConfig::default();
362
363 let rtc_cntl = LPWR::regs();
365 let extmem = EXTMEM::regs();
366 let system = SYSTEM::regs();
367
368 regi2c::I2C_DIG_REG_XPD_RTC_REG.write_field(0);
369 regi2c::I2C_DIG_REG_XPD_DIG_REG.write_field(0);
370
371 unsafe {
372 rtc_cntl.timer1().modify(|_, w| {
373 w.pll_buf_wait().bits(cfg.pll_wait());
374 w.ck8m_wait().bits(cfg.ck8m_wait())
375 });
376
377 rtc_cntl
381 .timer5()
382 .modify(|_, w| w.min_slp_val().bits(RTC_CNTL_MIN_SLP_VAL_MIN));
383
384 regi2c::I2C_DIG_REG_EXT_RTC_DREG_SLEEP.write_field(RTC_CNTL_DBIAS_1V10);
388
389 regi2c::I2C_DIG_REG_EXT_RTC_DREG.write_field(RTC_CNTL_DBIAS_1V25);
395 regi2c::I2C_DIG_REG_EXT_DIG_DREG.write_field(RTC_CNTL_DBIAS_1V25);
396
397 if cfg.clkctl_init() {
398 extmem
401 .cache_mmu_power_ctrl()
402 .modify(|_, w| w.cache_mmu_mem_force_on().clear_bit());
403 extmem
406 .icache_tag_power_ctrl()
407 .modify(|_, w| w.icache_tag_mem_force_on().clear_bit());
408
409 SPI0::regs()
411 .clock_gate()
412 .modify(|_, w| w.clk_en().clear_bit());
413 SPI1::regs()
414 .clock_gate()
415 .modify(|_, w| w.clk_en().clear_bit());
416 }
417
418 if cfg.pwrctl_init() {
419 rtc_cntl
420 .clk_conf()
421 .modify(|_, w| w.ck8m_force_pu().clear_bit());
422
423 rtc_cntl
424 .options0()
425 .modify(|_, w| w.xtl_force_pu().bit(cfg.xtal_fpu() || cfg.bbpll_fpu()));
426
427 rtc_cntl.options0().modify(|_, w| {
430 w.bbpll_force_pu().bit(cfg.bbpll_fpu());
431 w.bbpll_i2c_force_pu().bit(cfg.bbpll_fpu());
432 w.bb_i2c_force_pu().bit(cfg.bbpll_fpu())
433 });
434
435 rtc_cntl
436 .rtc_cntl()
437 .modify(|_, w| w.regulator_force_pu().clear_bit());
438
439 system
444 .mem_pd_mask()
445 .modify(|_, w| w.lslp_mem_pd_mask().clear_bit());
446
447 rtc_sleep_pu(false);
451
452 rtc_cntl
453 .dig_pwc()
454 .modify(|_, w| w.dg_wrap_force_pu().clear_bit());
455
456 rtc_cntl
457 .dig_iso()
458 .modify(|_, w| w.dg_wrap_force_noiso().clear_bit());
459
460 system
464 .cpu_per_conf()
465 .modify(|_, w| w.cpu_wait_mode_force_on().bit(!cfg.cpu_waiti_clk_gate()));
466
467 rtc_cntl.dig_iso().modify(|_, w| {
470 w.dg_pad_force_unhold().clear_bit();
471 w.dg_pad_force_noiso().clear_bit()
472 });
473 }
474
475 rtc_cntl.int_ena().write(|w| w.bits(0));
476 rtc_cntl.int_clr().write(|w| w.bits(u32::MAX));
477
478 regi2c::I2C_ULP_IR_FORCE_XPD_CK.write_field(1);
479 }
480 }
481
482 pub(crate) fn apply(&self) {
483 let rtc_cntl = LPWR::regs();
485
486 if self.lslp_mem_inf_fpu() {
487 rtc_sleep_pu(true);
488 }
489
490 unsafe {
491 assert!(!self.pd_cur_slp() || self.bias_sleep_slp());
492
493 regi2c::I2C_DIG_REG_EXT_RTC_DREG_SLEEP.write_field(self.rtc_dbias_slp());
494 regi2c::I2C_DIG_REG_EXT_DIG_DREG_SLEEP.write_field(self.dig_dbias_slp());
495
496 rtc_cntl.bias_conf().modify(|_, w| {
497 w.dbg_atten_monitor()
498 .bits(RTC_CNTL_DBG_ATTEN_MONITOR_DEFAULT);
499 w.bias_sleep_monitor().bit(RTC_CNTL_BIASSLP_MONITOR_DEFAULT);
502 w.pd_cur_monitor().bit(RTC_CNTL_PD_CUR_MONITOR_DEFAULT)
503 });
504
505 rtc_cntl.bias_conf().modify(|_, w| {
506 w.dbg_atten_deep_slp().bits(self.dbg_atten_slp());
507 w.bias_sleep_deep_slp().bit(self.bias_sleep_slp());
508 w.pd_cur_deep_slp().bit(self.pd_cur_slp())
509 });
510
511 if self.deep_slp() {
512 regi2c::I2C_ULP_IR_FORCE_XPD_CK.write_field(0);
513
514 rtc_cntl
515 .dig_pwc()
516 .modify(|_, w| w.dg_wrap_pd_en().set_bit());
517
518 rtc_cntl.ana_conf().modify(|_, w| {
519 w.ckgen_i2c_pu().clear_bit();
520 w.pll_i2c_pu().clear_bit();
521 w.rfrx_pbus_pu().clear_bit();
522 w.txrf_i2c_pu().clear_bit()
523 });
524
525 rtc_cntl
526 .options0()
527 .modify(|_, w| w.bb_i2c_force_pu().clear_bit());
528 } else {
529 rtc_cntl.bias_conf().modify(|_, w| {
530 w.dg_vdd_drv_b_slp_en().set_bit();
531 w.dg_vdd_drv_b_slp().bits(RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT)
532 });
533
534 rtc_cntl
535 .dig_pwc()
536 .modify(|_, w| w.dg_wrap_pd_en().clear_bit());
537 }
538
539 rtc_cntl
540 .rtc_cntl()
541 .modify(|_, w| w.regulator_force_pu().bit(self.rtc_regulator_fpu()));
542
543 rtc_cntl.clk_conf().modify(|_, w| {
544 w.ck8m_force_pu().bit(!self.int_8m_pd_en());
545 w.ck8m_force_nogating().bit(!self.int_8m_pd_en())
546 });
547
548 rtc_cntl.dig_pwc().modify(|_, w| {
551 w.vdd_spi_pwr_force().clear_bit();
552 w.vdd_spi_pd_en().bit(self.vddsdio_pd_en())
553 });
554
555 rtc_cntl.slp_reject_conf().modify(|_, w| {
556 w.deep_slp_reject_en().bit(self.deep_slp_reject());
557 w.light_slp_reject_en().bit(self.light_slp_reject())
558 });
559
560 rtc_cntl
561 .options0()
562 .modify(|_, w| w.xtl_force_pu().bit(self.xtal_fpu()));
563
564 rtc_cntl
565 .clk_conf()
566 .modify(|_, w| w.xtal_global_force_nogating().bit(self.xtal_fpu()));
567 }
568 }
569
570 pub(crate) fn start_sleep(&self, wakeup_mask: u32, reject_mask: u32) {
574 LPWR::regs()
576 .wakeup_state()
577 .modify(|_, w| unsafe { w.wakeup_ena().bits(wakeup_mask) });
578
579 LPWR::regs()
582 .slp_reject_conf()
583 .modify(|_, w| unsafe { w.sleep_reject_ena().bits(reject_mask) });
584
585 LPWR::regs().state0().modify(|_, w| w.sleep_en().set_bit());
586 }
587
588 pub(crate) fn finish_sleep(&self) {
589 LPWR::regs().int_clr().write(|w| {
592 w.slp_reject().clear_bit_by_one();
593 w.slp_wakeup().clear_bit_by_one()
594 });
595
596 if self.lslp_mem_inf_fpu() {
598 rtc_sleep_pu(true);
599 }
600 }
601}