diff options
| -rw-r--r-- | embassy-stm32/src/usb_otg/usb.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/embassy-stm32/src/usb_otg/usb.rs b/embassy-stm32/src/usb_otg/usb.rs index 26a14ff0a..d90f83433 100644 --- a/embassy-stm32/src/usb_otg/usb.rs +++ b/embassy-stm32/src/usb_otg/usb.rs | |||
| @@ -40,6 +40,7 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 40 | // Handle RX | 40 | // Handle RX |
| 41 | while r.gintsts().read().rxflvl() { | 41 | while r.gintsts().read().rxflvl() { |
| 42 | let status = r.grxstsp().read(); | 42 | let status = r.grxstsp().read(); |
| 43 | trace!("=== status {:08x}", status.0); | ||
| 43 | let ep_num = status.epnum() as usize; | 44 | let ep_num = status.epnum() as usize; |
| 44 | let len = status.bcnt() as usize; | 45 | let len = status.bcnt() as usize; |
| 45 | 46 | ||
| @@ -51,6 +52,15 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 51 | assert!(len == 8, "invalid SETUP packet length={}", len); | 52 | assert!(len == 8, "invalid SETUP packet length={}", len); |
| 52 | assert!(ep_num == 0, "invalid SETUP packet endpoint={}", ep_num); | 53 | assert!(ep_num == 0, "invalid SETUP packet endpoint={}", ep_num); |
| 53 | 54 | ||
| 55 | // flushing TX if something stuck in control endpoint | ||
| 56 | if r.dieptsiz(ep_num).read().pktcnt() != 0 { | ||
| 57 | r.grstctl().modify(|w| { | ||
| 58 | w.set_txfnum(ep_num as _); | ||
| 59 | w.set_txfflsh(true); | ||
| 60 | }); | ||
| 61 | while r.grstctl().read().txfflsh() {} | ||
| 62 | } | ||
| 63 | |||
| 54 | if state.ep0_setup_ready.load(Ordering::Relaxed) == false { | 64 | if state.ep0_setup_ready.load(Ordering::Relaxed) == false { |
| 55 | // SAFETY: exclusive access ensured by atomic bool | 65 | // SAFETY: exclusive access ensured by atomic bool |
| 56 | let data = unsafe { &mut *state.ep0_setup_data.get() }; | 66 | let data = unsafe { &mut *state.ep0_setup_data.get() }; |
| @@ -96,6 +106,11 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 96 | } | 106 | } |
| 97 | vals::Pktstsd::SETUP_DATA_DONE => { | 107 | vals::Pktstsd::SETUP_DATA_DONE => { |
| 98 | trace!("SETUP_DATA_DONE ep={}", ep_num); | 108 | trace!("SETUP_DATA_DONE ep={}", ep_num); |
| 109 | |||
| 110 | // Clear NAK to indicate we are ready to receive more data | ||
| 111 | T::regs().doepctl(ep_num).modify(|w| { | ||
| 112 | w.set_cnak(true); | ||
| 113 | }); | ||
| 99 | } | 114 | } |
| 100 | x => trace!("unknown PKTSTS: {}", x.to_bits()), | 115 | x => trace!("unknown PKTSTS: {}", x.to_bits()), |
| 101 | } | 116 | } |
| @@ -1312,11 +1327,6 @@ impl<'d, T: Instance> embassy_usb_driver::ControlPipe for ControlPipe<'d, T> { | |||
| 1312 | w.set_rxdpid_stupcnt(1); | 1327 | w.set_rxdpid_stupcnt(1); |
| 1313 | }); | 1328 | }); |
| 1314 | 1329 | ||
| 1315 | // Clear NAK to indicate we are ready to receive more data | ||
| 1316 | T::regs().doepctl(self.ep_out.info.addr.index()).modify(|w| { | ||
| 1317 | w.set_cnak(true); | ||
| 1318 | }); | ||
| 1319 | |||
| 1320 | trace!("SETUP received: {:?}", data); | 1330 | trace!("SETUP received: {:?}", data); |
| 1321 | Poll::Ready(data) | 1331 | Poll::Ready(data) |
| 1322 | } else { | 1332 | } else { |
