diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-02-05 03:03:32 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-02-05 03:03:32 +0100 |
| commit | fbaa7e59d55ab0344efbfbe065a33a5b8bb22a2a (patch) | |
| tree | a4b93327db0755be0d5dd3a0e90ff8301b5d9eb6 | |
| parent | f8507b5e785c1b8eae2e7c484b42919973fcebbe (diff) | |
stm32/dma: fix interrupt codegen for new stm32-data
| -rw-r--r-- | embassy-stm32/build.rs | 72 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/bdma.rs | 12 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/dma.rs | 11 | ||||
| -rw-r--r-- | embassy-stm32/src/dma/mod.rs | 4 |
4 files changed, 68 insertions, 31 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index cefd7434a..ff91f93de 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | use std::collections::HashMap; | 1 | use std::collections::HashMap; |
| 2 | use std::env; | 2 | use std::env; |
| 3 | use std::fmt::Write; | ||
| 3 | use std::fs; | 4 | use std::fs; |
| 4 | use std::path::PathBuf; | 5 | use std::path::PathBuf; |
| 5 | 6 | ||
| @@ -43,6 +44,9 @@ fn main() { | |||
| 43 | }; | 44 | }; |
| 44 | ); | 45 | ); |
| 45 | 46 | ||
| 47 | // ======== | ||
| 48 | // Generate singletons | ||
| 49 | |||
| 46 | let mut singletons: Vec<String> = Vec::new(); | 50 | let mut singletons: Vec<String> = Vec::new(); |
| 47 | for p in peripherals { | 51 | for p in peripherals { |
| 48 | match p.kind.as_str() { | 52 | match p.kind.as_str() { |
| @@ -90,17 +94,66 @@ fn main() { | |||
| 90 | }; | 94 | }; |
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | let out_dir = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); | 97 | let mut generated = String::new(); |
| 94 | let out_file = out_dir.join("generated.rs").to_string_lossy().to_string(); | 98 | write!( |
| 95 | fs::write( | 99 | &mut generated, |
| 96 | out_file, | 100 | "embassy_hal_common::peripherals!({});\n", |
| 97 | format!( | 101 | singletons.join(",") |
| 98 | "embassy_hal_common::peripherals!({});", | ||
| 99 | singletons.join(",") | ||
| 100 | ), | ||
| 101 | ) | 102 | ) |
| 102 | .unwrap(); | 103 | .unwrap(); |
| 103 | 104 | ||
| 105 | // ======== | ||
| 106 | // Generate DMA IRQs. | ||
| 107 | // This can't be done with macrotables alone because in many chips, one irq is shared between many | ||
| 108 | // channels, so we have to deduplicate them. | ||
| 109 | |||
| 110 | #[allow(unused_mut)] | ||
| 111 | let mut dma_irqs: Vec<String> = Vec::new(); | ||
| 112 | #[allow(unused_mut)] | ||
| 113 | let mut bdma_irqs: Vec<String> = Vec::new(); | ||
| 114 | |||
| 115 | stm32_metapac::interrupts! { | ||
| 116 | ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => { | ||
| 117 | dma_irqs.push(stringify!($irq).to_string()); | ||
| 118 | }; | ||
| 119 | ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => { | ||
| 120 | bdma_irqs.push(stringify!($irq).to_string()); | ||
| 121 | }; | ||
| 122 | } | ||
| 123 | |||
| 124 | dma_irqs.sort(); | ||
| 125 | dma_irqs.dedup(); | ||
| 126 | bdma_irqs.sort(); | ||
| 127 | bdma_irqs.dedup(); | ||
| 128 | |||
| 129 | for irq in dma_irqs { | ||
| 130 | write!( | ||
| 131 | &mut generated, | ||
| 132 | "#[crate::interrupt] unsafe fn {} () {{ crate::dma::dma::on_irq(); }}\n", | ||
| 133 | irq | ||
| 134 | ) | ||
| 135 | .unwrap(); | ||
| 136 | } | ||
| 137 | |||
| 138 | for irq in bdma_irqs { | ||
| 139 | write!( | ||
| 140 | &mut generated, | ||
| 141 | "#[crate::interrupt] unsafe fn {} () {{ crate::dma::bdma::on_irq(); }}\n", | ||
| 142 | irq | ||
| 143 | ) | ||
| 144 | .unwrap(); | ||
| 145 | } | ||
| 146 | |||
| 147 | // ======== | ||
| 148 | // Write generated.rs | ||
| 149 | |||
| 150 | let out_dir = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); | ||
| 151 | let out_file = out_dir.join("generated.rs").to_string_lossy().to_string(); | ||
| 152 | fs::write(out_file, &generated).unwrap(); | ||
| 153 | |||
| 154 | // ======== | ||
| 155 | // Multicore | ||
| 156 | |||
| 104 | let mut s = chip_name.split('_'); | 157 | let mut s = chip_name.split('_'); |
| 105 | let mut chip_name: String = s.next().unwrap().to_string(); | 158 | let mut chip_name: String = s.next().unwrap().to_string(); |
| 106 | let core_name = if let Some(c) = s.next() { | 159 | let core_name = if let Some(c) = s.next() { |
| @@ -125,6 +178,9 @@ fn main() { | |||
| 125 | println!("cargo:rustc-cfg={}", &chip_name[..chip_name.len() - 2]); | 178 | println!("cargo:rustc-cfg={}", &chip_name[..chip_name.len() - 2]); |
| 126 | } | 179 | } |
| 127 | 180 | ||
| 181 | // ======== | ||
| 182 | // stm32f3 wildcard features used in RCC | ||
| 183 | |||
| 128 | if chip_name.starts_with("stm32f3") { | 184 | if chip_name.starts_with("stm32f3") { |
| 129 | println!("cargo:rustc-cfg={}x{}", &chip_name[..9], &chip_name[10..11]); | 185 | println!("cargo:rustc-cfg={}x{}", &chip_name[..9], &chip_name[10..11]); |
| 130 | } | 186 | } |
diff --git a/embassy-stm32/src/dma/bdma.rs b/embassy-stm32/src/dma/bdma.rs index e06ce8c36..ebb0467dc 100644 --- a/embassy-stm32/src/dma/bdma.rs +++ b/embassy-stm32/src/dma/bdma.rs | |||
| @@ -7,7 +7,6 @@ use embassy::interrupt::{Interrupt, InterruptExt}; | |||
| 7 | use embassy::waitqueue::AtomicWaker; | 7 | use embassy::waitqueue::AtomicWaker; |
| 8 | 8 | ||
| 9 | use crate::dma::Request; | 9 | use crate::dma::Request; |
| 10 | use crate::interrupt; | ||
| 11 | use crate::pac; | 10 | use crate::pac; |
| 12 | use crate::pac::bdma::vals; | 11 | use crate::pac::bdma::vals; |
| 13 | use crate::rcc::sealed::RccPeripheral; | 12 | use crate::rcc::sealed::RccPeripheral; |
| @@ -53,7 +52,7 @@ macro_rules! dma_num { | |||
| 53 | }; | 52 | }; |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | unsafe fn on_irq() { | 55 | pub(crate) unsafe fn on_irq() { |
| 57 | pac::peripherals! { | 56 | pac::peripherals! { |
| 58 | (bdma, $dma:ident) => { | 57 | (bdma, $dma:ident) => { |
| 59 | let isr = pac::$dma.isr().read(); | 58 | let isr = pac::$dma.isr().read(); |
| @@ -170,15 +169,6 @@ pac::dma_channels! { | |||
| 170 | }; | 169 | }; |
| 171 | } | 170 | } |
| 172 | 171 | ||
| 173 | pac::interrupts! { | ||
| 174 | ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => { | ||
| 175 | #[crate::interrupt] | ||
| 176 | unsafe fn $irq () { | ||
| 177 | on_irq() | ||
| 178 | } | ||
| 179 | }; | ||
| 180 | } | ||
| 181 | |||
| 182 | mod low_level_api { | 172 | mod low_level_api { |
| 183 | use super::*; | 173 | use super::*; |
| 184 | 174 | ||
diff --git a/embassy-stm32/src/dma/dma.rs b/embassy-stm32/src/dma/dma.rs index 8e48bb26f..21623b90c 100644 --- a/embassy-stm32/src/dma/dma.rs +++ b/embassy-stm32/src/dma/dma.rs | |||
| @@ -47,7 +47,7 @@ macro_rules! dma_num { | |||
| 47 | }; | 47 | }; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | unsafe fn on_irq() { | 50 | pub(crate) unsafe fn on_irq() { |
| 51 | pac::peripherals! { | 51 | pac::peripherals! { |
| 52 | (dma, $dma:ident) => { | 52 | (dma, $dma:ident) => { |
| 53 | for isrn in 0..2 { | 53 | for isrn in 0..2 { |
| @@ -162,15 +162,6 @@ pac::dma_channels! { | |||
| 162 | }; | 162 | }; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | pac::interrupts! { | ||
| 166 | ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => { | ||
| 167 | #[crate::interrupt] | ||
| 168 | unsafe fn $irq () { | ||
| 169 | on_irq() | ||
| 170 | } | ||
| 171 | }; | ||
| 172 | } | ||
| 173 | |||
| 174 | mod low_level_api { | 165 | mod low_level_api { |
| 175 | use super::*; | 166 | use super::*; |
| 176 | 167 | ||
diff --git a/embassy-stm32/src/dma/mod.rs b/embassy-stm32/src/dma/mod.rs index 3b22faca7..1c9661561 100644 --- a/embassy-stm32/src/dma/mod.rs +++ b/embassy-stm32/src/dma/mod.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #[cfg(bdma)] | 1 | #[cfg(bdma)] |
| 2 | mod bdma; | 2 | pub(crate) mod bdma; |
| 3 | #[cfg(dma)] | 3 | #[cfg(dma)] |
| 4 | mod dma; | 4 | pub(crate) mod dma; |
| 5 | #[cfg(dmamux)] | 5 | #[cfg(dmamux)] |
| 6 | mod dmamux; | 6 | mod dmamux; |
| 7 | 7 | ||
