diff --git a/embassy-stm32/src/can/bxcan.rs b/embassy-stm32/src/can/bxcan.rs index cc057b09..3c8c2730 100644 --- a/embassy-stm32/src/can/bxcan.rs +++ b/embassy-stm32/src/can/bxcan.rs @@ -103,7 +103,7 @@ crate::pac::peripherals!( crate::pac::peripherals!( (can, CAN) => { - unsafe impl bxcan::FilterOwner for peripherals::$inst { + unsafe impl bxcan::FilterOwner for peripherals::CAN { const NUM_FILTER_BANKS: u8 = 14; } }; @@ -144,4 +144,10 @@ crate::pac::peripheral_pins!( ($inst:ident, can, CAN, $pin:ident, RX, $af:expr) => { impl_pin!($inst, $pin, RxPin, $af); }; + ($inst:ident, can, CAN, $pin:ident, TX) => { + impl_pin!($inst, $pin, TxPin, 0); + }; + ($inst:ident, can, CAN, $pin:ident, RX) => { + impl_pin!($inst, $pin, RxPin, 0); + }; ); diff --git a/embassy-stm32/src/dma/dmamux.rs b/embassy-stm32/src/dma/dmamux.rs index 14218d56..83dcff4e 100644 --- a/embassy-stm32/src/dma/dmamux.rs +++ b/embassy-stm32/src/dma/dmamux.rs @@ -49,16 +49,11 @@ pac::dma_channels! { /// safety: must be called only once pub(crate) unsafe fn init() { - pac::peripherals! { - (dmamux, $peri:ident) => { - { - pac::peripheral_rcc! { - ($peri, $clock:ident, $en_reg:ident, $rst_reg:ident, $en_fn:ident, $rst_fn:ident) => { - use crate::rcc::sealed::RccPeripheral; - crate::peripherals::$peri::enable() - }; - } - } + crate::pac::peripheral_rcc! { + ($name:ident, dmamux, DMAMUX, $clock:ident, ($reg:ident, $field:ident, $set_field:ident), $rst:tt) => { + crate::pac::RCC.$reg().modify(|reg| { + reg.$set_field(true); + }); }; } } diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index 246cdb04..49a10984 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs @@ -601,14 +601,10 @@ crate::pac::pins!( ); pub(crate) unsafe fn init() { - crate::pac::gpio_rcc! { - ($en_reg:ident) => { - crate::pac::RCC.$en_reg().modify(|reg| { - crate::pac::gpio_rcc! { - ($name:ident, $clock:ident, $en_reg, $rst_reg:ident, $en_fn:ident, $rst_fn:ident) => { - reg.$en_fn(true); - }; - } + crate::pac::peripheral_rcc! { + ($name:ident, gpio, GPIO, $clock:ident, ($reg:ident, $field:ident, $set_field:ident), $rst:tt) => { + crate::pac::RCC.$reg().modify(|reg| { + reg.$set_field(true); }); }; } diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs index b926eb8c..9883543d 100644 --- a/embassy-stm32/src/rcc/mod.rs +++ b/embassy-stm32/src/rcc/mod.rs @@ -120,35 +120,33 @@ pub(crate) mod sealed { pub trait RccPeripheral: sealed::RccPeripheral + 'static {} crate::pac::peripheral_rcc!( - ($inst:ident, $clk:ident, $enable:ident, $reset:ident, $perien:ident, $perirst:ident) => { + ($inst:ident, gpio, GPIO, $clk:ident, $en:tt, $rst:tt) => {}; + ($inst:ident, $module:ident, $block:ident, $clk:ident, ($en_reg:ident, $en_field:ident, $en_set_field:ident), ($rst_reg:ident, $rst_field:ident, $rst_set_field:ident)) => { impl sealed::RccPeripheral for peripherals::$inst { fn frequency() -> crate::time::Hertz { critical_section::with(|_| { - unsafe { - let freqs = get_freqs(); - freqs.$clk - } + unsafe { get_freqs().$clk } }) } fn enable() { critical_section::with(|_| { unsafe { - crate::pac::RCC.$enable().modify(|w| w.$perien(true)); + crate::pac::RCC.$en_reg().modify(|w| w.$en_set_field(true)); } }) } fn disable() { critical_section::with(|_| { unsafe { - crate::pac::RCC.$enable().modify(|w| w.$perien(false)); + crate::pac::RCC.$en_reg().modify(|w| w.$en_set_field(false)); } }) } fn reset() { critical_section::with(|_| { unsafe { - crate::pac::RCC.$reset().modify(|w| w.$perirst(true)); - crate::pac::RCC.$reset().modify(|w| w.$perirst(false)); + crate::pac::RCC.$rst_reg().modify(|w| w.$rst_set_field(true)); + crate::pac::RCC.$rst_reg().modify(|w| w.$rst_set_field(false)); } }) } @@ -156,27 +154,24 @@ crate::pac::peripheral_rcc!( impl RccPeripheral for peripherals::$inst {} }; - ($inst:ident, $clk:ident, $enable:ident, $perien:ident) => { + ($inst:ident, $module:ident, $block:ident, $clk:ident, ($en_reg:ident, $en_field:ident, $en_set_field:ident), _) => { impl sealed::RccPeripheral for peripherals::$inst { fn frequency() -> crate::time::Hertz { critical_section::with(|_| { - unsafe { - let freqs = get_freqs(); - freqs.$clk - } + unsafe { get_freqs().$clk } }) } fn enable() { critical_section::with(|_| { unsafe { - crate::pac::RCC.$enable().modify(|w| w.$perien(true)); + crate::pac::RCC.$en_reg().modify(|w| w.$en_set_field(true)); } }) } fn disable() { critical_section::with(|_| { unsafe { - crate::pac::RCC.$enable().modify(|w| w.$perien(false)); + crate::pac::RCC.$en_reg().modify(|w| w.$en_set_field(false)); } }) } diff --git a/examples/stm32f1/Cargo.toml b/examples/stm32f1/Cargo.toml index 37def50a..84773b91 100644 --- a/examples/stm32f1/Cargo.toml +++ b/examples/stm32f1/Cargo.toml @@ -9,7 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32f103c8", "unstable-pac", "memory-x", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32f4/Cargo.toml b/examples/stm32f4/Cargo.toml index 48c3148c..807dfef1 100644 --- a/examples/stm32f4/Cargo.toml +++ b/examples/stm32f4/Cargo.toml @@ -10,7 +10,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32f429zi", "unstable-pac", "memory-x", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32f7/Cargo.toml b/examples/stm32f7/Cargo.toml index 2d3cd0b7..68c73f09 100644 --- a/examples/stm32f7/Cargo.toml +++ b/examples/stm32f7/Cargo.toml @@ -9,9 +9,7 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "net", "stm32f767zi", "unstable-pac", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } embassy-net = { path = "../../embassy-net", default-features = false, features = ["defmt", "tcp", "medium-ethernet", "pool-16"] } -embassy-macros = { path = "../../embassy-macros" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs index afb86086..521b031e 100644 --- a/examples/stm32f7/src/bin/eth.rs +++ b/examples/stm32f7/src/bin/eth.rs @@ -13,7 +13,6 @@ use embassy::executor::{Executor, Spawner}; use embassy::io::AsyncWriteExt; use embassy::time::{Duration, Timer}; use embassy::util::Forever; -use embassy_macros::interrupt_take; use embassy_net::{ Config as NetConfig, Ipv4Address, Ipv4Cidr, StackResources, StaticConfigurator, TcpSocket, }; @@ -101,7 +100,7 @@ fn main() -> ! { RNG_INST.replace(rng); } - let eth_int = interrupt_take!(ETH); + let eth_int = interrupt::take!(ETH); let mac_addr = [0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF]; let state = STATE.put(State::new()); diff --git a/examples/stm32g0/Cargo.toml b/examples/stm32g0/Cargo.toml index 731116c3..6b249ee0 100644 --- a/examples/stm32g0/Cargo.toml +++ b/examples/stm32g0/Cargo.toml @@ -9,7 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "time-driver-tim2", "stm32g071rb", "memory-x", "unstable-pac"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32g0/build.rs b/examples/stm32g0/build.rs index 30691aa9..8cd32d7e 100644 --- a/examples/stm32g0/build.rs +++ b/examples/stm32g0/build.rs @@ -1,34 +1,4 @@ -//! This build script copies the `memory.x` file from the crate root into -//! a directory where the linker can always find it at build time. -//! For many projects this is optional, as the linker always searches the -//! project root directory -- wherever `Cargo.toml` is. However, if you -//! are using a workspace or have a more complicated build setup, this -//! build script becomes required. Additionally, by requesting that -//! Cargo re-run the build script whenever `memory.x` is changed, -//! updating `memory.x` ensures a rebuild of the application with the -//! new memory settings. - -use std::env; -use std::fs::File; -use std::io::Write; -use std::path::PathBuf; - fn main() { - // Put `memory.x` in our output directory and ensure it's - // on the linker search path. - let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); - File::create(out.join("memory.x")) - .unwrap() - .write_all(include_bytes!("memory.x")) - .unwrap(); - println!("cargo:rustc-link-search={}", out.display()); - - // By default, Cargo will re-run a build script whenever - // any file in the project changes. By specifying `memory.x` - // here, we ensure the build script is only re-run when - // `memory.x` is changed. - println!("cargo:rerun-if-changed=memory.x"); - println!("cargo:rustc-link-arg-bins=--nmagic"); println!("cargo:rustc-link-arg-bins=-Tlink.x"); println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); diff --git a/examples/stm32g0/memory.x b/examples/stm32g0/memory.x deleted file mode 100644 index 02d59c83..00000000 --- a/examples/stm32g0/memory.x +++ /dev/null @@ -1,7 +0,0 @@ -MEMORY -{ - /* NOTE 1 K = 1 KiBi = 1024 bytes */ - /* These values correspond to the STM32G071C8 */ - FLASH : ORIGIN = 0x08000000, LENGTH = 64K - RAM : ORIGIN = 0x20000000, LENGTH = 36K -} diff --git a/examples/stm32h7/Cargo.toml b/examples/stm32h7/Cargo.toml index a852b6a7..89e5c4ea 100644 --- a/examples/stm32h7/Cargo.toml +++ b/examples/stm32h7/Cargo.toml @@ -11,9 +11,7 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32h743zi", "net", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } embassy-net = { path = "../../embassy-net", default-features = false, features = ["defmt", "tcp", "medium-ethernet", "pool-16"] } -embassy-macros = { path = "../../embassy-macros" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs index c1b203b8..9998bc4e 100644 --- a/examples/stm32h7/src/bin/eth.rs +++ b/examples/stm32h7/src/bin/eth.rs @@ -13,7 +13,6 @@ use embassy::executor::{Executor, Spawner}; use embassy::io::AsyncWriteExt; use embassy::time::{Duration, Timer}; use embassy::util::Forever; -use embassy_macros::interrupt_take; use embassy_net::{ Config as NetConfig, Ipv4Address, Ipv4Cidr, StackResources, StaticConfigurator, TcpSocket, }; @@ -100,7 +99,7 @@ fn main() -> ! { RNG_INST.replace(rng); } - let eth_int = interrupt_take!(ETH); + let eth_int = interrupt::take!(ETH); let mac_addr = [0x10; 6]; let state = STATE.put(State::new()); let eth = unsafe { diff --git a/examples/stm32l0/Cargo.toml b/examples/stm32l0/Cargo.toml index b16492e1..6fe744f0 100644 --- a/examples/stm32l0/Cargo.toml +++ b/examples/stm32l0/Cargo.toml @@ -9,8 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32l072cz", "time-driver-tim3"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } -embassy-macros = { path = "../../embassy-macros" } embassy-lora = { version = "0.1.0", path = "../../embassy-lora", features = ["sx127x", "time"] } lorawan-device = { git = "https://github.com/ivajloip/rust-lorawan.git", rev = "4bff2e0021103adfbccedcbf49dbcd0474adc4b2", default-features = false, features = ["async"] } diff --git a/examples/stm32l1/Cargo.toml b/examples/stm32l1/Cargo.toml index 190917d1..212fe710 100644 --- a/examples/stm32l1/Cargo.toml +++ b/examples/stm32l1/Cargo.toml @@ -9,8 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32l151cb-a", "time-driver-tim2", "memory-x"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } -embassy-macros = { path = "../../embassy-macros" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32l4/Cargo.toml b/examples/stm32l4/Cargo.toml index caab99b5..3891f41a 100644 --- a/examples/stm32l4/Cargo.toml +++ b/examples/stm32l4/Cargo.toml @@ -11,7 +11,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt" ] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "unstable-pac", "stm32l4s5vi", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32u5/Cargo.toml b/examples/stm32u5/Cargo.toml index 3503eccd..5552b80d 100644 --- a/examples/stm32u5/Cargo.toml +++ b/examples/stm32u5/Cargo.toml @@ -9,7 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "unstable-pac", "stm32u585ai", "memory-x" ] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32wb55/Cargo.toml b/examples/stm32wb55/Cargo.toml index 976ad012..3b977f38 100644 --- a/examples/stm32wb55/Cargo.toml +++ b/examples/stm32wb55/Cargo.toml @@ -9,7 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32wb55cc", "time-driver-tim2"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/stm32wl55/Cargo.toml b/examples/stm32wl55/Cargo.toml index ec504b76..7a762123 100644 --- a/examples/stm32wl55/Cargo.toml +++ b/examples/stm32wl55/Cargo.toml @@ -9,7 +9,6 @@ resolver = "2" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32wl55jc-cm4", "time-driver-tim2", "memory-x", "subghz", "unstable-pac"] } -embassy-hal-common = {version = "0.1.0", path = "../../embassy-hal-common" } embassy-lora = { version = "0.1.0", path = "../../embassy-lora", features = ["stm32wl", "time"] } lorawan-device = { git = "https://github.com/ivajloip/rust-lorawan.git", rev = "4bff2e0021103adfbccedcbf49dbcd0474adc4b2", default-features = false, features = ["async"] } diff --git a/stm32-data b/stm32-data index e60ce40e..ec3fb03d 160000 --- a/stm32-data +++ b/stm32-data @@ -1 +1 @@ -Subproject commit e60ce40e6f9d29e9a8b45ea7b9118e0d55b30928 +Subproject commit ec3fb03dc0325e62ed55ac2dd949b412f3f864e6 diff --git a/stm32-metapac-gen/src/data.rs b/stm32-metapac-gen/src/data.rs index deaf09d3..baeb8c83 100644 --- a/stm32-metapac-gen/src/data.rs +++ b/stm32-metapac-gen/src/data.rs @@ -42,11 +42,9 @@ pub struct Package { pub struct Peripheral { pub address: u64, #[serde(default)] - pub kind: Option, - #[serde(default)] pub block: Option, #[serde(default)] - pub clock: Option, + pub rcc: Option, #[serde(default)] pub pins: Vec, #[serde(default)] @@ -55,6 +53,26 @@ pub struct Peripheral { pub interrupts: BTreeMap, } +#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] +pub struct PeripheralRcc { + pub clock: String, + pub registers: PeripheralRccRegisters, +} + +#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] +pub struct PeripheralRccRegisters { + #[serde(default)] + pub enable: Option, + #[serde(default)] + pub reset: Option, +} + +#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] +pub struct PeripheralRccRegister { + pub register: String, + pub field: String, +} + #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] pub struct Pin { pub pin: String, diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs index 9fe3be55..3a8f8111 100644 --- a/stm32-metapac-gen/src/lib.rs +++ b/stm32-metapac-gen/src/lib.rs @@ -1,5 +1,4 @@ use chiptool::generate::CommonModule; -use chiptool::ir::IR; use proc_macro2::TokenStream; use regex::Regex; use std::collections::{BTreeMap, HashMap, HashSet}; @@ -17,24 +16,6 @@ use chiptool::{generate, ir, transform}; mod data; use data::*; -fn find_reg<'c>(rcc: &'c ir::IR, reg_regex: &str, field_name: &str) -> Option<(&'c str, &'c str)> { - let reg_regex = Regex::new(reg_regex).unwrap(); - - for (name, fieldset) in &rcc.fieldsets { - // Workaround for some families that prefix register aliases with C1_, which does - // not help matching for clock name. - if !name.starts_with("C1") && !name.starts_with("C2") && reg_regex.is_match(name) { - for field in &fieldset.fields { - if field_name == field.name { - return Some((name.as_str(), field.name.as_str())); - } - } - } - } - - None -} - fn make_peripheral_counts(out: &mut String, data: &BTreeMap) { write!( out, @@ -130,21 +111,6 @@ pub fn gen_chip( } }); - // Load RCC register for chip - let (_, rcc) = core - .peripherals - .iter() - .find(|(name, _)| name == &"RCC") - .expect("RCC peripheral missing"); - - let rcc_block = rcc.block.as_ref().expect("RCC peripheral has no block"); - let bi = BlockInfo::parse(&rcc_block); - let rcc_reg_path = options - .data_dir - .join("registers") - .join(&format!("{}_{}.yaml", bi.module, bi.version)); - let rcc: IR = serde_yaml::from_reader(File::open(rcc_reg_path).unwrap()).unwrap(); - let mut peripheral_versions: BTreeMap = BTreeMap::new(); let mut pin_table: Vec> = Vec::new(); let mut interrupt_table: Vec> = Vec::new(); @@ -156,8 +122,6 @@ pub fn gen_chip( let mut peripheral_counts: BTreeMap = BTreeMap::new(); let mut dma_channel_counts: BTreeMap = BTreeMap::new(); let mut dbgmcu_table: Vec> = Vec::new(); - let mut gpio_rcc_table: Vec> = Vec::new(); - let mut gpio_regs: HashSet = HashSet::new(); let gpio_base = core.peripherals.get(&"GPIOA".to_string()).unwrap().address as u32; let gpio_stride = 0x400; @@ -290,88 +254,38 @@ pub fn gen_chip( _ => {} } - // Workaround for clock registers being split on some chip families. Assume fields are - // named after peripheral and look for first field matching and use that register. - let mut en = find_reg(&rcc, "^.+ENR\\d*$", &format!("{}EN", name)); - let mut rst = find_reg(&rcc, "^.+RSTR\\d*$", &format!("{}RST", name)); + if let Some(rcc) = &p.rcc { + let mut clock = rcc.clock.to_ascii_lowercase(); + if name.starts_with("TIM") { + clock = format!("{}_tim", clock) + } - if en.is_none() && name.ends_with("1") { - en = find_reg( - &rcc, - "^.+ENR\\d*$", - &format!("{}EN", &name[..name.len() - 1]), - ); - rst = find_reg( - &rcc, - "^.+RSTR\\d*$", - &format!("{}RST", &name[..name.len() - 1]), - ); - } + let mut row = Vec::new(); + row.push(name.clone()); + row.push(bi.module.clone()); + row.push(bi.block.clone()); + row.push(clock); - match (en, rst) { - (Some((enable_reg, enable_field)), reset_reg_field) => { - let clock = match &p.clock { - Some(clock) => clock.as_str(), - None => { - // No clock was specified, derive the clock name from the enable register name. - // N.B. STM32G0 has only one APB bus but split ENR registers - // (e.g. APBENR1). - Regex::new("([A-Z]+\\d*)ENR\\d*") - .unwrap() - .captures(enable_reg) - .unwrap() - .get(1) - .unwrap() - .as_str() - } - }; - - let clock = if name.starts_with("TIM") { - format!("{}_tim", clock.to_ascii_lowercase()) + for reg in [&rcc.registers.enable, &rcc.registers.reset] { + if let Some(reg) = reg { + row.push(format!( + "({}, {}, set_{})", + reg.register.to_ascii_lowercase(), + reg.field.to_ascii_lowercase(), + reg.field.to_ascii_lowercase() + )); } else { - clock.to_ascii_lowercase() - }; - - let mut row = Vec::with_capacity(6); - row.push(name.clone()); - row.push(clock); - row.push(enable_reg.to_ascii_lowercase()); - - if let Some((reset_reg, reset_field)) = reset_reg_field { - row.push(reset_reg.to_ascii_lowercase()); - row.push(format!("set_{}", enable_field.to_ascii_lowercase())); - row.push(format!("set_{}", reset_field.to_ascii_lowercase())); - } else { - row.push(format!("set_{}", enable_field.to_ascii_lowercase())); - } - - if !name.starts_with("GPIO") { - peripheral_rcc_table.push(row); - } else { - gpio_rcc_table.push(row); - gpio_regs.insert(enable_reg.to_ascii_lowercase()); + row.push("_".to_string()) } } - (None, Some(_)) => { - println!("Unable to find enable register for {}", name) - } - (None, None) => { - println!("Unable to find enable and reset register for {}", name) - } + + peripheral_rcc_table.push(row); } } dev.peripherals.push(ir_peri); } - for reg in gpio_regs { - gpio_rcc_table.push(vec![reg]); - } - - // We should always find GPIO RCC regs. If not, it means something - // is broken and GPIO won't work because it's not enabled. - assert!(!gpio_rcc_table.is_empty()); - for (id, channel_info) in &core.dma_channels { let mut row = Vec::new(); let dma_peri = core.peripherals.get(&channel_info.dma).unwrap(); @@ -502,7 +416,6 @@ pub fn gen_chip( &peripheral_dma_channels_table, ); make_table(&mut data, "peripheral_rcc", &peripheral_rcc_table); - make_table(&mut data, "gpio_rcc", &gpio_rcc_table); make_table(&mut data, "dma_channels", &dma_channels_table); make_table(&mut data, "dbgmcu", &dbgmcu_table); make_peripheral_counts(&mut data, &peripheral_counts); @@ -547,6 +460,8 @@ pub fn gen(options: Options) { let mut chip_core_names: Vec = Vec::new(); for chip_name in &options.chips { + println!("Generating {}...", chip_name); + let chip = load_chip(&options, chip_name); for (core_index, core) in chip.cores.iter().enumerate() { let chip_core_name = match chip.cores.len() { diff --git a/stm32-metapac-gen/src/main.rs b/stm32-metapac-gen/src/main.rs index c4ea7714..5ed751f1 100644 --- a/stm32-metapac-gen/src/main.rs +++ b/stm32-metapac-gen/src/main.rs @@ -8,7 +8,7 @@ fn main() { let args: Vec = args().collect(); - let chips = match &args[..] { + let mut chips = match &args[..] { [_, chip] => { vec![chip.clone()] } @@ -24,6 +24,8 @@ fn main() { _ => panic!("usage: stm32-metapac-gen [chip?]"), }; + chips.sort(); + gen(Options { out_dir, data_dir,