aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/build.rs
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-25 07:45:01 -0600
committerxoviat <[email protected]>2025-11-25 07:45:01 -0600
commit3ba8bb866a19a09f25e0b21419a068fd765a9033 (patch)
tree47b46abc32c10767b4c171675c86d758cd60c825 /embassy-stm32/build.rs
parent5ffb3698541674d57fddb22044ac0f06397c6113 (diff)
stm32: allow split irqs for time driver
Diffstat (limited to 'embassy-stm32/build.rs')
-rw-r--r--embassy-stm32/build.rs49
1 files changed, 38 insertions, 11 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index 109571e8f..46d6290e7 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -9,7 +9,7 @@ use proc_macro2::{Ident, TokenStream};
9use quote::{format_ident, quote}; 9use quote::{format_ident, quote};
10use stm32_metapac::metadata::ir::BitOffset; 10use stm32_metapac::metadata::ir::BitOffset;
11use stm32_metapac::metadata::{ 11use stm32_metapac::metadata::{
12 ALL_CHIPS, ALL_PERIPHERAL_VERSIONS, METADATA, MemoryRegion, MemoryRegionKind, PeripheralRccKernelClock, 12 ALL_CHIPS, ALL_PERIPHERAL_VERSIONS, METADATA, MemoryRegion, MemoryRegionKind, Peripheral, PeripheralRccKernelClock,
13 PeripheralRccRegister, PeripheralRegisters, StopMode, 13 PeripheralRccRegister, PeripheralRegisters, StopMode,
14}; 14};
15 15
@@ -133,6 +133,9 @@ fn main() {
133 cfgs.enable("backup_sram") 133 cfgs.enable("backup_sram")
134 } 134 }
135 135
136 // compile a map of peripherals
137 let peripheral_map: BTreeMap<&str, &Peripheral> = METADATA.peripherals.iter().map(|p| (p.name, p)).collect();
138
136 // generate one singleton per peripheral (with many exceptions...) 139 // generate one singleton per peripheral (with many exceptions...)
137 for p in METADATA.peripherals { 140 for p in METADATA.peripherals {
138 if let Some(r) = &p.registers { 141 if let Some(r) = &p.registers {
@@ -319,9 +322,33 @@ fn main() {
319 _ => panic!("unknown time_driver {:?}", time_driver), 322 _ => panic!("unknown time_driver {:?}", time_driver),
320 }; 323 };
321 324
322 if !time_driver_singleton.is_empty() { 325 let time_driver_irq_decl = if !time_driver_singleton.is_empty() {
323 cfgs.enable(format!("time_driver_{}", time_driver_singleton.to_lowercase())); 326 cfgs.enable(format!("time_driver_{}", time_driver_singleton.to_lowercase()));
324 } 327
328 let p = peripheral_map.get(time_driver_singleton).unwrap();
329 let irqs: BTreeSet<_> = p
330 .interrupts
331 .iter()
332 .filter(|i| i.signal == "CC" || i.signal == "UP")
333 .map(|i| i.interrupt.to_ascii_uppercase())
334 .collect();
335
336 irqs.iter()
337 .map(|i| {
338 let irq = format_ident!("{}", i);
339 quote! {
340 #[cfg(feature = "rt")]
341 #[interrupt]
342 fn #irq() {
343 crate::time_driver::get_driver().on_interrupt();
344 }
345 }
346 })
347 .collect()
348 } else {
349 TokenStream::new()
350 };
351
325 for tim in [ 352 for tim in [
326 "tim1", "tim2", "tim3", "tim4", "tim5", "tim8", "tim9", "tim12", "tim15", "tim20", "tim21", "tim22", "tim23", 353 "tim1", "tim2", "tim3", "tim4", "tim5", "tim8", "tim9", "tim12", "tim15", "tim20", "tim21", "tim22", "tim23",
327 "tim24", 354 "tim24",
@@ -371,6 +398,8 @@ fn main() {
371 ); 398 );
372 }); 399 });
373 400
401 g.extend(time_driver_irq_decl);
402
374 // ======== 403 // ========
375 // Generate FLASH regions 404 // Generate FLASH regions
376 cfgs.declare("flash"); 405 cfgs.declare("flash");
@@ -1862,7 +1891,7 @@ fn main() {
1862 flash_regions_table.push(row); 1891 flash_regions_table.push(row);
1863 } 1892 }
1864 1893
1865 let gpio_base = METADATA.peripherals.iter().find(|p| p.name == "GPIOA").unwrap().address as u32; 1894 let gpio_base = peripheral_map.get("GPIOA").unwrap().address as u32;
1866 let gpio_stride = 0x400; 1895 let gpio_stride = 0x400;
1867 1896
1868 for pin in METADATA.pins { 1897 for pin in METADATA.pins {
@@ -1980,11 +2009,11 @@ fn main() {
1980 continue; 2009 continue;
1981 } 2010 }
1982 2011
1983 let stop_mode = METADATA 2012 let dma_peri = peripheral_map.get(ch.dma).unwrap();
1984 .peripherals 2013 let stop_mode = dma_peri
1985 .iter() 2014 .rcc
1986 .find(|p| p.name == ch.dma) 2015 .as_ref()
1987 .map(|p| p.rcc.as_ref().map(|rcc| rcc.stop_mode.clone()).unwrap_or_default()) 2016 .map(|rcc| rcc.stop_mode.clone())
1988 .unwrap_or_default(); 2017 .unwrap_or_default();
1989 2018
1990 let stop_mode = match stop_mode { 2019 let stop_mode = match stop_mode {
@@ -2009,8 +2038,6 @@ fn main() {
2009 2038
2010 let dma = format_ident!("{}", ch.dma); 2039 let dma = format_ident!("{}", ch.dma);
2011 let ch_num = ch.channel as usize; 2040 let ch_num = ch.channel as usize;
2012
2013 let dma_peri = METADATA.peripherals.iter().find(|p| p.name == ch.dma).unwrap();
2014 let bi = dma_peri.registers.as_ref().unwrap(); 2041 let bi = dma_peri.registers.as_ref().unwrap();
2015 2042
2016 let dma_info = match bi.kind { 2043 let dma_info = match bi.kind {