Skip to content

Commit c38d437

Browse files
committed
gpdma: make wakers accessible from DmaChannelImpl
1 parent 053fa02 commit c38d437

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

src/gpdma.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ use config::{
102102
PeripheralSource, PeripheralToMemory, PeripheralToPeripheral,
103103
PeripheralToPeripheralDirection, TransferDirection, TransferType,
104104
};
105+
use future::InstanceWaker;
105106

106107
/// Supported word types for the STM32H5 GPDMA implementation.
107108
///
@@ -146,7 +147,10 @@ impl<DMA: Instance> GpdmaExt<DMA> for DMA {
146147
}
147148
}
148149

149-
pub trait Instance: Sealed + Deref<Target = gpdma1::RegisterBlock> {
150+
#[allow(private_bounds)]
151+
pub trait Instance:
152+
Sealed + InstanceWaker + Deref<Target = gpdma1::RegisterBlock>
153+
{
150154
type Rec: ResetEnable;
151155

152156
fn ptr() -> *const gpdma1::RegisterBlock;

src/gpdma/ch.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use core::{marker::PhantomData, ops::Deref};
22

3+
use futures_util::task::AtomicWaker;
4+
35
use crate::stm32::gpdma1::{
46
self,
57
ch::{CR, DAR, FCR, LBAR, SAR, SR, TR1, TR2},
@@ -12,6 +14,7 @@ use super::{
1214
AddressingMode, AhbPort, HardwareRequest, PeripheralRequest,
1315
PeripheralSource, Priority, TransferDirection, TransferType,
1416
},
17+
future::ChannelWaker,
1518
DmaConfig, Error, Instance, Word,
1619
};
1720

@@ -536,6 +539,8 @@ pub(super) trait Channel {
536539
/// Disable transfer interrupts for the channel. It is expected that this will be called from
537540
/// an interrupt handler after a transfer is completed.
538541
fn disable_transfer_interrupts(&self);
542+
543+
fn waker(&self) -> &'static AtomicWaker;
539544
}
540545

541546
impl<DMA, CH, const N: usize> Channel for DmaChannelRef<DMA, CH, N>
@@ -739,6 +744,10 @@ where
739744
w.tcie().disabled().dteie().disabled().useie().disabled()
740745
});
741746
}
747+
748+
fn waker(&self) -> &'static AtomicWaker {
749+
self.ch.waker()
750+
}
742751
}
743752

744753
/// DmaChannel trait provides the API contract that all GPDMA channels exposed to the user

src/gpdma/future.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ use super::{
2020
};
2121

2222
#[allow(private_bounds)]
23-
impl<'a, CH: DmaChannel + ChannelWaker> IntoFuture for DmaTransfer<'a, CH> {
23+
impl<'a, CH: DmaChannel> IntoFuture for DmaTransfer<'a, CH> {
2424
type Output = Result<(), Error>;
2525
type IntoFuture = DmaTransferFuture<'a, CH>;
26-
26+
2727
fn into_future(self) -> DmaTransferFuture<'a, CH> {
2828
DmaTransferFuture { transfer: self }
2929
}
@@ -73,7 +73,7 @@ impl<'a, CH: DmaChannel> Unpin for DmaTransferFuture<'a, CH> {}
7373

7474
impl<'a, CH> Future for DmaTransferFuture<'a, CH>
7575
where
76-
CH: DmaChannel + ChannelWaker,
76+
CH: DmaChannel,
7777
{
7878
type Output = Result<(), Error>;
7979

@@ -92,7 +92,6 @@ impl<DMA, CH, const N: usize> DmaChannelImpl<DmaChannelRef<DMA, CH, N>>
9292
where
9393
DMA: Instance,
9494
CH: ChannelRegs,
95-
Self: ChannelWaker,
9695
DmaChannelRef<DMA, CH, N>: ChannelRegs,
9796
{
9897
#[inline(always)]
@@ -114,21 +113,36 @@ macro_rules! gpdma_irq {
114113
};
115114
}
116115

117-
trait ChannelWaker {
116+
pub(super) trait InstanceWaker {
117+
fn waker(idx: usize) -> &'static AtomicWaker;
118+
}
119+
120+
pub(super) trait ChannelWaker {
121+
/// Returns a reference to the AtomicWaker for the channel.
118122
fn waker(&self) -> &'static AtomicWaker;
119123
}
120124

125+
impl<DMA, CH, const N: usize> ChannelWaker for DmaChannelRef<DMA, CH, N>
126+
where
127+
DMA: Instance,
128+
CH: ChannelRegs,
129+
{
130+
#[inline(always)]
131+
fn waker(&self) -> &'static AtomicWaker {
132+
DMA::waker(N)
133+
}
134+
}
135+
121136
mod gpdma1 {
122137
use super::*;
123138

124139
static WAKERS_GPDMA1: [AtomicWaker; 8] = [const { AtomicWaker::new() }; 8];
125140

126141
#[allow(private_bounds)]
127-
impl<CH: ChannelRegs, const N: usize> ChannelWaker
128-
for DmaChannelImpl<DmaChannelRef<GPDMA1, CH, N>>
129-
{
130-
fn waker(&self) -> &'static AtomicWaker {
131-
&WAKERS_GPDMA1[N]
142+
impl InstanceWaker for GPDMA1 {
143+
#[inline(always)]
144+
fn waker(idx: usize) -> &'static AtomicWaker {
145+
&WAKERS_GPDMA1[idx]
132146
}
133147
}
134148

@@ -148,11 +162,10 @@ mod gpdma2 {
148162
static WAKERS_GPDMA2: [AtomicWaker; 8] = [const { AtomicWaker::new() }; 8];
149163

150164
#[allow(private_bounds)]
151-
impl<CH: ChannelRegs, const N: usize> ChannelWaker
152-
for DmaChannelImpl<DmaChannelRef<GPDMA2, CH, N>>
153-
{
154-
fn waker(&self) -> &'static AtomicWaker {
155-
&WAKERS_GPDMA2[N]
165+
impl InstanceWaker for GPDMA2 {
166+
#[inline(always)]
167+
fn waker(idx: usize) -> &'static AtomicWaker {
168+
&WAKERS_GPDMA2[idx]
156169
}
157170
}
158171

0 commit comments

Comments
 (0)