aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32')
-rw-r--r--embassy-stm32/src/usb/usb.rs85
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 }