diff --git a/mspm0-data-gen/src/generate.rs b/mspm0-data-gen/src/generate.rs index 02273a1..cbdf272 100644 --- a/mspm0-data-gen/src/generate.rs +++ b/mspm0-data-gen/src/generate.rs @@ -1,4 +1,10 @@ -use std::{borrow::Cow, cmp::Ordering, collections::{BTreeMap, BTreeSet}, fs, sync::LazyLock}; +use std::{ + borrow::Cow, + cmp::Ordering, + collections::{BTreeMap, BTreeSet}, + fs, + sync::LazyLock, +}; use anyhow::{anyhow, bail, ensure, Context}; use mspm0_data_types::{ @@ -195,8 +201,7 @@ fn generate_peripherals2( LazyLock::new(|| Regex::new(r"(?m)^P(?[A-Z])\d+").unwrap()); static DMA_CHANNEL: LazyLock = LazyLock::new(|| Regex::new(r"DMA_CH(?\d+)").unwrap()); - static USB_EP: LazyLock = - LazyLock::new(|| Regex::new(r"USBFS(\d+)_EP(\w+)").unwrap()); + static USB_EP: LazyLock = LazyLock::new(|| Regex::new(r"USBFS(\d+)_EP(\w+)").unwrap()); let mut peripherals = BTreeMap::new(); @@ -255,11 +260,7 @@ fn generate_peripherals2( // IWDT technically exists on G151x and G351x, but the SDK and datasheets do not define the address for IWDT. // // To prevent issues, we will only consider IWDT to exist on chips which define an address. - if name == "IWDT" && header - .peripheral_addresses - .get(&name) - .is_none() - { + if name == "IWDT" && header.peripheral_addresses.get(&name).is_none() { continue; } diff --git a/mspm0-data-gen/src/verify.rs b/mspm0-data-gen/src/verify.rs index 8f415ae..ac4e288 100644 --- a/mspm0-data-gen/src/verify.rs +++ b/mspm0-data-gen/src/verify.rs @@ -95,12 +95,20 @@ fn pin_names(chip: &Chip, name: &str) -> anyhow::Result<()> { } fn gpio_no_duplicates(chip: &Chip, name: &str) -> anyhow::Result<()> { - for (_, peripheral) in chip.peripherals.iter().filter(|(name, _)| name.starts_with("GPIO")) { + for (_, peripheral) in chip + .peripherals + .iter() + .filter(|(name, _)| name.starts_with("GPIO")) + { let mut signals = HashSet::new(); for pin in peripheral.pins.iter() { if !signals.insert(&pin.pin) { - bail!("{name}: {} contains multiple pins of {}", peripheral.name, pin.pin); + bail!( + "{name}: {} contains multiple pins of {}", + peripheral.name, + pin.pin + ); } } } diff --git a/mspm0-metapac-gen/src/metadata.rs b/mspm0-metapac-gen/src/metadata.rs index 31d7e14..86ac88e 100644 --- a/mspm0-metapac-gen/src/metadata.rs +++ b/mspm0-metapac-gen/src/metadata.rs @@ -46,7 +46,7 @@ pub fn peripherals(chip: &Chip, package: &Package) -> TokenStream { let mut peripherals = Vec::::new(); for peri in chip.peripherals.values() { - if let Some(peri) = generate_peripheral(peri, &pins) { + if let Some(peri) = generate_peripheral(peri, &pins, package) { peripherals.push(peri); } } @@ -143,12 +143,13 @@ pub fn interrupt_groups(chip: &Chip) -> TokenStream { } fn skip_peripheral(ty: PeripheralType) -> bool { - matches!(ty, PeripheralType::Unknown | PeripheralType::Sysctl) + matches!(ty, PeripheralType::Unknown) } fn generate_peripheral( peripheral: &Peripheral, available_pins: &HashSet, + package: &Package, ) -> Option { // Exclude peripherals that don't really exist as singletons. if skip_peripheral(peripheral.ty) { @@ -172,7 +173,23 @@ fn generate_peripheral( None => quote! { None }, }; - if available_pins.contains(name) { + if available_pins.contains(name) || name == "NRST" { + // If NRST is being used, figure out what pin it truly maps to. + let name = if name == "NRST" { + // Some packages share a GPIO with NRST. + let shared_pin = package + .pins + .iter() + .find(|pin| pin.signals.iter().any(|s| s == "NRST") && pin.signals.len() > 1); + + match shared_pin { + Some(pin) => pin.signals.iter().find(|s| **s != "NRST").unwrap(), + None => name, + } + } else { + name + }; + pins.push(quote! { PeripheralPin { pin: #name,