aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/build.rs26
-rw-r--r--embassy-stm32/src/rcc/f013.rs12
-rw-r--r--embassy-stm32/src/rcc/mod.rs2
3 files changed, 18 insertions, 22 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index f45a571f2..2ffbadfc3 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -430,7 +430,7 @@ fn main() {
430 430
431 let mut clock_names = BTreeSet::new(); 431 let mut clock_names = BTreeSet::new();
432 432
433 let mut rcc_cfgr_regs = BTreeMap::new(); 433 let mut rcc_cfgr_regs = BTreeSet::new();
434 434
435 for p in METADATA.peripherals { 435 for p in METADATA.peripherals {
436 if !singletons.contains(&p.name.to_string()) { 436 if !singletons.contains(&p.name.to_string()) {
@@ -510,11 +510,7 @@ fn main() {
510 let field_name = format_ident!("{}", field_name); 510 let field_name = format_ident!("{}", field_name);
511 let enum_name = format_ident!("{}", enum_name); 511 let enum_name = format_ident!("{}", enum_name);
512 512
513 if !rcc_cfgr_regs.contains_key(mux.register) { 513 rcc_cfgr_regs.insert((
514 rcc_cfgr_regs.insert(mux.register, Vec::new());
515 }
516
517 rcc_cfgr_regs.get_mut(mux.register).unwrap().push((
518 fieldset_name.clone(), 514 fieldset_name.clone(),
519 field_name.clone(), 515 field_name.clone(),
520 enum_name.clone(), 516 enum_name.clone(),
@@ -602,10 +598,10 @@ fn main() {
602 } 598 }
603 } 599 }
604 600
605 for (rcc_cfgr_reg, fields) in rcc_cfgr_regs { 601 if !rcc_cfgr_regs.is_empty() {
606 println!("cargo:rustc-cfg={}", rcc_cfgr_reg.to_ascii_lowercase()); 602 println!("cargo:rustc-cfg=clock_mux");
607 603
608 let struct_fields: Vec<_> = fields 604 let struct_fields: Vec<_> = rcc_cfgr_regs
609 .iter() 605 .iter()
610 .map(|(_fieldset, fieldname, enum_name)| { 606 .map(|(_fieldset, fieldname, enum_name)| {
611 quote! { 607 quote! {
@@ -614,12 +610,12 @@ fn main() {
614 }) 610 })
615 .collect(); 611 .collect();
616 612
617 let field_names: Vec<_> = fields 613 let field_names: Vec<_> = rcc_cfgr_regs
618 .iter() 614 .iter()
619 .map(|(_fieldset, fieldname, _enum_name)| fieldname) 615 .map(|(_fieldset, fieldname, _enum_name)| fieldname)
620 .collect(); 616 .collect();
621 617
622 let inits: Vec<_> = fields 618 let inits: Vec<_> = rcc_cfgr_regs
623 .iter() 619 .iter()
624 .map(|(fieldset, fieldname, _enum_name)| { 620 .map(|(fieldset, fieldname, _enum_name)| {
625 let setter = format_ident!("set_{}", fieldname); 621 let setter = format_ident!("set_{}", fieldname);
@@ -635,15 +631,13 @@ fn main() {
635 }) 631 })
636 .collect(); 632 .collect();
637 633
638 let cfgr_reg = format_ident!("{}", rcc_cfgr_reg);
639
640 g.extend(quote! { 634 g.extend(quote! {
641 #[derive(Clone, Copy)] 635 #[derive(Clone, Copy)]
642 pub struct #cfgr_reg { 636 pub struct ClockMux {
643 #( #struct_fields, )* 637 #( #struct_fields, )*
644 } 638 }
645 639
646 impl Default for #cfgr_reg { 640 impl Default for ClockMux {
647 fn default() -> Self { 641 fn default() -> Self {
648 Self { 642 Self {
649 #( #field_names: None, )* 643 #( #field_names: None, )*
@@ -651,7 +645,7 @@ fn main() {
651 } 645 }
652 } 646 }
653 647
654 impl #cfgr_reg { 648 impl ClockMux {
655 pub fn init(self) { 649 pub fn init(self) {
656 #( #inits )* 650 #( #inits )*
657 } 651 }
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs
index a61aae0e8..86af4bd68 100644
--- a/embassy-stm32/src/rcc/f013.rs
+++ b/embassy-stm32/src/rcc/f013.rs
@@ -99,8 +99,8 @@ pub struct Config {
99 pub adc34: AdcClockSource, 99 pub adc34: AdcClockSource,
100 #[cfg(stm32f334)] 100 #[cfg(stm32f334)]
101 pub hrtim: HrtimClockSource, 101 pub hrtim: HrtimClockSource,
102 #[cfg(cfgr3)] 102 #[cfg(clock_mux)]
103 pub cfgr3: crate::_generated::CFGR3, 103 pub mux: crate::rcc::ClockMux,
104 104
105 pub ls: super::LsConfig, 105 pub ls: super::LsConfig,
106} 106}
@@ -130,8 +130,8 @@ impl Default for Config {
130 adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1), 130 adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1),
131 #[cfg(stm32f334)] 131 #[cfg(stm32f334)]
132 hrtim: HrtimClockSource::BusClk, 132 hrtim: HrtimClockSource::BusClk,
133 #[cfg(cfgr3)] 133 #[cfg(clock_mux)]
134 cfgr3: Default::default(), 134 mux: Default::default(),
135 } 135 }
136 } 136 }
137} 137}
@@ -367,8 +367,8 @@ pub(crate) unsafe fn init(config: Config) {
367 } 367 }
368 }; 368 };
369 369
370 #[cfg(cfgr3)] 370 #[cfg(clock_mux)]
371 config.cfgr3.init(); 371 config.mux.init();
372 372
373 set_clocks!( 373 set_clocks!(
374 hsi: hsi, 374 hsi: hsi,
diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs
index 0f3467151..f71211925 100644
--- a/embassy-stm32/src/rcc/mod.rs
+++ b/embassy-stm32/src/rcc/mod.rs
@@ -32,6 +32,8 @@ mod _version;
32pub use _version::*; 32pub use _version::*;
33 33
34pub use crate::_generated::Clocks; 34pub use crate::_generated::Clocks;
35#[cfg(clock_mux)]
36pub use crate::_generated::ClockMux;
35 37
36#[cfg(feature = "low-power")] 38#[cfg(feature = "low-power")]
37/// Must be written within a critical section 39/// Must be written within a critical section