aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/bdma/mod.rs48
1 files changed, 24 insertions, 24 deletions
diff --git a/embassy-stm32/src/bdma/mod.rs b/embassy-stm32/src/bdma/mod.rs
index 8448185a0..39e8bec3b 100644
--- a/embassy-stm32/src/bdma/mod.rs
+++ b/embassy-stm32/src/bdma/mod.rs
@@ -39,7 +39,7 @@ static STATE: State = State::new();
39#[allow(unused)] 39#[allow(unused)]
40pub(crate) async unsafe fn transfer_p2m( 40pub(crate) async unsafe fn transfer_p2m(
41 regs: pac::bdma::Ch, 41 regs: pac::bdma::Ch,
42 state_number: usize, 42 state_number: u8,
43 src: *const u8, 43 src: *const u8,
44 dst: &mut [u8], 44 dst: &mut [u8],
45 #[cfg(dmamux)] dmamux_regs: pac::dmamux::Dmamux, 45 #[cfg(dmamux)] dmamux_regs: pac::dmamux::Dmamux,
@@ -51,7 +51,7 @@ pub(crate) async unsafe fn transfer_p2m(
51 51
52 // Reset status 52 // Reset status
53 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA 53 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA
54 STATE.ch_status[state_number].store(CH_STATUS_NONE, Ordering::Release); 54 STATE.ch_status[state_number as usize].store(CH_STATUS_NONE, Ordering::Release);
55 55
56 let on_drop = OnDrop::new(|| unsafe { 56 let on_drop = OnDrop::new(|| unsafe {
57 regs.cr().modify(|w| { 57 regs.cr().modify(|w| {
@@ -78,8 +78,8 @@ pub(crate) async unsafe fn transfer_p2m(
78 }); 78 });
79 79
80 let res = poll_fn(|cx| { 80 let res = poll_fn(|cx| {
81 STATE.ch_wakers[state_number].register(cx.waker()); 81 STATE.ch_wakers[state_number as usize].register(cx.waker());
82 match STATE.ch_status[state_number].load(Ordering::Acquire) { 82 match STATE.ch_status[state_number as usize].load(Ordering::Acquire) {
83 CH_STATUS_NONE => Poll::Pending, 83 CH_STATUS_NONE => Poll::Pending,
84 x => Poll::Ready(x), 84 x => Poll::Ready(x),
85 } 85 }
@@ -93,7 +93,7 @@ pub(crate) async unsafe fn transfer_p2m(
93#[allow(unused)] 93#[allow(unused)]
94pub(crate) async unsafe fn transfer_m2p( 94pub(crate) async unsafe fn transfer_m2p(
95 regs: pac::bdma::Ch, 95 regs: pac::bdma::Ch,
96 state_number: usize, 96 state_number: u8,
97 src: &[u8], 97 src: &[u8],
98 dst: *mut u8, 98 dst: *mut u8,
99 #[cfg(dmamux)] dmamux_regs: pac::dmamux::Dmamux, 99 #[cfg(dmamux)] dmamux_regs: pac::dmamux::Dmamux,
@@ -105,7 +105,7 @@ pub(crate) async unsafe fn transfer_m2p(
105 105
106 // Reset status 106 // Reset status
107 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA 107 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA
108 STATE.ch_status[state_number].store(CH_STATUS_NONE, Ordering::Release); 108 STATE.ch_status[state_number as usize].store(CH_STATUS_NONE, Ordering::Release);
109 109
110 let on_drop = OnDrop::new(|| unsafe { 110 let on_drop = OnDrop::new(|| unsafe {
111 regs.cr().modify(|w| { 111 regs.cr().modify(|w| {
@@ -133,8 +133,8 @@ pub(crate) async unsafe fn transfer_m2p(
133 }); 133 });
134 134
135 let res = poll_fn(|cx| { 135 let res = poll_fn(|cx| {
136 STATE.ch_wakers[state_number].register(cx.waker()); 136 STATE.ch_wakers[state_number as usize].register(cx.waker());
137 match STATE.ch_status[state_number].load(Ordering::Acquire) { 137 match STATE.ch_status[state_number as usize].load(Ordering::Acquire) {
138 CH_STATUS_NONE => Poll::Pending, 138 CH_STATUS_NONE => Poll::Pending,
139 x => Poll::Ready(x), 139 x => Poll::Ready(x),
140 } 140 }
@@ -191,13 +191,11 @@ pub(crate) mod sealed {
191 191
192 pub trait Channel { 192 pub trait Channel {
193 const CH_NUM: u8; 193 const CH_NUM: u8;
194 194 const STATE_NUM: u8;
195 fn dma_regs() -> pac::bdma::Dma; 195 const DMA_REGS: pac::bdma::Dma;
196
197 fn state_num(&self) -> usize;
198 196
199 fn regs(&self) -> pac::bdma::Ch { 197 fn regs(&self) -> pac::bdma::Ch {
200 Self::dma_regs().ch(Self::CH_NUM as usize) 198 Self::DMA_REGS.ch(Self::CH_NUM as usize)
201 } 199 }
202 } 200 }
203} 201}
@@ -219,15 +217,17 @@ macro_rules! impl_dma_channel {
219 impl Channel for crate::peripherals::$channel_peri {} 217 impl Channel for crate::peripherals::$channel_peri {}
220 impl sealed::Channel for crate::peripherals::$channel_peri { 218 impl sealed::Channel for crate::peripherals::$channel_peri {
221 const CH_NUM: u8 = $ch_num; 219 const CH_NUM: u8 = $ch_num;
220 const STATE_NUM: u8 = (dma_num!($dma_peri) * 8) + $ch_num;
221 const DMA_REGS: pac::bdma::Dma = crate::pac::$dma_peri;
222 222
223 #[inline] 223 //#[inline]
224 fn dma_regs() -> pac::bdma::Dma { 224 //fn dma_regs() -> pac::bdma::Dma {
225 crate::pac::$dma_peri 225 //crate::pac::$dma_peri
226 } 226 //}
227 227
228 fn state_num(&self) -> usize { 228 //fn state_num(&self) -> usize {
229 (dma_num!($dma_peri) * 8) + $ch_num 229 //(dma_num!($dma_peri) * 8) + $ch_num
230 } 230 //}
231 } 231 }
232 232
233 #[cfg(not(dmamux))] 233 #[cfg(not(dmamux))]
@@ -243,7 +243,7 @@ macro_rules! impl_dma_channel {
243 { 243 {
244 use sealed::Channel as _Channel; 244 use sealed::Channel as _Channel;
245 245
246 let state_num = self.state_num(); 246 let state_num = Self::STATE_NUM;
247 let regs = self.regs(); 247 let regs = self.regs();
248 248
249 unsafe { transfer_m2p(regs, state_num, buf, dst) } 249 unsafe { transfer_m2p(regs, state_num, buf, dst) }
@@ -264,7 +264,7 @@ macro_rules! impl_dma_channel {
264 { 264 {
265 use sealed::Channel as _Channel; 265 use sealed::Channel as _Channel;
266 266
267 let state_num = self.state_num(); 267 let state_num = Self::STATE_NUM;
268 let regs = self.regs(); 268 let regs = self.regs();
269 269
270 use crate::dmamux::sealed::Channel as MuxChannel; 270 use crate::dmamux::sealed::Channel as MuxChannel;
@@ -307,7 +307,7 @@ macro_rules! impl_dma_channel {
307 { 307 {
308 use sealed::Channel as _Channel; 308 use sealed::Channel as _Channel;
309 309
310 let state_num = self.state_num(); 310 let state_num = Self::STATE_NUM;
311 let regs = self.regs(); 311 let regs = self.regs();
312 unsafe { transfer_p2m(regs, state_num, src, buf) } 312 unsafe { transfer_p2m(regs, state_num, src, buf) }
313 } 313 }
@@ -331,7 +331,7 @@ macro_rules! impl_dma_channel {
331 { 331 {
332 use sealed::Channel as _Channel; 332 use sealed::Channel as _Channel;
333 333
334 let state_num = self.state_num(); 334 let state_num = Self::STATE_NUM;
335 let regs = self.regs(); 335 let regs = self.regs();
336 336
337 use crate::dmamux::sealed::Channel as MuxChannel; 337 use crate::dmamux::sealed::Channel as MuxChannel;