From b4abb1f5c23995fab13c2fd7a76daebb8ed5b45c Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Wed, 23 Feb 2022 18:55:16 +0100 Subject: [PATCH 1/2] stm32: move dma trait impls from macrotables to build.rs --- embassy-stm32/build.rs | 57 +++++++++++++++++++++++++++++++++- embassy-stm32/src/dcmi.rs | 9 ------ embassy-stm32/src/i2c/mod.rs | 9 ------ embassy-stm32/src/spi/mod.rs | 9 ------ embassy-stm32/src/traits.rs | 8 ++--- embassy-stm32/src/usart/mod.rs | 15 --------- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 6bef745f..fd9a07ce 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; use quote::{format_ident, quote}; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::env; use std::fs; use std::path::PathBuf; @@ -230,6 +230,61 @@ fn main() { }) } + // ======== + // Generate dma_trait_impl! + + let signals: HashMap<_, _> = [ + // (kind, signal) => trait + (("usart", "RX"), quote!(crate::usart::RxDma)), + (("usart", "TX"), quote!(crate::usart::TxDma)), + (("spi", "RX"), quote!(crate::spi::RxDma)), + (("spi", "TX"), quote!(crate::spi::TxDma)), + (("i2c", "RX"), quote!(crate::i2c::RxDma)), + (("i2c", "TX"), quote!(crate::i2c::TxDma)), + (("dcmi", "DCMI"), quote!(crate::dcmi::FrameDma)), + (("dcmi", "PSSI"), quote!(crate::dcmi::FrameDma)), + ] + .into(); + + for p in METADATA.peripherals { + if let Some(regs) = &p.registers { + let mut dupe = HashSet::new(); + for ch in p.dma_channels { + // Some chips have multiple request numbers for the same (peri, signal, channel) combos. + // Ignore the dupes, picking the first one. Otherwise this causes conflicting trait impls + let key = (ch.signal, ch.channel); + if !dupe.insert(key) { + continue; + } + + if let Some(tr) = signals.get(&(regs.kind, ch.signal)) { + let peri = format_ident!("{}", p.name); + + let channel = if let Some(channel) = &ch.channel { + let channel = format_ident!("{}", channel); + quote!({channel: #channel}) + } else if let Some(dmamux) = &ch.dmamux { + let dmamux = format_ident!("{}", dmamux); + quote!({dmamux: #dmamux}) + } else { + unreachable!(); + }; + + let request = if let Some(request) = ch.request { + let request = request as u8; + quote!(#request) + } else { + quote!(()) + }; + + g.extend(quote! { + dma_trait_impl!(#tr, #peri, #channel, #request); + }); + } + } + } + } + // ======== // Write generated.rs diff --git a/embassy-stm32/src/dcmi.rs b/embassy-stm32/src/dcmi.rs index 1fa19e87..ff6f0970 100644 --- a/embassy-stm32/src/dcmi.rs +++ b/embassy-stm32/src/dcmi.rs @@ -482,15 +482,6 @@ crate::pac::interrupts! { dma_trait!(FrameDma, Instance); -crate::pac::peripheral_dma_channels! { - ($peri:ident, dcmi, $kind:ident, PSSI, $channel:tt, $request:expr) => { - dma_trait_impl!(FrameDma, $peri, $channel, $request); - }; - ($peri:ident, dcmi, $kind:ident, DCMI, $channel:tt, $request:expr) => { - dma_trait_impl!(FrameDma, $peri, $channel, $request); - }; -} - crate::pac::peripheral_pins!( ($inst:ident, dcmi, DCMI, $pin:ident, D0, $af:expr) => { pin_trait_impl!(D0Pin, $inst, $pin, $af); diff --git a/embassy-stm32/src/i2c/mod.rs b/embassy-stm32/src/i2c/mod.rs index 0980fd9e..ff13d9f1 100644 --- a/embassy-stm32/src/i2c/mod.rs +++ b/embassy-stm32/src/i2c/mod.rs @@ -91,12 +91,3 @@ crate::pac::peripheral_pins!( pin_trait_impl!(SdaPin, $inst, $pin, 0); }; ); - -crate::pac::peripheral_dma_channels! { - ($peri:ident, i2c, $kind:ident, RX, $channel:tt, $request:expr) => { - dma_trait_impl!(RxDma, $peri, $channel, $request); - }; - ($peri:ident, i2c, $kind:ident, TX, $channel:tt, $request:expr) => { - dma_trait_impl!(TxDma, $peri, $channel, $request); - }; -} diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 04f95820..e91241e9 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs @@ -911,12 +911,3 @@ crate::pac::peripheral_pins!( pin_trait_impl!(MisoPin, $inst, $pin, 0); }; ); - -crate::pac::peripheral_dma_channels! { - ($peri:ident, spi, $kind:ident, RX, $channel:tt, $request:expr) => { - dma_trait_impl!(RxDma, $peri, $channel, $request); - }; - ($peri:ident, spi, $kind:ident, TX, $channel:tt, $request:expr) => { - dma_trait_impl!(TxDma, $peri, $channel, $request); - }; -} diff --git a/embassy-stm32/src/traits.rs b/embassy-stm32/src/traits.rs index b2762870..e006e31a 100644 --- a/embassy-stm32/src/traits.rs +++ b/embassy-stm32/src/traits.rs @@ -31,8 +31,8 @@ macro_rules! dma_trait { #[allow(unused)] macro_rules! dma_trait_impl { // DMAMUX - ($signal:ident, $instance:ident, {dmamux: $dmamux:ident}, $request:expr) => { - impl $signal for T + (crate::$mod:ident::$trait:ident, $instance:ident, {dmamux: $dmamux:ident}, $request:expr) => { + impl crate::$mod::$trait for T where T: crate::dma::MuxChannel, { @@ -43,8 +43,8 @@ macro_rules! dma_trait_impl { }; // No DMAMUX - ($signal:ident, $instance:ident, {channel: $channel:ident}, $request:expr) => { - impl $signal for crate::peripherals::$channel { + (crate::$mod:ident::$trait:ident, $instance:ident, {channel: $channel:ident}, $request:expr) => { + impl crate::$mod::$trait for crate::peripherals::$channel { fn request(&self) -> crate::dma::Request { $request } diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index 71855981..52c2cd84 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs @@ -712,18 +712,3 @@ crate::pac::peripheral_pins!( pin_trait_impl!(CkPin, $inst, $pin, 0); }; ); - -crate::pac::peripheral_dma_channels! { - ($peri:ident, usart, $kind:ident, RX, $channel:tt, $request:expr) => { - dma_trait_impl!(RxDma, $peri, $channel, $request); - }; - ($peri:ident, usart, $kind:ident, TX, $channel:tt, $request:expr) => { - dma_trait_impl!(TxDma, $peri, $channel, $request); - }; - ($peri:ident, uart, $kind:ident, RX, $channel:tt, $request:expr) => { - dma_trait_impl!(RxDma, $peri, $channel, $request); - }; - ($peri:ident, uart, $kind:ident, TX, $channel:tt, $request:expr) => { - dma_trait_impl!(TxDma, $peri, $channel, $request); - }; -} From 2c8fee59d6e663a9f6825b6c02cb58090fb160a5 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Wed, 23 Feb 2022 18:56:06 +0100 Subject: [PATCH 2/2] stm32-metapac: remove peripehral_dma_channels! macrotable. --- stm32-metapac-gen/src/lib.rs | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs index 10d67869..d167da49 100644 --- a/stm32-metapac-gen/src/lib.rs +++ b/stm32-metapac-gen/src/lib.rs @@ -127,7 +127,6 @@ pub fn gen_chip( let mut peripherals_table: Vec> = Vec::new(); let mut peripheral_pins_table: Vec> = Vec::new(); let mut dma_channels_table: Vec> = Vec::new(); - let mut peripheral_dma_channels_table: Vec> = Vec::new(); let mut peripheral_counts: BTreeMap = BTreeMap::new(); let mut dma_channel_counts: BTreeMap = BTreeMap::new(); let mut dbgmcu_table: Vec> = Vec::new(); @@ -198,35 +197,6 @@ pub fn gen_chip( interrupt_table.push(row) } - for ch in &p.dma_channels { - let mut row = Vec::new(); - row.push(p.name.clone()); - row.push(bi.kind.clone()); - row.push(bi.block.clone()); - row.push(ch.signal.clone()); - row.push(if let Some(channel) = &ch.channel { - format!("{{channel: {}}}", channel) - } else if let Some(dmamux) = &ch.dmamux { - format!("{{dmamux: {}}}", dmamux) - } else { - unreachable!(); - }); - - row.push(if let Some(request) = ch.request { - request.to_string() - } else { - "()".to_string() - }); - - if peripheral_dma_channels_table - .iter() - .find(|a| a[..a.len() - 1] == row[..row.len() - 1]) - .is_none() - { - peripheral_dma_channels_table.push(row); - } - } - let mut peripheral_row = Vec::new(); peripheral_row.push(bi.kind.clone()); peripheral_row.push(p.name.clone()); @@ -388,11 +358,6 @@ pub fn gen_chip( make_table(&mut data, "peripherals", &peripherals_table); make_table(&mut data, "peripheral_versions", &peripheral_version_table); make_table(&mut data, "peripheral_pins", &peripheral_pins_table); - make_table( - &mut data, - "peripheral_dma_channels", - &peripheral_dma_channels_table, - ); make_table(&mut data, "dma_channels", &dma_channels_table); make_table(&mut data, "dbgmcu", &dbgmcu_table); make_peripheral_counts(&mut data, &peripheral_counts);