aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb/src/lib.rs
diff options
context:
space:
mode:
authorhuntc <[email protected]>2022-06-16 16:08:58 +1000
committerhuntc <[email protected]>2022-07-07 10:08:57 +1000
commit4a8f117f2520df9d1919cbbac3d2840ea1539e04 (patch)
tree37312b498d3bce9e05a906a88e290063e4d610ca /embassy-usb/src/lib.rs
parentc46e9b6cfc1375f5e5e2bade8eb2174cc47c4a28 (diff)
Puts in the machinery to handle power detected/removed
Diffstat (limited to 'embassy-usb/src/lib.rs')
-rw-r--r--embassy-usb/src/lib.rs20
1 files changed, 17 insertions, 3 deletions
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs
index eba46b892..af102e589 100644
--- a/embassy-usb/src/lib.rs
+++ b/embassy-usb/src/lib.rs
@@ -11,7 +11,6 @@ pub mod descriptor;
11mod descriptor_reader; 11mod descriptor_reader;
12pub mod driver; 12pub mod driver;
13pub mod types; 13pub mod types;
14pub mod util;
15 14
16use embassy::util::{select, Either}; 15use embassy::util::{select, Either};
17use heapless::Vec; 16use heapless::Vec;
@@ -115,6 +114,7 @@ struct Inner<'d, D: Driver<'d>> {
115 114
116 device_state: UsbDeviceState, 115 device_state: UsbDeviceState,
117 suspended: bool, 116 suspended: bool,
117 power_available: bool,
118 remote_wakeup_enabled: bool, 118 remote_wakeup_enabled: bool,
119 self_powered: bool, 119 self_powered: bool,
120 120
@@ -157,6 +157,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
157 157
158 device_state: UsbDeviceState::Disabled, 158 device_state: UsbDeviceState::Disabled,
159 suspended: false, 159 suspended: false,
160 power_available: false,
160 remote_wakeup_enabled: false, 161 remote_wakeup_enabled: false,
161 self_powered: false, 162 self_powered: false,
162 address: 0, 163 address: 0,
@@ -186,6 +187,11 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
186 /// before calling any other `UsbDevice` methods to fully reset the 187 /// before calling any other `UsbDevice` methods to fully reset the
187 /// peripheral. 188 /// peripheral.
188 pub async fn run_until_suspend(&mut self) -> () { 189 pub async fn run_until_suspend(&mut self) -> () {
190 while !self.inner.power_available {
191 let evt = self.inner.bus.poll().await;
192 self.inner.handle_bus_event(evt);
193 }
194
189 if self.inner.device_state == UsbDeviceState::Disabled { 195 if self.inner.device_state == UsbDeviceState::Disabled {
190 self.inner.bus.enable().await; 196 self.inner.bus.enable().await;
191 self.inner.device_state = UsbDeviceState::Default; 197 self.inner.device_state = UsbDeviceState::Default;
@@ -195,7 +201,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
195 } 201 }
196 } 202 }
197 203
198 while !self.inner.suspended { 204 while !self.inner.suspended && self.inner.power_available {
199 let control_fut = self.control.setup(); 205 let control_fut = self.control.setup();
200 let bus_fut = self.inner.bus.poll(); 206 let bus_fut = self.inner.bus.poll();
201 match select(bus_fut, control_fut).await { 207 match select(bus_fut, control_fut).await {
@@ -223,7 +229,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
223 /// 229 ///
224 /// This future is cancel-safe. 230 /// This future is cancel-safe.
225 pub async fn wait_resume(&mut self) { 231 pub async fn wait_resume(&mut self) {
226 while self.inner.suspended { 232 while self.inner.suspended || !self.inner.power_available {
227 let evt = self.inner.bus.poll().await; 233 let evt = self.inner.bus.poll().await;
228 self.inner.handle_bus_event(evt); 234 self.inner.handle_bus_event(evt);
229 } 235 }
@@ -377,6 +383,14 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
377 h.suspended(true); 383 h.suspended(true);
378 } 384 }
379 } 385 }
386 Event::PowerDetected => {
387 trace!("usb: power detected");
388 self.power_available = true;
389 }
390 Event::PowerRemoved => {
391 trace!("usb: power removed");
392 self.power_available = false;
393 }
380 } 394 }
381 } 395 }
382 396