From c4b0e3a2bfc2c4b60f70f862a893b90b91954baa Mon Sep 17 00:00:00 2001 From: everdrone Date: Sat, 20 Sep 2025 12:39:15 +0200 Subject: Add feature, disable flash for N6 family --- embassy-stm32/Cargo.toml | 10 ++- embassy-stm32/build.rs | 226 +++++++++++++++++++++++++---------------------- embassy-stm32/src/lib.rs | 1 + 3 files changed, 127 insertions(+), 110 deletions(-) diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index 6cd8ed262..fb4bc70b7 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml @@ -95,6 +95,7 @@ build = [ {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "low-power", "stm32wba65ri", "time", "time-driver-any"]}, {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5f9zj", "time", "time-driver-any"]}, {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5g9nj", "time", "time-driver-any"]}, + {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32n657x0", "time", "time-driver-any"]}, {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "stm32wb35ce", "time", "time-driver-any"]}, {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "low-power", "stm32wb55rg", "time", "time-driver-any"]}, {target = "thumbv6m-none-eabi", features = ["defmt", "exti", "stm32u031r8", "time", "time-driver-any"]}, @@ -173,8 +174,8 @@ cortex-m = "0.7.6" futures-util = { version = "0.3.30", default-features = false } sdio-host = "0.9.0" critical-section = "1.1" -#stm32-metapac = { version = "18" } -stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" } +stm32-metapac = { path = "../../stm32-data/build/stm32-metapac" } +# stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" } vcell = "0.1.3" nb = "1.0.0" @@ -203,8 +204,8 @@ proptest-state-machine = "0.3.0" proc-macro2 = "1.0.36" quote = "1.0.15" -#stm32-metapac = { version = "18", default-features = false, features = ["metadata"]} -stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] } +stm32-metapac = { path = "../../stm32-data/build/stm32-metapac", default-features = false, features = ["metadata"]} +# stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] } [features] default = ["rt"] @@ -1629,6 +1630,7 @@ stm32l562qe = [ "stm32-metapac/stm32l562qe" ] stm32l562re = [ "stm32-metapac/stm32l562re" ] stm32l562ve = [ "stm32-metapac/stm32l562ve" ] stm32l562ze = [ "stm32-metapac/stm32l562ze" ] +stm32n657x0 = [ "stm32-metapac/stm32n657x0" ] stm32u031c6 = [ "stm32-metapac/stm32u031c6" ] stm32u031c8 = [ "stm32-metapac/stm32u031c8" ] stm32u031f4 = [ "stm32-metapac/stm32u031f4" ] diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index b5f1261fe..861f3fcee 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -352,101 +352,108 @@ fn main() { // ======== // Generate FLASH regions - let mut flash_regions = TokenStream::new(); - let flash_memory_regions: Vec<_> = memory - .iter() - .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some()) - .collect(); - for region in flash_memory_regions.iter() { - let region_name = format_ident!("{}", get_flash_region_name(region.name)); - let bank_variant = format_ident!( - "{}", - if region.name.starts_with("BANK_1") { - "Bank1" - } else if region.name.starts_with("BANK_2") { - "Bank2" - } else if region.name == "OTP" { - "Otp" - } else { - continue; - } - ); - let base = region.address; - let size = region.size; - let settings = region.settings.as_ref().unwrap(); - let erase_size = settings.erase_size; - let write_size = settings.write_size; - let erase_value = settings.erase_value; - - flash_regions.extend(quote! { - pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion { - bank: crate::flash::FlashBank::#bank_variant, - base: #base, - size: #size, - erase_size: #erase_size, - write_size: #write_size, - erase_value: #erase_value, - _ensure_internal: (), - }; - }); + cfgs.declare("flash"); + let mut has_flash = false; + if !chip_name.starts_with("stm32n6") { + cfgs.enable("flash"); + has_flash = true; + + let mut flash_regions = TokenStream::new(); + let flash_memory_regions: Vec<_> = memory + .iter() + .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some()) + .collect(); + for region in flash_memory_regions.iter() { + let region_name = format_ident!("{}", get_flash_region_name(region.name)); + let bank_variant = format_ident!( + "{}", + if region.name.starts_with("BANK_1") { + "Bank1" + } else if region.name.starts_with("BANK_2") { + "Bank2" + } else if region.name == "OTP" { + "Otp" + } else { + continue; + } + ); + let base = region.address; + let size = region.size; + let settings = region.settings.as_ref().unwrap(); + let erase_size = settings.erase_size; + let write_size = settings.write_size; + let erase_value = settings.erase_value; + + flash_regions.extend(quote! { + pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion { + bank: crate::flash::FlashBank::#bank_variant, + base: #base, + size: #size, + erase_size: #erase_size, + write_size: #write_size, + erase_value: #erase_value, + _ensure_internal: (), + }; + }); - let region_type = format_ident!("{}", get_flash_region_type_name(region.name)); - flash_regions.extend(quote! { + let region_type = format_ident!("{}", get_flash_region_type_name(region.name)); + flash_regions.extend(quote! { #[cfg(flash)] pub struct #region_type<'d, MODE = crate::flash::Async>(pub &'static crate::flash::FlashRegion, pub(crate) embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>, pub(crate) core::marker::PhantomData); }); - } + } - let (fields, (inits, region_names)): (Vec, (Vec, Vec)) = flash_memory_regions - .iter() - .map(|f| { - let region_name = get_flash_region_name(f.name); - let field_name = format_ident!("{}", region_name.to_lowercase()); - let field_type = format_ident!("{}", get_flash_region_type_name(f.name)); - let field = quote! { - pub #field_name: #field_type<'d, MODE> - }; - let region_name = format_ident!("{}", region_name); - let init = quote! { - #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData) - }; + let (fields, (inits, region_names)): (Vec, (Vec, Vec)) = flash_memory_regions + .iter() + .map(|f| { + let region_name = get_flash_region_name(f.name); + let field_name = format_ident!("{}", region_name.to_lowercase()); + let field_type = format_ident!("{}", get_flash_region_type_name(f.name)); + let field = quote! { + pub #field_name: #field_type<'d, MODE> + }; + let region_name = format_ident!("{}", region_name); + let init = quote! { + #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData) + }; - (field, (init, region_name)) - }) - .unzip(); - - let regions_len = flash_memory_regions.len(); - flash_regions.extend(quote! { - #[cfg(flash)] - pub struct FlashLayout<'d, MODE = crate::flash::Async> { - #(#fields),*, - _mode: core::marker::PhantomData, - } + (field, (init, region_name)) + }) + .unzip(); - #[cfg(flash)] - impl<'d, MODE> FlashLayout<'d, MODE> { - pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self { - Self { - #(#inits),*, - _mode: core::marker::PhantomData, + let regions_len = flash_memory_regions.len(); + flash_regions.extend(quote! { + #[cfg(flash)] + pub struct FlashLayout<'d, MODE = crate::flash::Async> { + #(#fields),*, + _mode: core::marker::PhantomData, + } + + #[cfg(flash)] + impl<'d, MODE> FlashLayout<'d, MODE> { + pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self { + Self { + #(#inits),*, + _mode: core::marker::PhantomData, + } } } - } - pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [ - #(&#region_names),* - ]; - }); + pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [ + #(&#region_names),* + ]; + }); - let max_erase_size = flash_memory_regions - .iter() - .map(|region| region.settings.as_ref().unwrap().erase_size) - .max() - .unwrap(); + let max_erase_size = flash_memory_regions + .iter() + .map(|region| region.settings.as_ref().unwrap().erase_size) + .max() + .unwrap(); - g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); + g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); - g.extend(quote! { pub mod flash_regions { #flash_regions } }); + g.extend(quote! { pub mod flash_regions { #flash_regions } }); + } // ======== // Extract the rcc registers @@ -1844,7 +1851,12 @@ fn main() { if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" { for irq in p.interrupts { let ch_name = format!("{}_{}", p.name, irq.signal); - let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name).unwrap(); + let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name); + + if ch.is_none() { + continue; + } + let ch = ch.unwrap(); // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it. if has_dmamux && ch.dmamux.is_none() { @@ -1985,31 +1997,33 @@ fn main() { // ======== // Generate flash constants - let flash_regions: Vec<&MemoryRegion> = memory - .iter() - .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_")) - .collect(); - let first_flash = flash_regions.first().unwrap(); - let total_flash_size = flash_regions - .iter() - .map(|x| x.size) - .reduce(|acc, item| acc + item) - .unwrap(); - let write_sizes: HashSet<_> = flash_regions - .iter() - .map(|r| r.settings.as_ref().unwrap().write_size) - .collect(); - assert_eq!(1, write_sizes.len()); + if has_flash { + let flash_regions: Vec<&MemoryRegion> = memory + .iter() + .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_")) + .collect(); + let first_flash = flash_regions.first().unwrap(); + let total_flash_size = flash_regions + .iter() + .map(|x| x.size) + .reduce(|acc, item| acc + item) + .unwrap(); + let write_sizes: HashSet<_> = flash_regions + .iter() + .map(|r| r.settings.as_ref().unwrap().write_size) + .collect(); + assert_eq!(1, write_sizes.len()); - let flash_base = first_flash.address as usize; - let total_flash_size = total_flash_size as usize; - let write_size = (*write_sizes.iter().next().unwrap()) as usize; + let flash_base = first_flash.address as usize; + let total_flash_size = total_flash_size as usize; + let write_size = (*write_sizes.iter().next().unwrap()) as usize; - g.extend(quote!( - pub const FLASH_BASE: usize = #flash_base; - pub const FLASH_SIZE: usize = #total_flash_size; - pub const WRITE_SIZE: usize = #write_size; - )); + g.extend(quote!( + pub const FLASH_BASE: usize = #flash_base; + pub const FLASH_SIZE: usize = #total_flash_size; + pub const WRITE_SIZE: usize = #write_size; + )); + } // ======== // Generate EEPROM constants diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 7e0f7884e..292586ee4 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -74,6 +74,7 @@ pub mod dts; pub mod eth; #[cfg(feature = "exti")] pub mod exti; +#[cfg(flash)] pub mod flash; #[cfg(fmc)] pub mod fmc; -- cgit