Add suspend, resume and remote wakeup support.

This commit is contained in:
Wilfried Chauveau 2022-07-30 20:31:13 +01:00
parent 6e325ba099
commit 5dd095bd45
No known key found for this signature in database
GPG key ID: 0BC4C0B2B0879D6A

View file

@ -402,6 +402,14 @@ impl UsbBus {
inner: Mutex::new(RefCell::new(Inner::new(ctrl_reg, ctrl_dpram))),
}
}
/// Generates a resume request on the bus.
pub fn remote_wakeup(&self) {
interrupt::free(|cs| {
let inner = self.inner.borrow(cs).borrow_mut();
inner.ctrl_reg.sie_ctrl.modify(|_, w| w.resume().set_bit());
});
}
}
impl UsbBusTrait for UsbBus {
@ -434,6 +442,10 @@ impl UsbBusTrait for UsbBus {
.set_bit()
.bus_reset()
.set_bit()
.dev_resume_from_host()
.set_bit()
.dev_suspend()
.set_bit()
.setup_req()
.set_bit()
});
@ -518,21 +530,35 @@ impl UsbBusTrait for UsbBus {
})
}
fn suspend(&self) {
todo!()
interrupt::free(|cs| {
let inner = self.inner.borrow(cs).borrow_mut();
inner
.ctrl_reg
.sie_status
.modify(|_, w| w.suspended().set_bit());
});
}
fn resume(&self) {
todo!()
interrupt::free(|cs| {
let inner = self.inner.borrow(cs).borrow_mut();
inner
.ctrl_reg
.sie_status
.modify(|_, w| w.resume().set_bit());
});
}
fn poll(&self) -> PollResult {
interrupt::free(|cs| {
let mut inner = self.inner.borrow(cs).borrow_mut();
// TODO: check for suspend request
// TODO: check for resume request
// check for bus reset
let sie_status = inner.ctrl_reg.sie_status.read();
if sie_status.bus_reset().bit_is_set() {
return PollResult::Reset;
} else if sie_status.suspended().bit_is_set() {
return PollResult::Suspend;
} else if sie_status.resume().bit_is_set() {
return PollResult::Resume;
}
let (mut ep_out, mut ep_in_complete, mut ep_setup): (u16, u16, u16) = (0, 0, 0);