diff options
| author | huntc <[email protected]> | 2022-07-08 15:30:15 +1000 |
|---|---|---|
| committer | huntc <[email protected]> | 2022-07-08 15:30:15 +1000 |
| commit | 8d71a358c8fa0524fce564357d3d36f24be41353 (patch) | |
| tree | 1359ae4f348c7f7d5af333ffb4608e96240abc6c /embassy-usb | |
| parent | 4a8f117f2520df9d1919cbbac3d2840ea1539e04 (diff) | |
Build in a new Unpowered state
Replaces the sub-state of representing being being available. Power states also now set enable/disable directly too, which simplifies code.
Diffstat (limited to 'embassy-usb')
| -rw-r--r-- | embassy-usb/src/lib.rs | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index af102e589..82ff4e32f 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs | |||
| @@ -30,6 +30,9 @@ use crate::driver::ControlPipe; | |||
| 30 | #[derive(PartialEq, Eq, Copy, Clone, Debug)] | 30 | #[derive(PartialEq, Eq, Copy, Clone, Debug)] |
| 31 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 31 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 32 | pub enum UsbDeviceState { | 32 | pub enum UsbDeviceState { |
| 33 | /// The USB device has no power. | ||
| 34 | Unpowered, | ||
| 35 | |||
| 33 | /// The USB device is disabled. | 36 | /// The USB device is disabled. |
| 34 | Disabled, | 37 | Disabled, |
| 35 | 38 | ||
| @@ -114,7 +117,6 @@ struct Inner<'d, D: Driver<'d>> { | |||
| 114 | 117 | ||
| 115 | device_state: UsbDeviceState, | 118 | device_state: UsbDeviceState, |
| 116 | suspended: bool, | 119 | suspended: bool, |
| 117 | power_available: bool, | ||
| 118 | remote_wakeup_enabled: bool, | 120 | remote_wakeup_enabled: bool, |
| 119 | self_powered: bool, | 121 | self_powered: bool, |
| 120 | 122 | ||
| @@ -155,9 +157,8 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 155 | config_descriptor, | 157 | config_descriptor, |
| 156 | bos_descriptor, | 158 | bos_descriptor, |
| 157 | 159 | ||
| 158 | device_state: UsbDeviceState::Disabled, | 160 | device_state: UsbDeviceState::Unpowered, |
| 159 | suspended: false, | 161 | suspended: false, |
| 160 | power_available: false, | ||
| 161 | remote_wakeup_enabled: false, | 162 | remote_wakeup_enabled: false, |
| 162 | self_powered: false, | 163 | self_powered: false, |
| 163 | address: 0, | 164 | address: 0, |
| @@ -187,25 +188,11 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 187 | /// before calling any other `UsbDevice` methods to fully reset the | 188 | /// before calling any other `UsbDevice` methods to fully reset the |
| 188 | /// peripheral. | 189 | /// peripheral. |
| 189 | pub async fn run_until_suspend(&mut self) -> () { | 190 | pub async fn run_until_suspend(&mut self) -> () { |
| 190 | while !self.inner.power_available { | 191 | while !self.inner.suspended { |
| 191 | let evt = self.inner.bus.poll().await; | ||
| 192 | self.inner.handle_bus_event(evt); | ||
| 193 | } | ||
| 194 | |||
| 195 | if self.inner.device_state == UsbDeviceState::Disabled { | ||
| 196 | self.inner.bus.enable().await; | ||
| 197 | self.inner.device_state = UsbDeviceState::Default; | ||
| 198 | |||
| 199 | if let Some(h) = &self.inner.handler { | ||
| 200 | h.enabled(true); | ||
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | while !self.inner.suspended && self.inner.power_available { | ||
| 205 | let control_fut = self.control.setup(); | 192 | let control_fut = self.control.setup(); |
| 206 | let bus_fut = self.inner.bus.poll(); | 193 | let bus_fut = self.inner.bus.poll(); |
| 207 | match select(bus_fut, control_fut).await { | 194 | match select(bus_fut, control_fut).await { |
| 208 | Either::First(evt) => self.inner.handle_bus_event(evt), | 195 | Either::First(evt) => self.inner.handle_bus_event(evt).await, |
| 209 | Either::Second(req) => self.handle_control(req).await, | 196 | Either::Second(req) => self.handle_control(req).await, |
| 210 | } | 197 | } |
| 211 | } | 198 | } |
| @@ -229,9 +216,9 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 229 | /// | 216 | /// |
| 230 | /// This future is cancel-safe. | 217 | /// This future is cancel-safe. |
| 231 | pub async fn wait_resume(&mut self) { | 218 | pub async fn wait_resume(&mut self) { |
| 232 | while self.inner.suspended || !self.inner.power_available { | 219 | while self.inner.suspended { |
| 233 | let evt = self.inner.bus.poll().await; | 220 | let evt = self.inner.bus.poll().await; |
| 234 | self.inner.handle_bus_event(evt); | 221 | self.inner.handle_bus_event(evt).await; |
| 235 | } | 222 | } |
| 236 | } | 223 | } |
| 237 | 224 | ||
| @@ -348,7 +335,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 348 | } | 335 | } |
| 349 | 336 | ||
| 350 | impl<'d, D: Driver<'d>> Inner<'d, D> { | 337 | impl<'d, D: Driver<'d>> Inner<'d, D> { |
| 351 | fn handle_bus_event(&mut self, evt: Event) { | 338 | async fn handle_bus_event(&mut self, evt: Event) { |
| 352 | match evt { | 339 | match evt { |
| 353 | Event::Reset => { | 340 | Event::Reset => { |
| 354 | trace!("usb: reset"); | 341 | trace!("usb: reset"); |
| @@ -385,11 +372,21 @@ impl<'d, D: Driver<'d>> Inner<'d, D> { | |||
| 385 | } | 372 | } |
| 386 | Event::PowerDetected => { | 373 | Event::PowerDetected => { |
| 387 | trace!("usb: power detected"); | 374 | trace!("usb: power detected"); |
| 388 | self.power_available = true; | 375 | self.bus.enable().await; |
| 376 | self.device_state = UsbDeviceState::Default; | ||
| 377 | |||
| 378 | if let Some(h) = &self.handler { | ||
| 379 | h.enabled(true); | ||
| 380 | } | ||
| 389 | } | 381 | } |
| 390 | Event::PowerRemoved => { | 382 | Event::PowerRemoved => { |
| 391 | trace!("usb: power removed"); | 383 | trace!("usb: power removed"); |
| 392 | self.power_available = false; | 384 | self.bus.disable().await; |
| 385 | self.device_state = UsbDeviceState::Unpowered; | ||
| 386 | |||
| 387 | if let Some(h) = &self.handler { | ||
| 388 | h.enabled(false); | ||
| 389 | } | ||
| 393 | } | 390 | } |
| 394 | } | 391 | } |
| 395 | } | 392 | } |
