aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/usb.rs25
1 files changed, 11 insertions, 14 deletions
diff --git a/embassy-nrf/src/usb.rs b/embassy-nrf/src/usb.rs
index 9dedc471e..8d589aeda 100644
--- a/embassy-nrf/src/usb.rs
+++ b/embassy-nrf/src/usb.rs
@@ -525,10 +525,6 @@ unsafe fn read_dma<T: Instance>(i: usize, buf: &mut [u8]) -> Result<usize, Endpo
525 return Err(EndpointError::BufferOverflow); 525 return Err(EndpointError::BufferOverflow);
526 } 526 }
527 527
528 if i == 0 {
529 regs.events_ep0datadone.reset();
530 }
531
532 let epout = [ 528 let epout = [
533 &regs.epout0, 529 &regs.epout0,
534 &regs.epout1, 530 &regs.epout1,
@@ -639,7 +635,7 @@ pub struct ControlPipe<'d, T: Instance> {
639} 635}
640 636
641impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> { 637impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
642 type SetupFuture<'a> = impl Future<Output = Request> + 'a where Self: 'a; 638 type SetupFuture<'a> = impl Future<Output = [u8;8]> + 'a where Self: 'a;
643 type DataOutFuture<'a> = impl Future<Output = Result<usize, EndpointError>> + 'a where Self: 'a; 639 type DataOutFuture<'a> = impl Future<Output = Result<usize, EndpointError>> + 'a where Self: 'a;
644 type DataInFuture<'a> = impl Future<Output = Result<(), EndpointError>> + 'a where Self: 'a; 640 type DataInFuture<'a> = impl Future<Output = Result<(), EndpointError>> + 'a where Self: 'a;
645 641
@@ -651,11 +647,11 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
651 async move { 647 async move {
652 let regs = T::regs(); 648 let regs = T::regs();
653 649
650 // Reset shorts
651 regs.shorts.write(|w| w);
652
654 // Wait for SETUP packet 653 // Wait for SETUP packet
655 regs.intenset.write(|w| { 654 regs.intenset.write(|w| w.ep0setup().set());
656 w.ep0setup().set();
657 w.ep0datadone().set()
658 });
659 poll_fn(|cx| { 655 poll_fn(|cx| {
660 EP0_WAKER.register(cx.waker()); 656 EP0_WAKER.register(cx.waker());
661 let regs = T::regs(); 657 let regs = T::regs();
@@ -667,8 +663,6 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
667 }) 663 })
668 .await; 664 .await;
669 665
670 // Reset shorts
671 regs.shorts.write(|w| w);
672 regs.events_ep0setup.reset(); 666 regs.events_ep0setup.reset();
673 667
674 let mut buf = [0; 8]; 668 let mut buf = [0; 8];
@@ -689,6 +683,9 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
689 async move { 683 async move {
690 let regs = T::regs(); 684 let regs = T::regs();
691 685
686 regs.events_ep0datadone.reset();
687
688 // This starts a RX on EP0. events_ep0datadone notifies when done.
692 regs.tasks_ep0rcvout 689 regs.tasks_ep0rcvout
693 .write(|w| w.tasks_ep0rcvout().set_bit()); 690 .write(|w| w.tasks_ep0rcvout().set_bit());
694 691
@@ -723,13 +720,13 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
723 async move { 720 async move {
724 let regs = T::regs(); 721 let regs = T::regs();
725 regs.events_ep0datadone.reset(); 722 regs.events_ep0datadone.reset();
726 unsafe {
727 write_dma::<T>(0, buf);
728 }
729 723
730 regs.shorts 724 regs.shorts
731 .write(|w| w.ep0datadone_ep0status().bit(last_packet)); 725 .write(|w| w.ep0datadone_ep0status().bit(last_packet));
732 726
727 // This starts a TX on EP0. events_ep0datadone notifies when done.
728 unsafe { write_dma::<T>(0, buf) }
729
733 regs.intenset.write(|w| { 730 regs.intenset.write(|w| {
734 w.usbreset().set(); 731 w.usbreset().set();
735 w.ep0setup().set(); 732 w.ep0setup().set();