aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-07-17 07:49:49 +0200
committerDario Nieuwenhuis <[email protected]>2021-07-17 07:54:16 +0200
commit3655048e0f8238dc64425ff79d9cf951b9b1f340 (patch)
treef71c22d81f409aa491e6887c6fbe6ab6f3ac99a3
parent54b5012c568f5b952fefe50ad6a032b54172dabd (diff)
stm32/dma: add MuxChannel trait to distinguish DMAMUX1 and DMAMUX2 channels.
-rw-r--r--embassy-stm32/src/dma/bdma.rs8
-rw-r--r--embassy-stm32/src/dma/dma.rs8
-rw-r--r--embassy-stm32/src/dma/dmamux.rs22
-rw-r--r--embassy-stm32/src/dma/mod.rs3
-rw-r--r--embassy-stm32/src/usart/mod.rs10
5 files changed, 37 insertions, 14 deletions
diff --git a/embassy-stm32/src/dma/bdma.rs b/embassy-stm32/src/dma/bdma.rs
index 3d9ff9eb0..4c26a9501 100644
--- a/embassy-stm32/src/dma/bdma.rs
+++ b/embassy-stm32/src/dma/bdma.rs
@@ -175,9 +175,9 @@ pac::dma_channels! {
175 buf.as_mut_ptr(), 175 buf.as_mut_ptr(),
176 buf.len(), 176 buf.len(),
177 #[cfg(dmamux)] 177 #[cfg(dmamux)]
178 <Self as super::dmamux::MuxChannel>::DMAMUX_REGS, 178 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_REGS,
179 #[cfg(dmamux)] 179 #[cfg(dmamux)]
180 <Self as super::dmamux::MuxChannel>::DMAMUX_CH_NUM, 180 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_CH_NUM,
181 ) 181 )
182 } 182 }
183 } 183 }
@@ -199,9 +199,9 @@ pac::dma_channels! {
199 buf.as_ptr() as *mut u8, 199 buf.as_ptr() as *mut u8,
200 buf.len(), 200 buf.len(),
201 #[cfg(dmamux)] 201 #[cfg(dmamux)]
202 <Self as super::dmamux::MuxChannel>::DMAMUX_REGS, 202 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_REGS,
203 #[cfg(dmamux)] 203 #[cfg(dmamux)]
204 <Self as super::dmamux::MuxChannel>::DMAMUX_CH_NUM, 204 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_CH_NUM,
205 ) 205 )
206 } 206 }
207 } 207 }
diff --git a/embassy-stm32/src/dma/dma.rs b/embassy-stm32/src/dma/dma.rs
index 9b1c11606..75fc14035 100644
--- a/embassy-stm32/src/dma/dma.rs
+++ b/embassy-stm32/src/dma/dma.rs
@@ -177,9 +177,9 @@ pac::dma_channels! {
177 buf.as_mut_ptr(), 177 buf.as_mut_ptr(),
178 buf.len(), 178 buf.len(),
179 #[cfg(dmamux)] 179 #[cfg(dmamux)]
180 <Self as super::dmamux::MuxChannel>::DMAMUX_REGS, 180 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_REGS,
181 #[cfg(dmamux)] 181 #[cfg(dmamux)]
182 <Self as super::dmamux::MuxChannel>::DMAMUX_CH_NUM, 182 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_CH_NUM,
183 ) 183 )
184 } 184 }
185 } 185 }
@@ -201,9 +201,9 @@ pac::dma_channels! {
201 buf.as_ptr() as *mut u8, 201 buf.as_ptr() as *mut u8,
202 buf.len(), 202 buf.len(),
203 #[cfg(dmamux)] 203 #[cfg(dmamux)]
204 <Self as super::dmamux::MuxChannel>::DMAMUX_REGS, 204 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_REGS,
205 #[cfg(dmamux)] 205 #[cfg(dmamux)]
206 <Self as super::dmamux::MuxChannel>::DMAMUX_CH_NUM, 206 <Self as super::dmamux::sealed::MuxChannel>::DMAMUX_CH_NUM,
207 ) 207 )
208 } 208 }
209 } 209 }
diff --git a/embassy-stm32/src/dma/dmamux.rs b/embassy-stm32/src/dma/dmamux.rs
index 186ec2471..718859a44 100644
--- a/embassy-stm32/src/dma/dmamux.rs
+++ b/embassy-stm32/src/dma/dmamux.rs
@@ -19,17 +19,31 @@ pub(crate) unsafe fn configure_dmamux(
19 }); 19 });
20} 20}
21 21
22pub(crate) trait MuxChannel { 22pub(crate) mod sealed {
23 const DMAMUX_CH_NUM: u8; 23 use super::*;
24 const DMAMUX_REGS: pac::dmamux::Dmamux; 24 pub trait MuxChannel {
25 const DMAMUX_CH_NUM: u8;
26 const DMAMUX_REGS: pac::dmamux::Dmamux;
27 }
28}
29
30pub struct DMAMUX1;
31#[cfg(rcc_h7)]
32pub struct DMAMUX2;
33
34pub trait MuxChannel: sealed::MuxChannel + super::Channel {
35 type Mux;
25} 36}
26 37
27pac::dma_channels! { 38pac::dma_channels! {
28 ($channel_peri:ident, $dma_peri:ident, $version:ident, $channel_num:expr, {dmamux: $dmamux:ident, dmamux_channel: $dmamux_channel:expr}) => { 39 ($channel_peri:ident, $dma_peri:ident, $version:ident, $channel_num:expr, {dmamux: $dmamux:ident, dmamux_channel: $dmamux_channel:expr}) => {
29 impl MuxChannel for peripherals::$channel_peri { 40 impl sealed::MuxChannel for peripherals::$channel_peri {
30 const DMAMUX_CH_NUM: u8 = $dmamux_channel; 41 const DMAMUX_CH_NUM: u8 = $dmamux_channel;
31 const DMAMUX_REGS: pac::dmamux::Dmamux = pac::$dmamux; 42 const DMAMUX_REGS: pac::dmamux::Dmamux = pac::$dmamux;
32 } 43 }
44 impl MuxChannel for peripherals::$channel_peri {
45 type Mux = $dmamux;
46 }
33 }; 47 };
34} 48}
35 49
diff --git a/embassy-stm32/src/dma/mod.rs b/embassy-stm32/src/dma/mod.rs
index ebad3d7b6..fbf82b87b 100644
--- a/embassy-stm32/src/dma/mod.rs
+++ b/embassy-stm32/src/dma/mod.rs
@@ -5,6 +5,9 @@ mod dma;
5#[cfg(dmamux)] 5#[cfg(dmamux)]
6mod dmamux; 6mod dmamux;
7 7
8#[cfg(dmamux)]
9pub use dmamux::*;
10
8use core::future::Future; 11use core::future::Future;
9use embassy::util::Unborrow; 12use embassy::util::Unborrow;
10 13
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs
index 92021d0af..9df00d3a8 100644
--- a/embassy-stm32/src/usart/mod.rs
+++ b/embassy-stm32/src/usart/mod.rs
@@ -172,13 +172,19 @@ crate::pac::peripheral_pins!(
172 172
173macro_rules! impl_dma { 173macro_rules! impl_dma {
174 ($inst:ident, {dmamux: $dmamux:ident}, $signal:ident, $request:expr) => { 174 ($inst:ident, {dmamux: $dmamux:ident}, $signal:ident, $request:expr) => {
175 impl<T: crate::dma::Channel> sealed::$signal<peripherals::$inst> for T { 175 impl<T> sealed::$signal<peripherals::$inst> for T
176 where
177 T: crate::dma::MuxChannel<Mux = crate::dma::$dmamux>,
178 {
176 fn request(&self) -> dma::Request { 179 fn request(&self) -> dma::Request {
177 $request 180 $request
178 } 181 }
179 } 182 }
180 183
181 impl<T: crate::dma::Channel> $signal<peripherals::$inst> for T {} 184 impl<T> $signal<peripherals::$inst> for T where
185 T: crate::dma::MuxChannel<Mux = crate::dma::$dmamux>
186 {
187 }
182 }; 188 };
183 ($inst:ident, {channel: $channel:ident}, $signal:ident, $request:expr) => { 189 ($inst:ident, {channel: $channel:ident}, $signal:ident, $request:expr) => {
184 impl sealed::$signal<peripherals::$inst> for peripherals::$channel { 190 impl sealed::$signal<peripherals::$inst> for peripherals::$channel {