1use crate::{
2 init_state::{Disabled, Enabled},
3 pac::{
4 self,
5 dma0::channel::{CFG, XFERCFG},
6 },
7 reg_proxy::RegProxy,
8};
9
10use super::{
11 channels::{self, Channel},
12 descriptors::DescriptorTable,
13};
14
15macro_rules! channels {
16 ($($field:ident, $name:ident, $index:expr, $cfg:ident, $xfercfg:ident;)*) => {
17 #[allow(missing_docs)]
23 pub struct Channels<State> {
24 $(pub $field: Channel<$name, State>,)*
25 }
26
27 impl Channels<Disabled> {
28 pub(super) fn new(descriptors: &'static mut DescriptorTable)
29 -> Self
30 {
31 let mut descriptors = (&mut descriptors.0).into_iter();
32
33 Channels {
34 $(
35 $field: Channel {
36 ty : $name(()),
37 _state : Disabled,
38 descriptor: descriptors.next().unwrap(),
39
40 cfg : RegProxy::new(),
41 xfercfg: RegProxy::new(),
42 },
43 )*
44 }
45 }
46
47 pub(super) fn enable(self) -> Channels<Enabled> {
48 Channels {
49 $(
50 $field: self.$field.enable(),
51 )*
52 }
53 }
54 }
55
56 impl Channels<Enabled> {
57 pub(super) fn disable(self) -> Channels<Disabled> {
58 Channels {
59 $(
60 $field: self.$field.disable(),
61 )*
62 }
63 }
64 }
65
66
67 $(
68 pub struct $xfercfg;
70
71 reg_cluster!($xfercfg, XFERCFG, pac::DMA0, $field, xfercfg);
72
73 pub struct $cfg;
75
76 reg_cluster!($cfg, CFG, pac::DMA0, $field, cfg);
77
78 pub struct $name(());
80
81 impl channels::Instance for $name {
82 const INDEX: usize = $index;
83 const FLAG : u32 = 0x1 << Self::INDEX;
84
85 type Cfg = $cfg;
86 type Xfercfg = $xfercfg;
87 }
88 )*
89 }
90}
91
92#[cfg(feature = "82x")]
93channels!(
96 channel0 , Channel0 , 0, CFG0 , XFERCFG0 ;
97 channel1 , Channel1 , 1, CFG1 , XFERCFG1 ;
98 channel2 , Channel2 , 2, CFG2 , XFERCFG2 ;
99 channel3 , Channel3 , 3, CFG3 , XFERCFG3 ;
100 channel4 , Channel4 , 4, CFG4 , XFERCFG4 ;
101 channel5 , Channel5 , 5, CFG5 , XFERCFG5 ;
102 channel6 , Channel6 , 6, CFG6 , XFERCFG6 ;
103 channel7 , Channel7 , 7, CFG7 , XFERCFG7 ;
104 channel8 , Channel8 , 8, CFG8 , XFERCFG8 ;
105 channel9 , Channel9 , 9, CFG9 , XFERCFG9 ;
106 channel10, Channel10, 10, CFG10, XFERCFG10;
107 channel11, Channel11, 11, CFG11, XFERCFG11;
108 channel12, Channel12, 12, CFG12, XFERCFG12;
109 channel13, Channel13, 13, CFG13, XFERCFG13;
110 channel14, Channel14, 14, CFG14, XFERCFG14;
111 channel15, Channel15, 15, CFG15, XFERCFG15;
112 channel16, Channel16, 16, CFG16, XFERCFG16;
113 channel17, Channel17, 17, CFG17, XFERCFG17;
114);
115
116#[cfg(feature = "845")]
117channels!(
120 channel0 , Channel0 , 0, CFG0 , XFERCFG0 ;
121 channel1 , Channel1 , 1, CFG1 , XFERCFG1 ;
122 channel2 , Channel2 , 2, CFG2 , XFERCFG2 ;
123 channel3 , Channel3 , 3, CFG3 , XFERCFG3 ;
124 channel4 , Channel4 , 4, CFG4 , XFERCFG4 ;
125 channel5 , Channel5 , 5, CFG5 , XFERCFG5 ;
126 channel6 , Channel6 , 6, CFG6 , XFERCFG6 ;
127 channel7 , Channel7 , 7, CFG7 , XFERCFG7 ;
128 channel8 , Channel8 , 8, CFG8 , XFERCFG8 ;
129 channel9 , Channel9 , 9, CFG9 , XFERCFG9 ;
130 channel10, Channel10, 10, CFG10, XFERCFG10;
131 channel11, Channel11, 11, CFG11, XFERCFG11;
132 channel12, Channel12, 12, CFG12, XFERCFG12;
133 channel13, Channel13, 13, CFG13, XFERCFG13;
134 channel14, Channel14, 14, CFG14, XFERCFG14;
135 channel15, Channel15, 15, CFG15, XFERCFG15;
136 channel16, Channel16, 16, CFG16, XFERCFG16;
137 channel17, Channel17, 17, CFG17, XFERCFG17;
138 channel18, Channel18, 18, CFG18, XFERCFG18;
139 channel19, Channel19, 19, CFG19, XFERCFG19;
140 channel20, Channel20, 20, CFG20, XFERCFG20;
141 channel21, Channel21, 21, CFG21, XFERCFG21;
142 channel22, Channel22, 22, CFG22, XFERCFG22;
143 channel23, Channel23, 23, CFG23, XFERCFG23;
144 channel24, Channel24, 24, CFG24, XFERCFG24;
145);