diff options
| author | Dario Nieuwenhuis <[email protected]> | 2021-07-17 07:49:49 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2021-07-17 07:54:16 +0200 |
| commit | 3655048e0f8238dc64425ff79d9cf951b9b1f340 (patch) | |
| tree | f71c22d81f409aa491e6887c6fbe6ab6f3ac99a3 | |
| parent | 54b5012c568f5b952fefe50ad6a032b54172dabd (diff) | |
stm32/dma: add MuxChannel trait to distinguish DMAMUX1 and DMAMUX2 channels.
| -rw-r--r-- | embassy-stm32/src/dma/bdma.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/dma.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/dmamux.rs | 22 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/mod.rs | 3 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/mod.rs | 10 |
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 | ||
| 22 | pub(crate) trait MuxChannel { | 22 | pub(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 | |||
| 30 | pub struct DMAMUX1; | ||
| 31 | #[cfg(rcc_h7)] | ||
| 32 | pub struct DMAMUX2; | ||
| 33 | |||
| 34 | pub trait MuxChannel: sealed::MuxChannel + super::Channel { | ||
| 35 | type Mux; | ||
| 25 | } | 36 | } |
| 26 | 37 | ||
| 27 | pac::dma_channels! { | 38 | pac::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)] |
| 6 | mod dmamux; | 6 | mod dmamux; |
| 7 | 7 | ||
| 8 | #[cfg(dmamux)] | ||
| 9 | pub use dmamux::*; | ||
| 10 | |||
| 8 | use core::future::Future; | 11 | use core::future::Future; |
| 9 | use embassy::util::Unborrow; | 12 | use 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 | ||
| 173 | macro_rules! impl_dma { | 173 | macro_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 { |
