diff options
author | Bob McWhirter <bmcwhirt@redhat.com> | 2021-06-25 14:00:11 -0400 |
---|---|---|
committer | Bob McWhirter <bmcwhirt@redhat.com> | 2021-06-29 11:01:57 -0400 |
commit | b88fc2847a2c605ea78e18cd1c5aaf2137445926 (patch) | |
tree | 3dd3a75aa7542f474e2b5bd1349c5a72f395ae1d /stm32-metapac | |
parent | 1732551db48c5788502221b96f3ec6f8fe76ada3 (diff) | |
download | embassy-b88fc2847a2c605ea78e18cd1c5aaf2137445926.zip |
Checkpoint with lifetime issues.
Diffstat (limited to 'stm32-metapac')
-rw-r--r-- | stm32-metapac/Cargo.toml | 1 | ||||
-rw-r--r-- | stm32-metapac/gen/src/lib.rs | 65 |
2 files changed, 54 insertions, 12 deletions
diff --git a/stm32-metapac/Cargo.toml b/stm32-metapac/Cargo.toml index bed772c8..79f1c374 100644 --- a/stm32-metapac/Cargo.toml +++ b/stm32-metapac/Cargo.toml @@ -12,6 +12,7 @@ cortex-m-rt = { version = "0.6.8", optional = true } # These are removed when generating the pre-generated crate using the tool at gen/. [build-dependencies] stm32-metapac-gen = { path = "./gen" } +regex = "1.5.4" # END BUILD DEPENDENCIES [features] diff --git a/stm32-metapac/gen/src/lib.rs b/stm32-metapac/gen/src/lib.rs index 408865e3..00e122e9 100644 --- a/stm32-metapac/gen/src/lib.rs +++ b/stm32-metapac/gen/src/lib.rs @@ -48,7 +48,7 @@ pub struct Peripheral { #[serde(default)] pub pins: Vec<Pin>, #[serde(default)] - pub dma_channels: HashMap<String, Vec<String>>, + pub dma_channels: HashMap<String, Vec<PeripheralDmaChannel>>, #[serde(default)] pub dma_requests: HashMap<String, u32>, } @@ -66,6 +66,12 @@ pub struct DmaChannel { pub channel: u32, } +#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Hash)] +pub struct PeripheralDmaChannel { + pub channel: String, + pub request: Option<u32>, +} + struct BlockInfo { /// usart_v1/USART -> usart module: String, @@ -121,6 +127,21 @@ fn find_reg_for_field<'c>( }) } +fn make_peripheral_counts(out: &mut String, data: &HashMap<String, u8>) { + write!(out, + "#[macro_export] +macro_rules! peripheral_count {{ + ").unwrap(); + for (name, count) in data { + write!(out, + "({}) => ({});\n", + name, count, + ).unwrap(); + } + write!(out, + " }}\n").unwrap(); +} + fn make_table(out: &mut String, name: &str, data: &Vec<Vec<String>>) { write!( out, @@ -234,6 +255,7 @@ pub fn gen(options: Options) { let mut dma_channels_table: Vec<Vec<String>> = Vec::new(); let mut dma_requests_table: Vec<Vec<String>> = Vec::new(); let mut peripheral_dma_channels_table: Vec<Vec<String>> = Vec::new(); + let mut peripheral_counts: HashMap<String, u8> = HashMap::new(); let dma_base = core .peripherals @@ -248,12 +270,20 @@ pub fn gen(options: Options) { for (id, channel_info) in &core.dma_channels { let mut row = Vec::new(); row.push(id.clone()); - row.push(channel_info.dma.clone() ); + row.push(channel_info.dma.clone()); row.push(channel_info.channel.to_string()); dma_channels_table.push(row); } + let number_suffix_re = Regex::new("^(.*?)[0-9]*$").unwrap(); + for (name, p) in &core.peripherals { + let captures = number_suffix_re.captures(&name).unwrap(); + let root_peri_name = captures.get(1).unwrap().as_str().to_string(); + peripheral_counts.insert( + root_peri_name.clone(), + peripheral_counts.get(&root_peri_name).map_or(1, |v| v + 1), + ); let mut ir_peri = ir::Peripheral { name: name.clone(), array: None, @@ -291,12 +321,15 @@ pub fn gen(options: Options) { for channel in dma_channels.iter() { let mut row = Vec::new(); row.push(name.clone()); - row.push( bi.module.clone() ); - row.push( bi.block.clone() ); + row.push(bi.module.clone()); + row.push(bi.block.clone()); row.push(event.clone()); - row.push( channel.clone() ); - row.push( core.dma_channels[channel].dma.clone() ); - row.push( core.dma_channels[channel].channel.to_string() ); + row.push(channel.channel.clone()); + row.push(core.dma_channels[&channel.channel].dma.clone()); + row.push(core.dma_channels[&channel.channel].channel.to_string()); + if let Some(request) = channel.request { + row.push(request.to_string()); + } peripheral_dma_channels_table.push(row); } } @@ -421,7 +454,17 @@ pub fn gen(options: Options) { value: num, }); - interrupt_table.push(vec![name.to_ascii_uppercase()]); + let name = name.to_ascii_uppercase(); + + interrupt_table.push(vec![name.clone()]); + + if name.starts_with("DMA") || name.contains("_DMA") { + interrupt_table.push(vec!["DMA".to_string(), name.clone()]); + } + + if name.contains("EXTI") { + interrupt_table.push(vec!["EXTI".to_string(), name.clone()]); + } } ir.devices.insert("".to_string(), dev); @@ -429,11 +472,8 @@ pub fn gen(options: Options) { let mut extra = format!( "pub fn GPIO(n: usize) -> gpio::Gpio {{ gpio::Gpio(({} + {}*n) as _) - }} - pub fn DMA(n: usize) -> dma::Dma {{ - dma::Dma(({} + {}*n) as _) }}", - gpio_base, gpio_stride, dma_base, dma_stride, + gpio_base, gpio_stride, ); let peripheral_version_table = peripheral_versions @@ -450,6 +490,7 @@ pub fn gen(options: Options) { make_table(&mut extra, "peripheral_rcc", &peripheral_rcc_table); make_table(&mut extra, "dma_channels", &dma_channels_table); make_table(&mut extra, "dma_requests", &dma_requests_table); + make_peripheral_counts(&mut extra, &peripheral_counts); for (module, version) in peripheral_versions { all_peripheral_versions.insert((module.clone(), version.clone())); |