diff --git a/embassy-nrf/src/usb.rs b/embassy-nrf/src/usb.rs index 9155eb37..842abf16 100644 --- a/embassy-nrf/src/usb.rs +++ b/embassy-nrf/src/usb.rs @@ -616,6 +616,8 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> { type SetupFuture<'a> = impl Future + 'a where Self: 'a; type DataOutFuture<'a> = impl Future> + 'a where Self: 'a; type DataInFuture<'a> = impl Future> + 'a where Self: 'a; + type AcceptFuture<'a> = impl Future + 'a where Self: 'a; + type RejectFuture<'a> = impl Future + 'a where Self: 'a; fn max_packet_size(&self) -> usize { usize::from(self.max_packet_size) @@ -740,15 +742,19 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> { } } - fn accept(&mut self) { - let regs = T::regs(); - regs.tasks_ep0status - .write(|w| w.tasks_ep0status().bit(true)); + fn accept<'a>(&'a mut self) -> Self::AcceptFuture<'a> { + async move { + let regs = T::regs(); + regs.tasks_ep0status + .write(|w| w.tasks_ep0status().bit(true)); + } } - fn reject(&mut self) { - let regs = T::regs(); - regs.tasks_ep0stall.write(|w| w.tasks_ep0stall().bit(true)); + fn reject<'a>(&'a mut self) -> Self::RejectFuture<'a> { + async move { + let regs = T::regs(); + regs.tasks_ep0stall.write(|w| w.tasks_ep0stall().bit(true)); + } } } diff --git a/embassy-usb/src/driver.rs b/embassy-usb/src/driver.rs index 9cd4afda..0680df7a 100644 --- a/embassy-usb/src/driver.rs +++ b/embassy-usb/src/driver.rs @@ -142,6 +142,12 @@ pub trait ControlPipe { where Self: 'a; type DataInFuture<'a>: Future> + 'a + where + Self: 'a; + type AcceptFuture<'a>: Future + 'a + where + Self: 'a; + type RejectFuture<'a>: Future + 'a where Self: 'a; @@ -171,12 +177,12 @@ pub trait ControlPipe { /// Accepts a control request. /// /// Causes the STATUS packet for the current request to be ACKed. - fn accept(&mut self); + fn accept<'a>(&'a mut self) -> Self::AcceptFuture<'a>; /// Rejects a control request. /// /// Sets a STALL condition on the pipe to indicate an error. - fn reject(&mut self); + fn reject<'a>(&'a mut self) -> Self::RejectFuture<'a>; } pub trait EndpointIn: Endpoint { diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index 9101d81b..b691bf11 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs @@ -306,7 +306,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { } } } - InResponse::Rejected => self.control.reject(), + InResponse::Rejected => self.control.reject().await, } } @@ -337,8 +337,8 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { trace!(" control out data: {:02x?}", data); match self.inner.handle_control_out(req, data) { - OutResponse::Accepted => self.control.accept(), - OutResponse::Rejected => self.control.reject(), + OutResponse::Accepted => self.control.accept().await, + OutResponse::Rejected => self.control.reject().await, } } }