@@ -13,15 +13,29 @@ use crate::stm32::{GPDMA1, GPDMA2};
13
13
14
14
use super :: {
15
15
ch:: {
16
- ChannelRegs , DmaChannel , DmaChannel0 , DmaChannel1 , DmaChannel2 ,
17
- DmaChannel3 , DmaChannel4 , DmaChannel5 , DmaChannel6 , DmaChannel7 ,
18
- DmaChannelImpl , DmaChannelRef ,
16
+ Channel , ChannelRegs , DmaChannel0 , DmaChannel1 ,
17
+ DmaChannel2 , DmaChannel3 , DmaChannel4 , DmaChannel5 , DmaChannel6 ,
18
+ DmaChannel7 , DmaChannelRef ,
19
19
} ,
20
20
DmaTransfer , Error , Instance ,
21
21
} ;
22
22
23
23
#[ allow( private_bounds) ]
24
- impl < ' a , CH : DmaChannel > IntoFuture for DmaTransfer < ' a , CH > {
24
+ pub trait DmaChannel : Channel + ChannelWaker { }
25
+
26
+ impl < DMA , CH , const N : usize > DmaChannel for DmaChannelRef < DMA , CH , N >
27
+ where
28
+ DMA : Instance + InstanceWaker ,
29
+ CH : ChannelRegs ,
30
+ Self : Deref < Target = CH > ,
31
+ {
32
+ }
33
+
34
+ #[ allow( private_bounds) ]
35
+ impl < ' a , CH > IntoFuture for DmaTransfer < ' a , CH >
36
+ where
37
+ CH : DmaChannel ,
38
+ {
25
39
type Output = Result < ( ) , Error > ;
26
40
type IntoFuture = DmaTransferFuture < ' a , CH > ;
27
41
@@ -76,7 +90,7 @@ impl<'a, CH: DmaChannel> Unpin for DmaTransferFuture<'a, CH> {}
76
90
77
91
impl < ' a , CH > Future for DmaTransferFuture < ' a , CH >
78
92
where
79
- CH : DmaChannel ,
93
+ CH : DmaChannel + ChannelWaker ,
80
94
{
81
95
type Output = Result < ( ) , Error > ;
82
96
@@ -91,11 +105,11 @@ where
91
105
}
92
106
93
107
#[ allow( private_bounds) ]
94
- impl < DMA , CH , const N : usize > DmaChannelImpl < DmaChannelRef < DMA , CH , N > >
108
+ impl < DMA , CH , const N : usize > DmaChannelRef < DMA , CH , N >
95
109
where
96
- DMA : Instance ,
110
+ DMA : Instance + InstanceWaker ,
97
111
CH : ChannelRegs ,
98
- DmaChannelRef < DMA , CH , N > : ChannelRegs ,
112
+ Self : Deref < Target = CH > ,
99
113
{
100
114
#[ inline( always) ]
101
115
fn handle_interrupt ( ) {
@@ -105,6 +119,18 @@ where
105
119
}
106
120
}
107
121
122
+ impl < DMA , CH , const N : usize > ChannelWaker for DmaChannelRef < DMA , CH , N >
123
+ where
124
+ DMA : Instance + InstanceWaker ,
125
+ CH : ChannelRegs ,
126
+ Self : Deref < Target = CH > ,
127
+ {
128
+ #[ inline( always) ]
129
+ fn waker ( & self ) -> & ' static AtomicWaker {
130
+ DMA :: waker ( N )
131
+ }
132
+ }
133
+
108
134
macro_rules! gpdma_irq {
109
135
( $GPDMA: ident, $CH: literal) => {
110
136
paste:: item! {
@@ -125,17 +151,6 @@ pub(super) trait ChannelWaker {
125
151
fn waker ( & self ) -> & ' static AtomicWaker ;
126
152
}
127
153
128
- impl < DMA , CH , const N : usize > ChannelWaker for DmaChannelRef < DMA , CH , N >
129
- where
130
- DMA : Instance ,
131
- CH : ChannelRegs ,
132
- {
133
- #[ inline( always) ]
134
- fn waker ( & self ) -> & ' static AtomicWaker {
135
- DMA :: waker ( N )
136
- }
137
- }
138
-
139
154
mod gpdma1 {
140
155
use super :: * ;
141
156
0 commit comments