1use strum::FromRepr;
2
3use crate::{
4 peripherals::{PCR, PMU},
5 soc::{clocks::ClockConfig, regi2c},
6};
7
8pub(crate) fn init(_config: &ClockConfig) {
9 regi2c::I2C_PMU_EN_I2C_RTC_DREG.write_field(0);
11 regi2c::I2C_PMU_EN_I2C_DIG_DREG.write_field(0);
12 regi2c::I2C_PMU_EN_I2C_RTC_DREG_SLP.write_field(0);
13 regi2c::I2C_PMU_EN_I2C_DIG_DREG_SLP.write_field(0);
14 regi2c::I2C_PMU_OR_XPD_RTC_REG.write_field(0);
15 regi2c::I2C_PMU_OR_XPD_DIG_REG.write_field(0);
16 regi2c::I2C_PMU_OR_XPD_TRX.write_field(0);
17 regi2c::I2C_BIAS_DREG_0P8.write_field(8);
18
19 let pmu = PMU::regs();
20 unsafe {
21 pmu.power_pd_top_cntl().write(|w| w.bits(0));
22 pmu.power_pd_hpaon_cntl().write(|w| w.bits(0));
23 pmu.power_pd_hpcpu_cntl().write(|w| w.bits(0));
24 pmu.power_pd_hpperi_reserve().write(|w| w.bits(0));
25 pmu.power_pd_hpwifi_cntl().write(|w| w.bits(0));
26 pmu.power_pd_lpperi_cntl().write(|w| w.bits(0));
27
28 pmu.hp_active_hp_regulator0()
29 .modify(|_, w| w.hp_active_hp_regulator_dbias().bits(25));
30 pmu.hp_sleep_lp_regulator0()
31 .modify(|_, w| w.hp_sleep_lp_regulator_dbias().bits(26));
32
33 pmu.hp_sleep_dig_power().modify(|_, w| {
34 w.hp_sleep_vdd_spi_pd_en().set_bit();
35 w.hp_sleep_pd_hp_wifi_pd_en().set_bit();
36 w.hp_sleep_pd_hp_cpu_pd_en().set_bit();
37 w.hp_sleep_pd_top_pd_en().set_bit()
38 });
39
40 pmu.hp_active_hp_ck_power().modify(|_, w| {
41 w.hp_active_xpd_bbpll().set_bit();
42 w.hp_active_xpd_bb_i2c().set_bit();
43 w.hp_active_xpd_bbpll_i2c().set_bit()
44 });
45
46 pmu.hp_active_sysclk().modify(|_, w| {
47 w.hp_active_icg_sys_clock_en().set_bit();
48 w.hp_active_sys_clk_slp_sel().clear_bit();
49 w.hp_active_icg_slp_sel().clear_bit()
50 });
51 pmu.hp_sleep_sysclk().modify(|_, w| {
52 w.hp_sleep_icg_sys_clock_en().clear_bit();
53 w.hp_sleep_sys_clk_slp_sel().set_bit();
54 w.hp_sleep_icg_slp_sel().set_bit()
55 });
56
57 pmu.slp_wakeup_cntl5()
58 .modify(|_, w| w.lp_ana_wait_target().bits(15));
59 pmu.slp_wakeup_cntl7()
60 .modify(|_, w| w.ana_wait_target().bits(1700));
61 }
62
63 PCR::regs()
64 .ctrl_tick_conf()
65 .modify(|_, w| unsafe { w.fosc_tick_num().bits(255) });
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, FromRepr)]
78pub enum SocResetReason {
79 ChipPowerOn = 0x01,
85 CoreSw = 0x03,
87 CoreDeepSleep = 0x05,
89 CoreMwdt0 = 0x07,
91 CoreMwdt1 = 0x08,
93 CoreRtcWdt = 0x09,
95 Cpu0Mwdt0 = 0x0B,
97 Cpu0Sw = 0x0C,
99 Cpu0RtcWdt = 0x0D,
101 SysBrownOut = 0x0F,
103 SysRtcWdt = 0x10,
105 Cpu0Mwdt1 = 0x11,
107 SysSuperWdt = 0x12,
109 SysClkGlitch = 0x13,
111 CoreEfuseCrc = 0x14,
113 CoreUsbUart = 0x15,
115 CoreUsbJtag = 0x16,
117 CorePwrGlitch = 0x17,
119}
120
121bitfield::bitfield! {
122 #[derive(Clone, Copy, Default)]
124 pub struct HpDigPower(u32);
125
126 pub bool, vdd_spi_pd_en, set_vdd_spi_pd_en: 21;
127 pub bool, mem_dslp , set_mem_dslp : 22;
128 pub bool, modem_pd_en , set_modem_pd_en : 27;
129 pub bool, cpu_pd_en , set_cpu_pd_en : 29;
130 pub bool, top_pd_en , set_top_pd_en : 31;
131}
132
133bitfield::bitfield! {
134 #[derive(Clone, Copy, Default)]
136 pub struct HpClkPower(u32);
137
138 pub bool, xpd_bbpll , set_xpd_bbpll : 30;
139}
140
141bitfield::bitfield! {
142 #[derive(Clone, Copy, Default)]
144 pub struct XtalPower(u32);
145
146 pub bool, xpd_xtal , set_xpd_xtal : 31;
147}
148
149#[derive(Clone, Copy, Default)]
151pub struct HpSysPower {
152 pub dig_power: HpDigPower,
153 pub clk: HpClkPower,
154 pub xtal: XtalPower,
155}
156
157bitfield::bitfield! {
158 #[derive(Clone, Copy, Default)]
160 pub struct LpDigPower(u32);
161
162 pub bool, bod_source_sel, set_bod_source_sel : 27;
163 pub u32, vddbat_mode, set_vddbat_mode : 29, 28;
164 pub u32, mem_dslp , set_mem_dslp : 30;
165
166}
167
168bitfield::bitfield! {
169 #[derive(Clone, Copy, Default)]
171 pub struct LpClkPower(u32);
172
173 pub u32, xpd_xtal32k, set_xpd_xtal32k: 28;
174 pub u32, xpd_fosc , set_xpd_fosc : 30;
175}
176
177#[derive(Clone, Copy, Default)]
179pub struct LpSysPower {
180 pub dig_power: LpDigPower,
181 pub clk_power: LpClkPower,
182 pub xtal: XtalPower,
183}
184
185bitfield::bitfield! {
186 #[derive(Clone, Copy, Default)]
188 pub struct HpSysCntlReg(u32);
189
190 pub bool, uart_wakeup_en , set_uart_wakeup_en : 24;
191 pub bool, lp_pad_hold_all, set_lp_pad_hold_all: 25;
192 pub bool, hp_pad_hold_all, set_hp_pad_hold_all: 26;
193 pub bool, dig_pad_slp_sel, set_dig_pad_slp_sel: 27;
194 pub bool, dig_pause_wdt , set_dig_pause_wdt : 28;
195 pub bool, dig_cpu_stall , set_dig_cpu_stall : 29;
196}