aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-11-06 03:38:42 +0100
committerDario Nieuwenhuis <[email protected]>2023-11-06 03:38:42 +0100
commitb4eef6b1ee5d1b92263ada437692fb7c9c3fe569 (patch)
tree853629a23e80157f79d95e4636f95efe06eb6a45
parent70a700e430b5258b77c678ba66dfb33977f3e7a8 (diff)
stm32/otg: fix CONTROL OUT transfers on F4.
-rw-r--r--embassy-stm32/src/usb_otg/usb.rs20
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 {