diff options
Diffstat (limited to 'embassy-stm32')
| -rw-r--r-- | embassy-stm32/src/usb/usb.rs | 85 |
1 files changed, 43 insertions, 42 deletions
diff --git a/embassy-stm32/src/usb/usb.rs b/embassy-stm32/src/usb/usb.rs index 2367127e8..01b158b17 100644 --- a/embassy-stm32/src/usb/usb.rs +++ b/embassy-stm32/src/usb/usb.rs | |||
| @@ -480,56 +480,57 @@ impl<'d, T: Instance> driver::Bus for Bus<'d, T> { | |||
| 480 | poll_fn(move |cx| { | 480 | poll_fn(move |cx| { |
| 481 | BUS_WAKER.register(cx.waker()); | 481 | BUS_WAKER.register(cx.waker()); |
| 482 | 482 | ||
| 483 | if self.inited { | 483 | // TODO: implement VBUS detection. |
| 484 | let regs = T::regs(); | 484 | if !self.inited { |
| 485 | 485 | self.inited = true; | |
| 486 | if IRQ_RESUME.load(Ordering::Acquire) { | 486 | return Poll::Ready(Event::PowerDetected); |
| 487 | IRQ_RESUME.store(false, Ordering::Relaxed); | 487 | } |
| 488 | return Poll::Ready(Event::Resume); | ||
| 489 | } | ||
| 490 | 488 | ||
| 491 | if IRQ_RESET.load(Ordering::Acquire) { | 489 | let regs = T::regs(); |
| 492 | IRQ_RESET.store(false, Ordering::Relaxed); | ||
| 493 | |||
| 494 | trace!("RESET"); | ||
| 495 | regs.daddr().write(|w| { | ||
| 496 | w.set_ef(true); | ||
| 497 | w.set_add(0); | ||
| 498 | }); | ||
| 499 | |||
| 500 | regs.epr(0).write(|w| { | ||
| 501 | w.set_ep_type(EpType::CONTROL); | ||
| 502 | w.set_stat_rx(Stat::NAK); | ||
| 503 | w.set_stat_tx(Stat::NAK); | ||
| 504 | }); | ||
| 505 | |||
| 506 | for i in 1..EP_COUNT { | ||
| 507 | regs.epr(i).write(|w| { | ||
| 508 | w.set_ea(i as _); | ||
| 509 | w.set_ep_type(self.ep_types[i - 1]); | ||
| 510 | }) | ||
| 511 | } | ||
| 512 | 490 | ||
| 513 | for w in &EP_IN_WAKERS { | 491 | if IRQ_RESUME.load(Ordering::Acquire) { |
| 514 | w.wake() | 492 | IRQ_RESUME.store(false, Ordering::Relaxed); |
| 515 | } | 493 | return Poll::Ready(Event::Resume); |
| 516 | for w in &EP_OUT_WAKERS { | 494 | } |
| 517 | w.wake() | ||
| 518 | } | ||
| 519 | 495 | ||
| 520 | return Poll::Ready(Event::Reset); | 496 | if IRQ_RESET.load(Ordering::Acquire) { |
| 497 | IRQ_RESET.store(false, Ordering::Relaxed); | ||
| 498 | |||
| 499 | trace!("RESET"); | ||
| 500 | regs.daddr().write(|w| { | ||
| 501 | w.set_ef(true); | ||
| 502 | w.set_add(0); | ||
| 503 | }); | ||
| 504 | |||
| 505 | regs.epr(0).write(|w| { | ||
| 506 | w.set_ep_type(EpType::CONTROL); | ||
| 507 | w.set_stat_rx(Stat::NAK); | ||
| 508 | w.set_stat_tx(Stat::NAK); | ||
| 509 | }); | ||
| 510 | |||
| 511 | for i in 1..EP_COUNT { | ||
| 512 | regs.epr(i).write(|w| { | ||
| 513 | w.set_ea(i as _); | ||
| 514 | w.set_ep_type(self.ep_types[i - 1]); | ||
| 515 | }) | ||
| 521 | } | 516 | } |
| 522 | 517 | ||
| 523 | if IRQ_SUSPEND.load(Ordering::Acquire) { | 518 | for w in &EP_IN_WAKERS { |
| 524 | IRQ_SUSPEND.store(false, Ordering::Relaxed); | 519 | w.wake() |
| 525 | return Poll::Ready(Event::Suspend); | 520 | } |
| 521 | for w in &EP_OUT_WAKERS { | ||
| 522 | w.wake() | ||
| 526 | } | 523 | } |
| 527 | 524 | ||
| 528 | Poll::Pending | 525 | return Poll::Ready(Event::Reset); |
| 529 | } else { | 526 | } |
| 530 | self.inited = true; | 527 | |
| 531 | return Poll::Ready(Event::PowerDetected); | 528 | if IRQ_SUSPEND.load(Ordering::Acquire) { |
| 529 | IRQ_SUSPEND.store(false, Ordering::Relaxed); | ||
| 530 | return Poll::Ready(Event::Suspend); | ||
| 532 | } | 531 | } |
| 532 | |||
| 533 | Poll::Pending | ||
| 533 | }) | 534 | }) |
| 534 | .await | 535 | .await |
| 535 | } | 536 | } |
