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 /embassy-stm32/build.rs | |
| parent | c6371d7a9b828297eae43e61440f4cc0af7a3979 (diff) | |
Add feature, disable flash for N6 family
Diffstat (limited to 'embassy-stm32/build.rs')
| -rw-r--r-- | embassy-stm32/build.rs | 226 |
1 files changed, 120 insertions, 106 deletions
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 |
