stm32/i2c: ignore wakes without interrupt
This commit is contained in:
parent
f5216624bb
commit
64b80c2e4d
1 changed files with 9 additions and 0 deletions
|
@ -485,6 +485,7 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
|
||||||
poll_fn(|cx| {
|
poll_fn(|cx| {
|
||||||
state.waker.register(cx.waker());
|
state.waker.register(cx.waker());
|
||||||
|
|
||||||
|
let isr = unsafe { T::regs().isr().read() };
|
||||||
if remaining_len == total_len {
|
if remaining_len == total_len {
|
||||||
// NOTE(unsafe) self.tx_dma does not fiddle with the i2c registers
|
// NOTE(unsafe) self.tx_dma does not fiddle with the i2c registers
|
||||||
if first_slice {
|
if first_slice {
|
||||||
|
@ -503,6 +504,9 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
|
||||||
T::regs().cr1().modify(|w| w.set_tcie(true));
|
T::regs().cr1().modify(|w| w.set_tcie(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if !(isr.tcr() || isr.tc()) {
|
||||||
|
// poll_fn was woken without an interrupt present
|
||||||
|
return Poll::Pending;
|
||||||
} else if remaining_len == 0 {
|
} else if remaining_len == 0 {
|
||||||
return Poll::Ready(Ok(()));
|
return Poll::Ready(Ok(()));
|
||||||
} else {
|
} else {
|
||||||
|
@ -575,6 +579,8 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
|
||||||
|
|
||||||
poll_fn(|cx| {
|
poll_fn(|cx| {
|
||||||
state.waker.register(cx.waker());
|
state.waker.register(cx.waker());
|
||||||
|
|
||||||
|
let isr = unsafe { T::regs().isr().read() };
|
||||||
if remaining_len == total_len {
|
if remaining_len == total_len {
|
||||||
// NOTE(unsafe) self.rx_dma does not fiddle with the i2c registers
|
// NOTE(unsafe) self.rx_dma does not fiddle with the i2c registers
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -587,6 +593,9 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
|
||||||
&check_timeout,
|
&check_timeout,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
} else if !(isr.tcr() || isr.tc()) {
|
||||||
|
// poll_fn was woken without an interrupt present
|
||||||
|
return Poll::Pending;
|
||||||
} else if remaining_len == 0 {
|
} else if remaining_len == 0 {
|
||||||
return Poll::Ready(Ok(()));
|
return Poll::Ready(Ok(()));
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue