diff options
| author | huntc <[email protected]> | 2022-06-16 16:08:58 +1000 |
|---|---|---|
| committer | huntc <[email protected]> | 2022-07-07 10:08:57 +1000 |
| commit | 4a8f117f2520df9d1919cbbac3d2840ea1539e04 (patch) | |
| tree | 37312b498d3bce9e05a906a88e290063e4d610ca /embassy-usb/src/lib.rs | |
| parent | c46e9b6cfc1375f5e5e2bade8eb2174cc47c4a28 (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.rs | 20 |
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; | |||
| 11 | mod descriptor_reader; | 11 | mod descriptor_reader; |
| 12 | pub mod driver; | 12 | pub mod driver; |
| 13 | pub mod types; | 13 | pub mod types; |
| 14 | pub mod util; | ||
| 15 | 14 | ||
| 16 | use embassy::util::{select, Either}; | 15 | use embassy::util::{select, Either}; |
| 17 | use heapless::Vec; | 16 | use 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 | ||
