diff --git a/embassy-stm32/src/bdma/mod.rs b/embassy-stm32/src/bdma/mod.rs index d62feb5b9..d36361e4c 100644 --- a/embassy-stm32/src/bdma/mod.rs +++ b/embassy-stm32/src/bdma/mod.rs @@ -13,7 +13,7 @@ use crate::interrupt; use crate::pac; use crate::pac::bdma::vals; -const CH_COUNT: usize = pac::peripheral_count!(DMA) * 8; +const CH_COUNT: usize = pac::peripheral_count!(bdma) * 8; const CH_STATUS_NONE: u8 = 0; const CH_STATUS_COMPLETED: u8 = 1; const CH_STATUS_ERROR: u8 = 2; @@ -271,11 +271,15 @@ macro_rules! impl_dma_channel { let state_num = self.state_num(); let regs = self.regs(); - use crate::dmamux::sealed::Channel as _MuxChannel; + use crate::dmamux::sealed::Channel as MuxChannel; use crate::dmamux::sealed::PeripheralChannel; - let dmamux_regs = self.dmamux_regs(); - let dmamux_ch_num = self.dmamux_ch_num(); - let request = PeripheralChannel::::request(self); + let dmamux_regs = ::DMAMUX_REGS; + let dmamux_ch_num = + ::DMAMUX_CH_NUM; + let request = >::REQUEST; unsafe { transfer_m2p( regs, @@ -316,7 +320,7 @@ macro_rules! impl_dma_channel { #[cfg(dmamux)] impl ReadDma for crate::peripherals::$channel_peri where - Self: crate::dmamux::sealed::PeripheralChannel, + Self: crate::dmamux::sealed::PeripheralChannel, T: 'static, { type ReadDmaFuture<'a> = impl Future; @@ -334,11 +338,15 @@ macro_rules! impl_dma_channel { let state_num = self.state_num(); let regs = self.regs(); - use crate::dmamux::sealed::Channel as _MuxChannel; + use crate::dmamux::sealed::Channel as MuxChannel; use crate::dmamux::sealed::PeripheralChannel; - let dmamux_regs = self.dmamux_regs(); - let dmamux_ch_num = self.dmamux_ch_num(); - let request = PeripheralChannel::::request(self); + let dmamux_regs = ::DMAMUX_REGS; + let dmamux_ch_num = + ::DMAMUX_CH_NUM; + let request = >::REQUEST; unsafe { transfer_p2m( regs, diff --git a/embassy-stm32/src/dmamux/mod.rs b/embassy-stm32/src/dmamux/mod.rs index 564b8236a..ecea0b290 100644 --- a/embassy-stm32/src/dmamux/mod.rs +++ b/embassy-stm32/src/dmamux/mod.rs @@ -25,79 +25,65 @@ pub(crate) unsafe fn configure_dmamux( pub(crate) mod sealed { use super::*; - pub trait DmaMux { - fn regs() -> pac::dmamux::Dmamux; - } - pub trait Channel { - fn dmamux_regs(&self) -> pac::dmamux::Dmamux; - fn dmamux_ch_num(&self) -> u8; + const DMAMUX_CH_NUM: u8; + const DMAMUX_REGS: pac::dmamux::Dmamux; } pub trait PeripheralChannel: Channel { - fn request(&self) -> u8; + const REQUEST: u8; } } -pub trait DmaMux: sealed::DmaMux {} pub trait Channel: sealed::Channel {} pub trait PeripheralChannel: sealed::Channel {} pub struct P2M; pub struct M2P; -#[allow(unused)] -macro_rules! impl_dma_channel { - ($channel_peri:ident, $dmamux_peri:ident, $channel_num:expr, $dma_peri: ident, $dma_num:expr) => { - impl Channel for peripherals::$channel_peri {} - impl sealed::Channel for peripherals::$channel_peri { - fn dmamux_regs(&self) -> pac::dmamux::Dmamux { - crate::pac::$dmamux_peri - } - - fn dmamux_ch_num(&self) -> u8 { - ($dma_num * 8) + $channel_num - } - } +macro_rules! dma_num { + (DMA1) => { + 0 + }; + (DMA2) => { + 1 + }; + (BDMA) => { + 0 }; } -macro_rules! impl_dmamux { - ($peri:ident) => { - impl sealed::DmaMux for peripherals::$peri { - fn regs() -> pac::dmamux::Dmamux { - pac::$peri - } +macro_rules! dmamux_peri { + (DMA1) => { + crate::pac::DMAMUX1 + }; + (DMA2) => { + crate::pac::DMAMUX1 + }; + (BDMA) => { + crate::pac::DMAMUX1 + }; +} + +#[allow(unused)] +macro_rules! impl_dma_channel { + ($channel_peri:ident, $channel_num:expr, $dma_peri: ident) => { + impl Channel for peripherals::$channel_peri {} + impl sealed::Channel for peripherals::$channel_peri { + const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num; + const DMAMUX_REGS: pac::dmamux::Dmamux = dmamux_peri!($dma_peri); } - impl DmaMux for peripherals::$peri {} }; } peripherals! { - (bdma, DMA1) => { + (bdma, $peri:ident) => { bdma_channels! { - ($channel_peri:ident, DMA1, $channel_num:expr) => { - impl_dma_channel!($channel_peri, DMAMUX1, $channel_num, DMA1, 0); + ($channel_peri:ident, $peri, $channel_num:expr) => { + impl_dma_channel!($channel_peri, $channel_num, $peri); }; } }; - (bdma, DMA2) => { - bdma_channels! { - ($channel_peri:ident, DMA2, $channel_num:expr) => { - impl_dma_channel!($channel_peri, DMAMUX1, $channel_num, DMA2, 1); - }; - } - }; - (bdma, BDMA) => { - bdma_channels! { - ($channel_peri:ident, BDMA, $channel_num:expr) => { - impl_dma_channel!($channel_peri, DMAMUX1, $channel_num, DMA2, 1); - }; - } - }; - (dmamux, DMAMUX1) => { - impl_dmamux!(DMAMUX1); - }; } #[allow(unused)] @@ -106,9 +92,7 @@ macro_rules! impl_peripheral_channel { impl sealed::PeripheralChannel for peripherals::$channel_peri { - fn request(&self) -> u8 { - $request - } + const REQUEST: u8 = $request; } impl PeripheralChannel for peripherals::$channel_peri {} diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs index e7e3382f9..37254f6f0 100644 --- a/stm32-metapac-gen/src/lib.rs +++ b/stm32-metapac-gen/src/lib.rs @@ -304,6 +304,11 @@ pub fn gen(options: Options) { if let Some(block) = &p.block { let bi = BlockInfo::parse(block); + peripheral_counts.insert( + bi.module.clone(), + peripheral_counts.get(&bi.module).map_or(1, |v| v + 1), + ); + for pin in &p.pins { let mut row = Vec::new(); row.push(name.clone());