diff options
| author | everdrone <[email protected]> | 2025-09-20 12:39:15 +0200 |
|---|---|---|
| committer | everdrone <[email protected]> | 2025-09-20 12:39:15 +0200 |
| commit | c4b0e3a2bfc2c4b60f70f862a893b90b91954baa (patch) | |
| tree | 1881fea51ca1ed1c792d3ed0a9f66df2c870bf63 | |
| parent | c6371d7a9b828297eae43e61440f4cc0af7a3979 (diff) | |
Add feature, disable flash for N6 family
| -rw-r--r-- | embassy-stm32/Cargo.toml | 10 | ||||
| -rw-r--r-- | embassy-stm32/build.rs | 226 | ||||
| -rw-r--r-- | 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 = [ | |||
| 95 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "low-power", "stm32wba65ri", "time", "time-driver-any"]}, | 95 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "low-power", "stm32wba65ri", "time", "time-driver-any"]}, |
| 96 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5f9zj", "time", "time-driver-any"]}, | 96 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5f9zj", "time", "time-driver-any"]}, |
| 97 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5g9nj", "time", "time-driver-any"]}, | 97 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5g9nj", "time", "time-driver-any"]}, |
| 98 | {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32n657x0", "time", "time-driver-any"]}, | ||
| 98 | {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "stm32wb35ce", "time", "time-driver-any"]}, | 99 | {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "stm32wb35ce", "time", "time-driver-any"]}, |
| 99 | {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "low-power", "stm32wb55rg", "time", "time-driver-any"]}, | 100 | {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "low-power", "stm32wb55rg", "time", "time-driver-any"]}, |
| 100 | {target = "thumbv6m-none-eabi", features = ["defmt", "exti", "stm32u031r8", "time", "time-driver-any"]}, | 101 | {target = "thumbv6m-none-eabi", features = ["defmt", "exti", "stm32u031r8", "time", "time-driver-any"]}, |
| @@ -173,8 +174,8 @@ cortex-m = "0.7.6" | |||
| 173 | futures-util = { version = "0.3.30", default-features = false } | 174 | futures-util = { version = "0.3.30", default-features = false } |
| 174 | sdio-host = "0.9.0" | 175 | sdio-host = "0.9.0" |
| 175 | critical-section = "1.1" | 176 | critical-section = "1.1" |
| 176 | #stm32-metapac = { version = "18" } | 177 | stm32-metapac = { path = "../../stm32-data/build/stm32-metapac" } |
| 177 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" } | 178 | # stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" } |
| 178 | 179 | ||
| 179 | vcell = "0.1.3" | 180 | vcell = "0.1.3" |
| 180 | nb = "1.0.0" | 181 | nb = "1.0.0" |
| @@ -203,8 +204,8 @@ proptest-state-machine = "0.3.0" | |||
| 203 | proc-macro2 = "1.0.36" | 204 | proc-macro2 = "1.0.36" |
| 204 | quote = "1.0.15" | 205 | quote = "1.0.15" |
| 205 | 206 | ||
| 206 | #stm32-metapac = { version = "18", default-features = false, features = ["metadata"]} | 207 | stm32-metapac = { path = "../../stm32-data/build/stm32-metapac", default-features = false, features = ["metadata"]} |
| 207 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] } | 208 | # stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] } |
| 208 | 209 | ||
| 209 | [features] | 210 | [features] |
| 210 | default = ["rt"] | 211 | default = ["rt"] |
| @@ -1629,6 +1630,7 @@ stm32l562qe = [ "stm32-metapac/stm32l562qe" ] | |||
| 1629 | stm32l562re = [ "stm32-metapac/stm32l562re" ] | 1630 | stm32l562re = [ "stm32-metapac/stm32l562re" ] |
| 1630 | stm32l562ve = [ "stm32-metapac/stm32l562ve" ] | 1631 | stm32l562ve = [ "stm32-metapac/stm32l562ve" ] |
| 1631 | stm32l562ze = [ "stm32-metapac/stm32l562ze" ] | 1632 | stm32l562ze = [ "stm32-metapac/stm32l562ze" ] |
| 1633 | stm32n657x0 = [ "stm32-metapac/stm32n657x0" ] | ||
| 1632 | stm32u031c6 = [ "stm32-metapac/stm32u031c6" ] | 1634 | stm32u031c6 = [ "stm32-metapac/stm32u031c6" ] |
| 1633 | stm32u031c8 = [ "stm32-metapac/stm32u031c8" ] | 1635 | stm32u031c8 = [ "stm32-metapac/stm32u031c8" ] |
| 1634 | stm32u031f4 = [ "stm32-metapac/stm32u031f4" ] | 1636 | 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() { | |||
| 352 | 352 | ||
| 353 | // ======== | 353 | // ======== |
| 354 | // Generate FLASH regions | 354 | // Generate FLASH regions |
| 355 | let mut flash_regions = TokenStream::new(); | 355 | cfgs.declare("flash"); |
| 356 | let flash_memory_regions: Vec<_> = memory | 356 | let mut has_flash = false; |
| 357 | .iter() | 357 | if !chip_name.starts_with("stm32n6") { |
| 358 | .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some()) | 358 | cfgs.enable("flash"); |
| 359 | .collect(); | 359 | has_flash = true; |
| 360 | for region in flash_memory_regions.iter() { | 360 | |
| 361 | let region_name = format_ident!("{}", get_flash_region_name(region.name)); | 361 | let mut flash_regions = TokenStream::new(); |
| 362 | let bank_variant = format_ident!( | 362 | let flash_memory_regions: Vec<_> = memory |
| 363 | "{}", | 363 | .iter() |
| 364 | if region.name.starts_with("BANK_1") { | 364 | .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some()) |
| 365 | "Bank1" | 365 | .collect(); |
| 366 | } else if region.name.starts_with("BANK_2") { | 366 | for region in flash_memory_regions.iter() { |
| 367 | "Bank2" | 367 | let region_name = format_ident!("{}", get_flash_region_name(region.name)); |
| 368 | } else if region.name == "OTP" { | 368 | let bank_variant = format_ident!( |
| 369 | "Otp" | 369 | "{}", |
| 370 | } else { | 370 | if region.name.starts_with("BANK_1") { |
| 371 | continue; | 371 | "Bank1" |
| 372 | } | 372 | } else if region.name.starts_with("BANK_2") { |
| 373 | ); | 373 | "Bank2" |
| 374 | let base = region.address; | 374 | } else if region.name == "OTP" { |
| 375 | let size = region.size; | 375 | "Otp" |
| 376 | let settings = region.settings.as_ref().unwrap(); | 376 | } else { |
| 377 | let erase_size = settings.erase_size; | 377 | continue; |
| 378 | let write_size = settings.write_size; | 378 | } |
| 379 | let erase_value = settings.erase_value; | 379 | ); |
| 380 | 380 | let base = region.address; | |
| 381 | flash_regions.extend(quote! { | 381 | let size = region.size; |
| 382 | pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion { | 382 | let settings = region.settings.as_ref().unwrap(); |
| 383 | bank: crate::flash::FlashBank::#bank_variant, | 383 | let erase_size = settings.erase_size; |
| 384 | base: #base, | 384 | let write_size = settings.write_size; |
| 385 | size: #size, | 385 | let erase_value = settings.erase_value; |
| 386 | erase_size: #erase_size, | 386 | |
| 387 | write_size: #write_size, | 387 | flash_regions.extend(quote! { |
| 388 | erase_value: #erase_value, | 388 | pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion { |
| 389 | _ensure_internal: (), | 389 | bank: crate::flash::FlashBank::#bank_variant, |
| 390 | }; | 390 | base: #base, |
| 391 | }); | 391 | size: #size, |
| 392 | erase_size: #erase_size, | ||
| 393 | write_size: #write_size, | ||
| 394 | erase_value: #erase_value, | ||
| 395 | _ensure_internal: (), | ||
| 396 | }; | ||
| 397 | }); | ||
| 392 | 398 | ||
| 393 | let region_type = format_ident!("{}", get_flash_region_type_name(region.name)); | 399 | let region_type = format_ident!("{}", get_flash_region_type_name(region.name)); |
| 394 | flash_regions.extend(quote! { | 400 | flash_regions.extend(quote! { |
| 395 | #[cfg(flash)] | 401 | #[cfg(flash)] |
| 396 | 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<MODE>); | 402 | 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<MODE>); |
| 397 | }); | 403 | }); |
| 398 | } | 404 | } |
| 399 | 405 | ||
| 400 | let (fields, (inits, region_names)): (Vec<TokenStream>, (Vec<TokenStream>, Vec<Ident>)) = flash_memory_regions | 406 | let (fields, (inits, region_names)): (Vec<TokenStream>, (Vec<TokenStream>, Vec<Ident>)) = flash_memory_regions |
| 401 | .iter() | 407 | .iter() |
| 402 | .map(|f| { | 408 | .map(|f| { |
| 403 | let region_name = get_flash_region_name(f.name); | 409 | let region_name = get_flash_region_name(f.name); |
| 404 | let field_name = format_ident!("{}", region_name.to_lowercase()); | 410 | let field_name = format_ident!("{}", region_name.to_lowercase()); |
| 405 | let field_type = format_ident!("{}", get_flash_region_type_name(f.name)); | 411 | let field_type = format_ident!("{}", get_flash_region_type_name(f.name)); |
| 406 | let field = quote! { | 412 | let field = quote! { |
| 407 | pub #field_name: #field_type<'d, MODE> | 413 | pub #field_name: #field_type<'d, MODE> |
| 408 | }; | 414 | }; |
| 409 | let region_name = format_ident!("{}", region_name); | 415 | let region_name = format_ident!("{}", region_name); |
| 410 | let init = quote! { | 416 | let init = quote! { |
| 411 | #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData) | 417 | #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData) |
| 412 | }; | 418 | }; |
| 413 | 419 | ||
| 414 | (field, (init, region_name)) | 420 | (field, (init, region_name)) |
| 415 | }) | 421 | }) |
| 416 | .unzip(); | 422 | .unzip(); |
| 417 | |||
| 418 | let regions_len = flash_memory_regions.len(); | ||
| 419 | flash_regions.extend(quote! { | ||
| 420 | #[cfg(flash)] | ||
| 421 | pub struct FlashLayout<'d, MODE = crate::flash::Async> { | ||
| 422 | #(#fields),*, | ||
| 423 | _mode: core::marker::PhantomData<MODE>, | ||
| 424 | } | ||
| 425 | 423 | ||
| 426 | #[cfg(flash)] | 424 | let regions_len = flash_memory_regions.len(); |
| 427 | impl<'d, MODE> FlashLayout<'d, MODE> { | 425 | flash_regions.extend(quote! { |
| 428 | pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self { | 426 | #[cfg(flash)] |
| 429 | Self { | 427 | pub struct FlashLayout<'d, MODE = crate::flash::Async> { |
| 430 | #(#inits),*, | 428 | #(#fields),*, |
| 431 | _mode: core::marker::PhantomData, | 429 | _mode: core::marker::PhantomData<MODE>, |
| 430 | } | ||
| 431 | |||
| 432 | #[cfg(flash)] | ||
| 433 | impl<'d, MODE> FlashLayout<'d, MODE> { | ||
| 434 | pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self { | ||
| 435 | Self { | ||
| 436 | #(#inits),*, | ||
| 437 | _mode: core::marker::PhantomData, | ||
| 438 | } | ||
| 432 | } | 439 | } |
| 433 | } | 440 | } |
| 434 | } | ||
| 435 | 441 | ||
| 436 | pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [ | 442 | pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [ |
| 437 | #(&#region_names),* | 443 | #(&#region_names),* |
| 438 | ]; | 444 | ]; |
| 439 | }); | 445 | }); |
| 440 | 446 | ||
| 441 | let max_erase_size = flash_memory_regions | 447 | let max_erase_size = flash_memory_regions |
| 442 | .iter() | 448 | .iter() |
| 443 | .map(|region| region.settings.as_ref().unwrap().erase_size) | 449 | .map(|region| region.settings.as_ref().unwrap().erase_size) |
| 444 | .max() | 450 | .max() |
| 445 | .unwrap(); | 451 | .unwrap(); |
| 446 | 452 | ||
| 447 | g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); | 453 | g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); |
| 448 | 454 | ||
| 449 | g.extend(quote! { pub mod flash_regions { #flash_regions } }); | 455 | g.extend(quote! { pub mod flash_regions { #flash_regions } }); |
| 456 | } | ||
| 450 | 457 | ||
| 451 | // ======== | 458 | // ======== |
| 452 | // Extract the rcc registers | 459 | // Extract the rcc registers |
| @@ -1844,7 +1851,12 @@ fn main() { | |||
| 1844 | if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" { | 1851 | if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" { |
| 1845 | for irq in p.interrupts { | 1852 | for irq in p.interrupts { |
| 1846 | let ch_name = format!("{}_{}", p.name, irq.signal); | 1853 | let ch_name = format!("{}_{}", p.name, irq.signal); |
| 1847 | let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name).unwrap(); | 1854 | let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name); |
| 1855 | |||
| 1856 | if ch.is_none() { | ||
| 1857 | continue; | ||
| 1858 | } | ||
| 1859 | let ch = ch.unwrap(); | ||
| 1848 | 1860 | ||
| 1849 | // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it. | 1861 | // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it. |
| 1850 | if has_dmamux && ch.dmamux.is_none() { | 1862 | if has_dmamux && ch.dmamux.is_none() { |
| @@ -1985,31 +1997,33 @@ fn main() { | |||
| 1985 | // ======== | 1997 | // ======== |
| 1986 | // Generate flash constants | 1998 | // Generate flash constants |
| 1987 | 1999 | ||
| 1988 | let flash_regions: Vec<&MemoryRegion> = memory | 2000 | if has_flash { |
| 1989 | .iter() | 2001 | let flash_regions: Vec<&MemoryRegion> = memory |
| 1990 | .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_")) | 2002 | .iter() |
| 1991 | .collect(); | 2003 | .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_")) |
| 1992 | let first_flash = flash_regions.first().unwrap(); | 2004 | .collect(); |
| 1993 | let total_flash_size = flash_regions | 2005 | let first_flash = flash_regions.first().unwrap(); |
| 1994 | .iter() | 2006 | let total_flash_size = flash_regions |
| 1995 | .map(|x| x.size) | 2007 | .iter() |
| 1996 | .reduce(|acc, item| acc + item) | 2008 | .map(|x| x.size) |
| 1997 | .unwrap(); | 2009 | .reduce(|acc, item| acc + item) |
| 1998 | let write_sizes: HashSet<_> = flash_regions | 2010 | .unwrap(); |
| 1999 | .iter() | 2011 | let write_sizes: HashSet<_> = flash_regions |
| 2000 | .map(|r| r.settings.as_ref().unwrap().write_size) | 2012 | .iter() |
| 2001 | .collect(); | 2013 | .map(|r| r.settings.as_ref().unwrap().write_size) |
| 2002 | assert_eq!(1, write_sizes.len()); | 2014 | .collect(); |
| 2015 | assert_eq!(1, write_sizes.len()); | ||
| 2003 | 2016 | ||
| 2004 | let flash_base = first_flash.address as usize; | 2017 | let flash_base = first_flash.address as usize; |
| 2005 | let total_flash_size = total_flash_size as usize; | 2018 | let total_flash_size = total_flash_size as usize; |
| 2006 | let write_size = (*write_sizes.iter().next().unwrap()) as usize; | 2019 | let write_size = (*write_sizes.iter().next().unwrap()) as usize; |
| 2007 | 2020 | ||
| 2008 | g.extend(quote!( | 2021 | g.extend(quote!( |
| 2009 | pub const FLASH_BASE: usize = #flash_base; | 2022 | pub const FLASH_BASE: usize = #flash_base; |
| 2010 | pub const FLASH_SIZE: usize = #total_flash_size; | 2023 | pub const FLASH_SIZE: usize = #total_flash_size; |
| 2011 | pub const WRITE_SIZE: usize = #write_size; | 2024 | pub const WRITE_SIZE: usize = #write_size; |
| 2012 | )); | 2025 | )); |
| 2026 | } | ||
| 2013 | 2027 | ||
| 2014 | // ======== | 2028 | // ======== |
| 2015 | // Generate EEPROM constants | 2029 | // 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; | |||
| 74 | pub mod eth; | 74 | pub mod eth; |
| 75 | #[cfg(feature = "exti")] | 75 | #[cfg(feature = "exti")] |
| 76 | pub mod exti; | 76 | pub mod exti; |
| 77 | #[cfg(flash)] | ||
| 77 | pub mod flash; | 78 | pub mod flash; |
| 78 | #[cfg(fmc)] | 79 | #[cfg(fmc)] |
| 79 | pub mod fmc; | 80 | pub mod fmc; |
