aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-02-05 03:03:32 +0100
committerDario Nieuwenhuis <[email protected]>2022-02-05 03:03:32 +0100
commitfbaa7e59d55ab0344efbfbe065a33a5b8bb22a2a (patch)
treea4b93327db0755be0d5dd3a0e90ff8301b5d9eb6
parentf8507b5e785c1b8eae2e7c484b42919973fcebbe (diff)
stm32/dma: fix interrupt codegen for new stm32-data
-rw-r--r--embassy-stm32/build.rs72
-rw-r--r--embassy-stm32/src/dma/bdma.rs12
-rw-r--r--embassy-stm32/src/dma/dma.rs11
-rw-r--r--embassy-stm32/src/dma/mod.rs4
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 @@
1use std::collections::HashMap; 1use std::collections::HashMap;
2use std::env; 2use std::env;
3use std::fmt::Write;
3use std::fs; 4use std::fs;
4use std::path::PathBuf; 5use 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};
7use embassy::waitqueue::AtomicWaker; 7use embassy::waitqueue::AtomicWaker;
8 8
9use crate::dma::Request; 9use crate::dma::Request;
10use crate::interrupt;
11use crate::pac; 10use crate::pac;
12use crate::pac::bdma::vals; 11use crate::pac::bdma::vals;
13use crate::rcc::sealed::RccPeripheral; 12use crate::rcc::sealed::RccPeripheral;
@@ -53,7 +52,7 @@ macro_rules! dma_num {
53 }; 52 };
54} 53}
55 54
56unsafe fn on_irq() { 55pub(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
173pac::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
182mod low_level_api { 172mod 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
50unsafe fn on_irq() { 50pub(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
165pac::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
174mod low_level_api { 165mod 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)]
2mod bdma; 2pub(crate) mod bdma;
3#[cfg(dma)] 3#[cfg(dma)]
4mod dma; 4pub(crate) mod dma;
5#[cfg(dmamux)] 5#[cfg(dmamux)]
6mod dmamux; 6mod dmamux;
7 7