1use kernel::platform::chip::ClockInterface;
6use kernel::utilities::registers::{register_bitfields, ReadOnly, ReadWrite};
7use kernel::utilities::StaticRef;
8
9use crate::rcc;
10
11#[repr(C)]
13struct Dma1Registers {
14 isr: ReadOnly<u32, ISR::Register>,
16 ifcr: ReadWrite<u32, IFCR::Register>,
18
19 ccr1: ReadWrite<u32, CCR::Register>,
21 cndtr1: ReadWrite<u32, CNDTR::Register>,
23 cpar1: ReadWrite<u32, CPAR::Register>,
25 cmar1: ReadWrite<u32, CMAR::Register>,
27
28 _reserved0: [u8; 4],
29
30 ccr2: ReadWrite<u32, CCR::Register>,
32 cndtr2: ReadWrite<u32, CNDTR::Register>,
34 cpar2: ReadWrite<u32, CPAR::Register>,
36 cmar2: ReadWrite<u32, CMAR::Register>,
38
39 _reserved1: [u8; 4],
40
41 ccr3: ReadWrite<u32, CCR::Register>,
43 cndtr3: ReadWrite<u32, CNDTR::Register>,
45 cpar3: ReadWrite<u32, CPAR::Register>,
47 cmar3: ReadWrite<u32, CMAR::Register>,
49
50 _reserved2: [u8; 4],
51
52 ccr4: ReadWrite<u32, CCR::Register>,
54 cndtr4: ReadWrite<u32, CNDTR::Register>,
56 cpar4: ReadWrite<u32, CPAR::Register>,
58 cmar4: ReadWrite<u32, CMAR::Register>,
60
61 _reserved3: [u8; 4],
62
63 ccr5: ReadWrite<u32, CCR::Register>,
65 cndtr5: ReadWrite<u32, CNDTR::Register>,
67 cpar5: ReadWrite<u32, CPAR::Register>,
69 cmar5: ReadWrite<u32, CMAR::Register>,
71
72 _reserved4: [u8; 4],
73
74 ccr6: ReadWrite<u32, CCR::Register>,
76 cndtr6: ReadWrite<u32, CNDTR::Register>,
78 cpar6: ReadWrite<u32, CPAR::Register>,
80 cmar6: ReadWrite<u32, CMAR::Register>,
82
83 _reserved5: [u8; 4],
84
85 ccr7: ReadWrite<u32, CCR::Register>,
87 cndtr7: ReadWrite<u32, CNDTR::Register>,
89 cpar7: ReadWrite<u32, CPAR::Register>,
91 cmar7: ReadWrite<u32, CMAR::Register>,
93}
94
95register_bitfields![u32,
96 ISR [
97 TEIF7 OFFSET(27) NUMBITS(1) [],
99 HTIF7 OFFSET(26) NUMBITS(1) [],
101 TCIF7 OFFSET(25) NUMBITS(1) [],
103 GIF7 OFFSET(24) NUMBITS(1) [],
105
106 TEIF6 OFFSET(23) NUMBITS(1) [],
108 HTIF6 OFFSET(22) NUMBITS(1) [],
110 TCIF6 OFFSET(21) NUMBITS(1) [],
112 GIF6 OFFSET(20) NUMBITS(1) [],
114
115 TEIF5 OFFSET(19) NUMBITS(1) [],
117 HTIF5 OFFSET(18) NUMBITS(1) [],
119 TCIF5 OFFSET(17) NUMBITS(1) [],
121 GIF5 OFFSET(16) NUMBITS(1) [],
123
124 TEIF4 OFFSET(15) NUMBITS(1) [],
126 HTIF4 OFFSET(14) NUMBITS(1) [],
128 TCIF4 OFFSET(13) NUMBITS(1) [],
130 GIF4 OFFSET(12) NUMBITS(1) [],
132
133 TEIF3 OFFSET(11) NUMBITS(1) [],
135 HTIF3 OFFSET(10) NUMBITS(1) [],
137 TCIF3 OFFSET(9) NUMBITS(1) [],
139 GIF3 OFFSET(8) NUMBITS(1) [],
141
142 TEIF2 OFFSET(7) NUMBITS(1) [],
144 HTIF2 OFFSET(6) NUMBITS(1) [],
146 TCIF2 OFFSET(5) NUMBITS(1) [],
148 GIF2 OFFSET(4) NUMBITS(1) [],
150
151 TEIF1 OFFSET(3) NUMBITS(1) [],
153 HTIF1 OFFSET(2) NUMBITS(1) [],
155 TCIF1 OFFSET(1) NUMBITS(1) [],
157 GIF1 OFFSET(0) NUMBITS(1) []
159 ],
160 IFCR [
161 CTEIF7 OFFSET(27) NUMBITS(1) [],
163 CHTIF7 OFFSET(26) NUMBITS(1) [],
165 CTCIF7 OFFSET(25) NUMBITS(1) [],
167 CGIF7 OFFSET(24) NUMBITS(1) [],
169
170 CTEIF6 OFFSET(23) NUMBITS(1) [],
172 CHTIF6 OFFSET(22) NUMBITS(1) [],
174 CTCIF6 OFFSET(21) NUMBITS(1) [],
176 CGIF6 OFFSET(20) NUMBITS(1) [],
178
179 CTEIF5 OFFSET(19) NUMBITS(1) [],
181 CHTIF5 OFFSET(18) NUMBITS(1) [],
183 CTCIF5 OFFSET(17) NUMBITS(1) [],
185 CGIF5 OFFSET(16) NUMBITS(1) [],
187
188 CTEIF4 OFFSET(15) NUMBITS(1) [],
190 CHTIF4 OFFSET(14) NUMBITS(1) [],
192 CTCIF4 OFFSET(13) NUMBITS(1) [],
194 CGIF4 OFFSET(12) NUMBITS(1) [],
196
197 CTEIF3 OFFSET(11) NUMBITS(1) [],
199 CHTIF3 OFFSET(10) NUMBITS(1) [],
201 CTCIF3 OFFSET(9) NUMBITS(1) [],
203 CGIF3 OFFSET(8) NUMBITS(1) [],
205
206 CTEIF2 OFFSET(7) NUMBITS(1) [],
208 CHTIF2 OFFSET(6) NUMBITS(1) [],
210 CTCIF2 OFFSET(5) NUMBITS(1) [],
212 CGIF2 OFFSET(4) NUMBITS(1) [],
214
215 CTEIF1 OFFSET(3) NUMBITS(1) [],
217 CHTIF1 OFFSET(2) NUMBITS(1) [],
219 CTCIF1 OFFSET(1) NUMBITS(1) [],
221 CGIF1 OFFSET(0) NUMBITS(1) []
223 ],
224 CCR [
225 MEM2MEM OFFSET(14) NUMBITS(1) [],
227 PL OFFSET(12) NUMBITS(2) [],
229 MSIZE OFFSET(10) NUMBITS(2) [],
231 PSIZE OFFSET(8) NUMBITS(2) [],
233 MINC OFFSET(7) NUMBITS(1) [],
235 PINC OFFSET(6) NUMBITS(1) [],
237 CIRC OFFSET(5) NUMBITS(1) [],
239 DIR OFFSET(4) NUMBITS(1) [],
241 TEIE OFFSET(3) NUMBITS(1) [],
243 HTIE OFFSET(2) NUMBITS(1) [],
245 TCIE OFFSET(1) NUMBITS(1) [],
247 EN OFFSET(0) NUMBITS(1) []
249 ],
250 CNDTR [
251 NDT OFFSET(0) NUMBITS(16) []
253 ],
254 CPAR [
255 PA OFFSET(0) NUMBITS(32) []
257 ],
258 CMAR [
259 MA OFFSET(0) NUMBITS(32) []
261 ]
262];
263
264const DMA1_BASE: StaticRef<Dma1Registers> =
265 unsafe { StaticRef::new(0x4002_0000 as *const Dma1Registers) };
266
267#[allow(dead_code)]
268#[repr(u32)]
269enum ChannelId {
270 Channel1 = 0b000,
271 Channel2 = 0b001,
272 Channel3 = 0b010,
273 Channel4 = 0b011,
274 Channel5 = 0b100,
275 Channel6 = 0b101,
276 Channel7 = 0b110,
277}
278
279#[allow(dead_code)]
281#[repr(u32)]
282enum Priority {
283 Low = 0b00,
284 Medium = 0b01,
285 High = 0b10,
286 VeryHigh = 0b11,
287}
288
289#[allow(dead_code)]
291#[repr(u32)]
292enum Size {
293 Byte = 0b00,
294 HalfWord = 0b01,
295 Word = 0b10,
296}
297
298#[allow(unused)]
299struct Msize(Size);
300#[allow(unused)]
301struct Psize(Size);
302
303#[allow(non_camel_case_types, non_snake_case)]
306#[derive(Copy, Clone, PartialEq)]
307pub enum Dma1Peripheral {
308 USART1_TX,
309 USART1_RX,
310}
311
312pub struct Dma1<'a> {
313 _registers: StaticRef<Dma1Registers>,
314 clock: Dma1Clock<'a>,
315}
316
317impl<'a> Dma1<'a> {
318 pub const fn new(rcc: &'a rcc::Rcc) -> Self {
319 Self {
320 _registers: DMA1_BASE,
321 clock: Dma1Clock(rcc::PeripheralClock::new(
322 rcc::PeripheralClockType::AHB(rcc::HCLK::DMA1),
323 rcc,
324 )),
325 }
326 }
327
328 pub fn is_enabled_clock(&self) -> bool {
329 self.clock.is_enabled()
330 }
331
332 pub fn enable_clock(&self) {
333 self.clock.enable();
334 }
335
336 pub fn disable_clock(&self) {
337 self.clock.disable();
338 }
339}
340
341struct Dma1Clock<'a>(rcc::PeripheralClock<'a>);
342
343impl ClockInterface for Dma1Clock<'_> {
344 fn is_enabled(&self) -> bool {
345 self.0.is_enabled()
346 }
347
348 fn enable(&self) {
349 self.0.enable();
350 }
351
352 fn disable(&self) {
353 self.0.disable();
354 }
355}