aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb
diff options
context:
space:
mode:
authorhuntc <[email protected]>2022-07-08 15:30:15 +1000
committerhuntc <[email protected]>2022-07-08 15:30:15 +1000
commit8d71a358c8fa0524fce564357d3d36f24be41353 (patch)
tree1359ae4f348c7f7d5af333ffb4608e96240abc6c /embassy-usb
parent4a8f117f2520df9d1919cbbac3d2840ea1539e04 (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.rs45
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))]
32pub enum UsbDeviceState { 32pub 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
350impl<'d, D: Driver<'d>> Inner<'d, D> { 337impl<'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 }