1use kernel::debug;
8use kernel::utilities::registers::interfaces::{ReadWriteable, Readable};
9use kernel::utilities::registers::{register_bitfields, register_structs, ReadWrite};
10use kernel::utilities::StaticRef;
11
12const MCUCTRL_BASE: StaticRef<McuCtrlRegisters> =
13 unsafe { StaticRef::new(0x4002_0000 as *const McuCtrlRegisters) };
14
15register_structs! {
16 pub McuCtrlRegisters {
17 (0x000 => chippn: ReadWrite<u32>),
18 (0x004 => chipid0: ReadWrite<u32>),
19 (0x008 => chipid1: ReadWrite<u32>),
20 (0x00c => chiprev: ReadWrite<u32, CHIPREV::Register>),
21 (0x010 => vendorid: ReadWrite<u32>),
22 (0x014 => sku: ReadWrite<u32>),
23 (0x018 => featureenable: ReadWrite<u32, FEATUREENABLE::Register>),
24 (0x01C => _reserved0),
25 (0x020 => debugger: ReadWrite<u32>),
26 (0x024 => _reserved1),
27 (0x104 => adcpwrdly: ReadWrite<u32>),
28 (0x108 => _reserved2),
29 (0x10C => adccal: ReadWrite<u32>),
30 (0x110 => adcbattload: ReadWrite<u32>),
31 (0x114 => _reserved3),
32 (0x118 => adctrim: ReadWrite<u32>),
33 (0x11C => adcrefcomp: ReadWrite<u32>),
34 (0x120 => xtalctrl: ReadWrite<u32>),
35 (0x124 => xtalgenctrl: ReadWrite<u32>),
36 (0x128 => _reserved4),
37 (0x198 => miscctrl: ReadWrite<u32, MISCCTRL::Register>),
38 (0x19C => _reserved5),
39 (0x1A0 => bootloader: ReadWrite<u32>),
40 (0x1A4 => shadowvalid: ReadWrite<u32>),
41 (0x1A8 => _reserved6),
42 (0x1B0 => scratch0: ReadWrite<u32>),
43 (0x1B4 => scratch1: ReadWrite<u32>),
44 (0x1B8 => _reserved7),
45 (0x1C0 => icodefaultaddr: ReadWrite<u32>),
46 (0x1C4 => dcodefaultaddr: ReadWrite<u32>),
47 (0x1C8 => sysfaultaddr: ReadWrite<u32>),
48 (0x1CC => faultstatus: ReadWrite<u32>),
49 (0x1D0 => faultcaptureen: ReadWrite<u32>),
50 (0x1D4 => _reserved8),
51 (0x200 => dbgr1: ReadWrite<u32>),
52 (0x204 => dbgr2: ReadWrite<u32>),
53 (0x208 => _reserved9),
54 (0x220 => pmuenable: ReadWrite<u32>),
55 (0x224 => _reserved10),
56 (0x250 => tpiuctrl: ReadWrite<u32>),
57 (0x254 => _reserved11),
58 (0x264 => otapointer: ReadWrite<u32>),
59 (0x268 => _reserved12),
60 (0x284 => srammode: ReadWrite<u32>),
61 (0x288 => _reserved13),
62 (0x348 => kextclksel: ReadWrite<u32>),
63 (0x34C => _reserved14),
64 (0x358 => simobuck3: ReadWrite<u32>),
65 (0x35C => simobuck4: ReadWrite<u32>),
66 (0x360 => _reserved15),
67 (0x368 => blebuck2: ReadWrite<u32, BLEBUCK2::Register>),
68 (0x36C => _reserved16),
69 (0x3A0 => flashwprot0: ReadWrite<u32>),
70 (0x3A4 => flashwprot1: ReadWrite<u32>),
71 (0x3A8 => _reserved17),
72 (0x3B0 => flashrprot0: ReadWrite<u32>),
73 (0x3B4 => flashrprot1: ReadWrite<u32>),
74 (0x3B8 => _reserved18),
75 (0x3C0 => dmasramwriteprotect0: ReadWrite<u32>),
76 (0x3C4 => dmasramwriteprotect1: ReadWrite<u32>),
77 (0x3C8 => _reserved19),
78 (0x3D0 => dmasramreadprotect0: ReadWrite<u32>),
79 (0x3D4 => dmasramreadprotect1: ReadWrite<u32>),
80 (0x3D8 => @END),
81 }
82}
83
84register_bitfields![u32,
85 CHIPREV [
86 REVMIN OFFSET(0) NUMBITS(3) [],
87 REVMAJ OFFSET(4) NUMBITS(3) [],
88 SIPART OFFSET(8) NUMBITS(12) []
89 ],
90 FEATUREENABLE [
91 BLEREQ OFFSET(0) NUMBITS(1) [],
92 BLEACK OFFSET(1) NUMBITS(1) [],
93 BLEAVAIL OFFSET(2) NUMBITS(1) [],
94 BURSTREQ OFFSET(4) NUMBITS(1) [],
95 BURSTSTACK OFFSET(5) NUMBITS(1) [],
96 BURSTAVAIL OFFSET(6) NUMBITS(1) []
97 ],
98 MISCCTRL [
99 BLE_RESETN OFFSET(5) NUMBITS(1) []
100 ],
101 BLEBUCK2 [
102 BLEBUCKTONLOWTRIM OFFSET(0) NUMBITS(6) [],
103 BLEBUCKTONHITRIM OFFSET(6) NUMBITS(6) [],
104 BLEBUCKTOND2ATRIM OFFSET(12) NUMBITS(6) []
105 ]
106];
107
108pub struct McuCtrl {
109 registers: StaticRef<McuCtrlRegisters>,
110}
111
112impl McuCtrl {
113 pub const fn new() -> McuCtrl {
114 McuCtrl {
115 registers: MCUCTRL_BASE,
116 }
117 }
118
119 pub fn print_chip_revision(&self) {
120 let regs = self.registers;
121
122 let chiprev = regs.chiprev.extract();
123
124 if chiprev.read(CHIPREV::REVMAJ) == 0x2 {
126 debug!("Apollo3 chip revision: B");
127 } else if chiprev.read(CHIPREV::REVMAJ) == 0x1 {
128 if chiprev.read(CHIPREV::REVMIN) == 0x2 {
129 debug!("Apollo3 chip revision: A rev1");
130 } else if chiprev.read(CHIPREV::REVMIN) == 0x1 {
131 debug!("Apollo3 chip revision: A rev0");
132 }
133 }
134 }
135
136 pub fn disable_ble(&self) {
137 self.registers
138 .featureenable
139 .modify(FEATUREENABLE::BLEREQ::CLEAR);
140 }
141
142 pub fn enable_ble(&self) {
143 let regs = self.registers;
144
145 regs.blebuck2
146 .modify(BLEBUCK2::BLEBUCKTONHITRIM.val(0x19) + BLEBUCK2::BLEBUCKTONLOWTRIM.val(0xC));
147
148 regs.featureenable.modify(FEATUREENABLE::BLEREQ::SET);
149
150 while !regs.featureenable.is_set(FEATUREENABLE::BLEREQ)
151 && regs.featureenable.is_set(FEATUREENABLE::BLEACK)
152 && regs.featureenable.is_set(FEATUREENABLE::BLEAVAIL)
153 {}
154 }
155
156 pub fn reset_ble(&self) {
157 let regs = self.registers;
158
159 regs.miscctrl.modify(MISCCTRL::BLE_RESETN::SET);
160 }
161}