1use kernel::utilities::registers::interfaces::{ReadWriteable, Readable};
8use kernel::utilities::registers::{register_bitfields, register_structs, ReadOnly, ReadWrite};
9use kernel::utilities::StaticRef;
10
11const PWRCTRL_BASE: StaticRef<PwrCtrlRegisters> =
12 unsafe { StaticRef::new(0x4002_1000 as *const PwrCtrlRegisters) };
13
14register_structs! {
15 pub PwrCtrlRegisters {
16 (0x000 => supplysrc: ReadWrite<u32, SUPPLYSRC::Register>),
17 (0x004 => supplystatus: ReadWrite<u32, SUPPLYSTATUS::Register>),
18 (0x008 => devpwren: ReadWrite<u32, DEVPWREN::Register>),
19 (0x00c => mempwdinsleep: ReadWrite<u32>),
20 (0x010 => mempwren: ReadWrite<u32>),
21 (0x014 => mempwrstatus: ReadWrite<u32>),
22 (0x018 => devpwrstatus: ReadOnly<u32, DEVPWRSTATUS::Register>),
23 (0x01c => sramctrl: ReadWrite<u32>),
24 (0x020 => adcstatus: ReadWrite<u32>),
25 (0x024 => misc: ReadWrite<u32>),
26 (0x028 => devpwreventen: ReadWrite<u32>),
27 (0x02c => mempwreventen: ReadWrite<u32>),
28 (0x030 => @END),
29 }
30}
31
32register_bitfields![u32,
33 SUPPLYSRC [
34 BLEBUCKEN OFFSET(0) NUMBITS(8) []
35 ],
36 SUPPLYSTATUS [
37 SIMOBUCKON OFFSET(0) NUMBITS(1) [],
38 BLEBUCKON OFFSET(1) NUMBITS(1) []
39 ],
40 DEVPWREN [
41 PWRIOS OFFSET(0) NUMBITS(1) [],
42 PWRIOM0 OFFSET(1) NUMBITS(1) [],
43 PWRIOM1 OFFSET(2) NUMBITS(1) [],
44 PWRIOM2 OFFSET(3) NUMBITS(1) [],
45 PWRIOM3 OFFSET(4) NUMBITS(1) [],
46 PWRIOM4 OFFSET(5) NUMBITS(1) [],
47 PWRIOM5 OFFSET(6) NUMBITS(1) [],
48 PWRUART0 OFFSET(7) NUMBITS(1) [],
49 PWRUART1 OFFSET(8) NUMBITS(1) [],
50 PWRADC OFFSET(9) NUMBITS(1) [],
51 PWRSCARD OFFSET(10) NUMBITS(1) [],
52 PWRMSPI OFFSET(11) NUMBITS(1) [],
53 PWRPDM OFFSET(12) NUMBITS(1) [],
54 PWRBLEL OFFSET(13) NUMBITS(1) []
55 ],
56 DEVPWRSTATUS [
57 MCUL OFFSET(0) NUMBITS(1) [],
58 MCUH OFFSET(1) NUMBITS(1) [],
59 HCPA OFFSET(2) NUMBITS(1) [],
60 HCPB OFFSET(3) NUMBITS(1) [],
61 HCPC OFFSET(4) NUMBITS(1) [],
62 PWRADC OFFSET(5) NUMBITS(1) [],
63 PWRMSPI OFFSET(6) NUMBITS(1) [],
64 PWRPDM OFFSET(7) NUMBITS(1) [],
65 BLEL OFFSET(8) NUMBITS(1) [],
66 BLEH OFFSET(9) NUMBITS(1) [],
67 CORESLEEP OFFSET(29) NUMBITS(1) [],
68 COREDEEPSLEEP OFFSET(30) NUMBITS(1) [],
69 SYSDEEPSLEEP OFFSET(31) NUMBITS(1) []
70 ]
71];
72
73pub struct PwrCtrl {
74 registers: StaticRef<PwrCtrlRegisters>,
75}
76
77impl PwrCtrl {
78 pub const fn new() -> PwrCtrl {
79 PwrCtrl {
80 registers: PWRCTRL_BASE,
81 }
82 }
83
84 pub fn enable_uart0(&self) {
85 let regs = self.registers;
86
87 regs.devpwren.modify(DEVPWREN::PWRUART0::SET);
88 }
89
90 pub fn enable_ios(&self) {
91 let regs = self.registers;
92
93 regs.devpwren.modify(DEVPWREN::PWRIOS::SET);
94 }
95
96 pub fn enable_iom0(&self) {
97 let regs = self.registers;
98
99 regs.devpwren.modify(DEVPWREN::PWRIOM0::SET);
100 }
101
102 pub fn enable_iom1(&self) {
103 let regs = self.registers;
104
105 regs.devpwren.modify(DEVPWREN::PWRIOM1::SET);
106 }
107
108 pub fn enable_iom2(&self) {
109 let regs = self.registers;
110
111 regs.devpwren.modify(DEVPWREN::PWRIOM2::SET);
112 }
113
114 pub fn enable_iom3(&self) {
115 let regs = self.registers;
116
117 regs.devpwren.modify(DEVPWREN::PWRIOM3::SET);
118 }
119
120 pub fn enable_iom4(&self) {
121 let regs = self.registers;
122
123 regs.devpwren.modify(DEVPWREN::PWRIOM4::SET);
124 }
125
126 pub fn enable_ble(&self) {
127 let regs = self.registers;
128
129 regs.devpwren.modify(DEVPWREN::PWRBLEL::SET);
130
131 while !regs.devpwrstatus.is_set(DEVPWRSTATUS::BLEL) {}
132 }
133}