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}