stm32/usb: add TODO: implement VBUS detection.
This commit is contained in:
parent
80407aa930
commit
5e6e18b310
1 changed files with 48 additions and 47 deletions
|
@ -480,56 +480,57 @@ impl<'d, T: Instance> driver::Bus for Bus<'d, T> {
|
||||||
poll_fn(move |cx| {
|
poll_fn(move |cx| {
|
||||||
BUS_WAKER.register(cx.waker());
|
BUS_WAKER.register(cx.waker());
|
||||||
|
|
||||||
if self.inited {
|
// TODO: implement VBUS detection.
|
||||||
let regs = T::regs();
|
if !self.inited {
|
||||||
|
|
||||||
if IRQ_RESUME.load(Ordering::Acquire) {
|
|
||||||
IRQ_RESUME.store(false, Ordering::Relaxed);
|
|
||||||
return Poll::Ready(Event::Resume);
|
|
||||||
}
|
|
||||||
|
|
||||||
if IRQ_RESET.load(Ordering::Acquire) {
|
|
||||||
IRQ_RESET.store(false, Ordering::Relaxed);
|
|
||||||
|
|
||||||
trace!("RESET");
|
|
||||||
regs.daddr().write(|w| {
|
|
||||||
w.set_ef(true);
|
|
||||||
w.set_add(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
regs.epr(0).write(|w| {
|
|
||||||
w.set_ep_type(EpType::CONTROL);
|
|
||||||
w.set_stat_rx(Stat::NAK);
|
|
||||||
w.set_stat_tx(Stat::NAK);
|
|
||||||
});
|
|
||||||
|
|
||||||
for i in 1..EP_COUNT {
|
|
||||||
regs.epr(i).write(|w| {
|
|
||||||
w.set_ea(i as _);
|
|
||||||
w.set_ep_type(self.ep_types[i - 1]);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
for w in &EP_IN_WAKERS {
|
|
||||||
w.wake()
|
|
||||||
}
|
|
||||||
for w in &EP_OUT_WAKERS {
|
|
||||||
w.wake()
|
|
||||||
}
|
|
||||||
|
|
||||||
return Poll::Ready(Event::Reset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if IRQ_SUSPEND.load(Ordering::Acquire) {
|
|
||||||
IRQ_SUSPEND.store(false, Ordering::Relaxed);
|
|
||||||
return Poll::Ready(Event::Suspend);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poll::Pending
|
|
||||||
} else {
|
|
||||||
self.inited = true;
|
self.inited = true;
|
||||||
return Poll::Ready(Event::PowerDetected);
|
return Poll::Ready(Event::PowerDetected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let regs = T::regs();
|
||||||
|
|
||||||
|
if IRQ_RESUME.load(Ordering::Acquire) {
|
||||||
|
IRQ_RESUME.store(false, Ordering::Relaxed);
|
||||||
|
return Poll::Ready(Event::Resume);
|
||||||
|
}
|
||||||
|
|
||||||
|
if IRQ_RESET.load(Ordering::Acquire) {
|
||||||
|
IRQ_RESET.store(false, Ordering::Relaxed);
|
||||||
|
|
||||||
|
trace!("RESET");
|
||||||
|
regs.daddr().write(|w| {
|
||||||
|
w.set_ef(true);
|
||||||
|
w.set_add(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
regs.epr(0).write(|w| {
|
||||||
|
w.set_ep_type(EpType::CONTROL);
|
||||||
|
w.set_stat_rx(Stat::NAK);
|
||||||
|
w.set_stat_tx(Stat::NAK);
|
||||||
|
});
|
||||||
|
|
||||||
|
for i in 1..EP_COUNT {
|
||||||
|
regs.epr(i).write(|w| {
|
||||||
|
w.set_ea(i as _);
|
||||||
|
w.set_ep_type(self.ep_types[i - 1]);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
for w in &EP_IN_WAKERS {
|
||||||
|
w.wake()
|
||||||
|
}
|
||||||
|
for w in &EP_OUT_WAKERS {
|
||||||
|
w.wake()
|
||||||
|
}
|
||||||
|
|
||||||
|
return Poll::Ready(Event::Reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if IRQ_SUSPEND.load(Ordering::Acquire) {
|
||||||
|
IRQ_SUSPEND.store(false, Ordering::Relaxed);
|
||||||
|
return Poll::Ready(Event::Suspend);
|
||||||
|
}
|
||||||
|
|
||||||
|
Poll::Pending
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue