Skip to content

Commit d30b77d

Browse files
committed
Move wait_flags fn in i2c impl
1 parent 6bf9569 commit d30b77d

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

hal/src/sercom/i2c/async_api.rs

+33-25
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,38 @@ where
7474
pub type I2cFutureDma<C, I> =
7575
I2cFuture<C, crate::pac::Interrupt, crate::dmac::Channel<I, crate::dmac::ReadyFuture>>;
7676

77+
impl<C, N, S, D> I2cFuture<C, N, D>
78+
where
79+
C: AnyConfig<Sercom = S>,
80+
S: Sercom,
81+
N: InterruptNumber,
82+
{
83+
async fn wait_flags(&mut self, flags_to_wait: Flags) {
84+
core::future::poll_fn(|cx| {
85+
// Scope maybe_pending so we don't forget to re-poll the register later down.
86+
{
87+
let maybe_pending = self.i2c.config.as_ref().registers.read_flags();
88+
if flags_to_wait.intersects(maybe_pending) {
89+
return Poll::Ready(());
90+
}
91+
}
92+
93+
self.i2c.disable_interrupts(Flags::all());
94+
// By convention, I2C uses the sercom's RX waker.
95+
S::rx_waker().register(cx.waker());
96+
self.i2c.enable_interrupts(flags_to_wait);
97+
let maybe_pending = self.i2c.config.as_ref().registers.read_flags();
98+
99+
if !flags_to_wait.intersects(maybe_pending) {
100+
Poll::Pending
101+
} else {
102+
Poll::Ready(())
103+
}
104+
})
105+
.await;
106+
}
107+
}
108+
77109
impl<C, N, S> I2cFuture<C, N, NoneT>
78110
where
79111
C: AnyConfig<Sercom = S>,
@@ -167,31 +199,6 @@ where
167199
self.wait_flags(Flags::SB | Flags::ERROR).await;
168200
self.i2c.config.as_mut().registers.read_one()
169201
}
170-
171-
async fn wait_flags(&mut self, flags_to_wait: Flags) {
172-
core::future::poll_fn(|cx| {
173-
// Scope maybe_pending so we don't forget to re-poll the register later down.
174-
{
175-
let maybe_pending = self.i2c.config.as_ref().registers.read_flags();
176-
if flags_to_wait.intersects(maybe_pending) {
177-
return Poll::Ready(());
178-
}
179-
}
180-
181-
self.i2c.disable_interrupts(Flags::all());
182-
// By convention, I2C uses the sercom's RX waker.
183-
S::rx_waker().register(cx.waker());
184-
self.i2c.enable_interrupts(flags_to_wait);
185-
let maybe_pending = self.i2c.config.as_ref().registers.read_flags();
186-
187-
if !flags_to_wait.intersects(maybe_pending) {
188-
Poll::Pending
189-
} else {
190-
Poll::Ready(())
191-
}
192-
})
193-
.await;
194-
}
195202
}
196203

197204
// impl<C, N, D> Drop for I2cFuture<C, N, D>
@@ -416,6 +423,7 @@ mod dma {
416423
read_buf: &mut [u8],
417424
) -> Result<(), i2c::Error> {
418425
self.write(addr, write_buf).await?;
426+
// TODO may need some sort of delay here??
419427
self.read(addr, read_buf).await?;
420428
Ok(())
421429
}

0 commit comments

Comments
 (0)