diff options
| -rw-r--r-- | embassy-nrf/src/usb.rs | 25 |
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 | ®s.epout0, | 529 | ®s.epout0, |
| 534 | ®s.epout1, | 530 | ®s.epout1, |
| @@ -639,7 +635,7 @@ pub struct ControlPipe<'d, T: Instance> { | |||
| 639 | } | 635 | } |
| 640 | 636 | ||
| 641 | impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> { | 637 | impl<'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(); |
