diff --git a/README.md b/README.md index 655ede1..079ddda 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ families, including: - :x: GPIO mappings for F1 - :construction: Register blocks for all peripherals - :heavy_check_mark: DMA stream mappings -- :x: Per-package pinouts +- :heavy_check_mark: Per-package pinouts - :heavy_check_mark: Links to applicable reference manuals, datasheets, appnotes PDFs. :heavy_check_mark: = done, :construction: = work in progress, :x: = to do diff --git a/stm32-data-gen/src/chips.rs b/stm32-data-gen/src/chips.rs index 77c086c..f979abd 100644 --- a/stm32-data-gen/src/chips.rs +++ b/stm32-data-gen/src/chips.rs @@ -38,6 +38,8 @@ mod xml { pub struct Pin { #[serde(rename = "Name")] pub name: String, + #[serde(rename = "Position")] + pub position: String, #[serde(rename = "Signal", default)] pub signals: Vec, } @@ -885,6 +887,25 @@ fn parse_group( group_idx }); + let mut package_pins: HashMap> = HashMap::new(); + for pin in &parsed.pins { + package_pins + .entry(pin.position.clone()) + .or_default() + .push(gpio_af::clean_pin(&pin.name).unwrap_or_else(|| pin.name.clone())); + } + let mut package_pins: Vec = package_pins + .into_iter() + .map(|(position, mut signals)| { + signals.sort(); + stm32_data_serde::chip::PackagePin { position, signals } + }) + .collect(); + package_pins.sort_by_key(|p| match p.position.parse::() { + Ok(n) => (Some(n), None), + Err(_) => (None, Some(p.position.clone())), + }); + for (package_i, package_name) in package_names.iter().enumerate() { let chip_name = chip_name_from_package_name(package_name); if !chips.contains_key(&chip_name) { @@ -905,6 +926,7 @@ fn parse_group( .push(stm32_data_serde::chip::Package { name: package_name.clone(), package: parsed.package.clone(), + pins: package_pins.clone(), }); } diff --git a/stm32-data-serde/src/lib.rs b/stm32-data-serde/src/lib.rs index 38a4407..40b5955 100644 --- a/stm32-data-serde/src/lib.rs +++ b/stm32-data-serde/src/lib.rs @@ -34,6 +34,13 @@ pub mod chip { pub struct Package { pub name: String, pub package: String, + pub pins: Vec, + } + + #[derive(Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Deserialize)] + pub struct PackagePin { + pub position: String, + pub signals: Vec, } #[derive(Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Deserialize)]