diff options
| author | alexmoon <[email protected]> | 2022-04-11 12:00:05 -0400 |
|---|---|---|
| committer | alexmoon <[email protected]> | 2022-04-13 14:55:02 -0400 |
| commit | 7fde3abd5d7e04f6d79d325d4454d6eafabebc1f (patch) | |
| tree | 2297c1a4e9eda113df7e0c1a99c8332c3836855e | |
| parent | 3a30b08936e49c48b7e90e183a402d91ba829021 (diff) | |
Remote wakeup bug fixes
| -rw-r--r-- | embassy-usb/src/lib.rs | 30 | ||||
| -rw-r--r-- | examples/nrf/src/bin/usb_hid_keyboard.rs | 24 |
2 files changed, 30 insertions, 24 deletions
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index 2c53d9214..210908c2c 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs | |||
| @@ -171,21 +171,21 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 171 | h.reset(); | 171 | h.reset(); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | if let Some(h) = &mut self.handler { | 174 | if let Some(h) = &self.handler { |
| 175 | h.reset(); | 175 | h.reset(); |
| 176 | } | 176 | } |
| 177 | } | 177 | } |
| 178 | Event::Resume => { | 178 | Event::Resume => { |
| 179 | trace!("usb: resume"); | 179 | trace!("usb: resume"); |
| 180 | self.suspended = false; | 180 | self.suspended = false; |
| 181 | if let Some(h) = &mut self.handler { | 181 | if let Some(h) = &self.handler { |
| 182 | h.suspended(false); | 182 | h.suspended(false); |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | Event::Suspend => { | 185 | Event::Suspend => { |
| 186 | trace!("usb: suspend"); | 186 | trace!("usb: suspend"); |
| 187 | self.suspended = true; | 187 | self.suspended = true; |
| 188 | if let Some(h) = &mut self.handler { | 188 | if let Some(h) = &self.handler { |
| 189 | h.suspended(true); | 189 | h.suspended(true); |
| 190 | } | 190 | } |
| 191 | } | 191 | } |
| @@ -200,19 +200,25 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 200 | trace!("usb: disable"); | 200 | trace!("usb: disable"); |
| 201 | self.bus.disable(); | 201 | self.bus.disable(); |
| 202 | self.device_state = UsbDeviceState::Disabled; | 202 | self.device_state = UsbDeviceState::Disabled; |
| 203 | if let Some(h) = &mut self.handler { | 203 | if let Some(h) = &self.handler { |
| 204 | h.disabled(); | 204 | h.disabled(); |
| 205 | } | 205 | } |
| 206 | self.wait_for_enable().await; | 206 | self.wait_for_enable().await; |
| 207 | } | 207 | } |
| 208 | DeviceCommand::RemoteWakeup => { | 208 | DeviceCommand::RemoteWakeup => { |
| 209 | if self.remote_wakeup_enabled { | 209 | trace!("usb: remote wakeup"); |
| 210 | if self.suspended && self.remote_wakeup_enabled { | ||
| 210 | match self.bus.remote_wakeup().await { | 211 | match self.bus.remote_wakeup().await { |
| 211 | Ok(()) => (), | 212 | Ok(()) => { |
| 213 | self.suspended = false; | ||
| 214 | if let Some(h) = &self.handler { | ||
| 215 | h.suspended(false); | ||
| 216 | } | ||
| 217 | } | ||
| 212 | Err(Unsupported) => warn!("Remote wakeup is unsupported!"), | 218 | Err(Unsupported) => warn!("Remote wakeup is unsupported!"), |
| 213 | } | 219 | } |
| 214 | } else { | 220 | } else { |
| 215 | warn!("Remote wakeup not enabled."); | 221 | warn!("Remote wakeup requested when not enabled or not suspended."); |
| 216 | } | 222 | } |
| 217 | } | 223 | } |
| 218 | }, | 224 | }, |
| @@ -250,14 +256,14 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 250 | (RequestType::Standard, Recipient::Device) => match (req.request, req.value) { | 256 | (RequestType::Standard, Recipient::Device) => match (req.request, req.value) { |
| 251 | (Request::CLEAR_FEATURE, Request::FEATURE_DEVICE_REMOTE_WAKEUP) => { | 257 | (Request::CLEAR_FEATURE, Request::FEATURE_DEVICE_REMOTE_WAKEUP) => { |
| 252 | self.remote_wakeup_enabled = false; | 258 | self.remote_wakeup_enabled = false; |
| 253 | if let Some(h) = &mut self.handler { | 259 | if let Some(h) = &self.handler { |
| 254 | h.remote_wakeup_enabled(false); | 260 | h.remote_wakeup_enabled(false); |
| 255 | } | 261 | } |
| 256 | self.control.accept(stage) | 262 | self.control.accept(stage) |
| 257 | } | 263 | } |
| 258 | (Request::SET_FEATURE, Request::FEATURE_DEVICE_REMOTE_WAKEUP) => { | 264 | (Request::SET_FEATURE, Request::FEATURE_DEVICE_REMOTE_WAKEUP) => { |
| 259 | self.remote_wakeup_enabled = true; | 265 | self.remote_wakeup_enabled = true; |
| 260 | if let Some(h) = &mut self.handler { | 266 | if let Some(h) = &self.handler { |
| 261 | h.remote_wakeup_enabled(true); | 267 | h.remote_wakeup_enabled(true); |
| 262 | } | 268 | } |
| 263 | self.control.accept(stage) | 269 | self.control.accept(stage) |
| @@ -266,7 +272,7 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 266 | self.pending_address = addr as u8; | 272 | self.pending_address = addr as u8; |
| 267 | self.bus.set_device_address(self.pending_address); | 273 | self.bus.set_device_address(self.pending_address); |
| 268 | self.device_state = UsbDeviceState::Addressed; | 274 | self.device_state = UsbDeviceState::Addressed; |
| 269 | if let Some(h) = &mut self.handler { | 275 | if let Some(h) = &self.handler { |
| 270 | h.addressed(self.pending_address); | 276 | h.addressed(self.pending_address); |
| 271 | } | 277 | } |
| 272 | self.control.accept(stage) | 278 | self.control.accept(stage) |
| @@ -274,7 +280,7 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 274 | (Request::SET_CONFIGURATION, CONFIGURATION_VALUE_U16) => { | 280 | (Request::SET_CONFIGURATION, CONFIGURATION_VALUE_U16) => { |
| 275 | self.device_state = UsbDeviceState::Configured; | 281 | self.device_state = UsbDeviceState::Configured; |
| 276 | self.bus.set_configured(true); | 282 | self.bus.set_configured(true); |
| 277 | if let Some(h) = &mut self.handler { | 283 | if let Some(h) = &self.handler { |
| 278 | h.configured(true); | 284 | h.configured(true); |
| 279 | } | 285 | } |
| 280 | self.control.accept(stage) | 286 | self.control.accept(stage) |
| @@ -284,7 +290,7 @@ impl<'d, D: Driver<'d>, M: RawMutex> UsbDevice<'d, D, M> { | |||
| 284 | _ => { | 290 | _ => { |
| 285 | self.device_state = UsbDeviceState::Addressed; | 291 | self.device_state = UsbDeviceState::Addressed; |
| 286 | self.bus.set_configured(false); | 292 | self.bus.set_configured(false); |
| 287 | if let Some(h) = &mut self.handler { | 293 | if let Some(h) = &self.handler { |
| 288 | h.configured(false); | 294 | h.configured(false); |
| 289 | } | 295 | } |
| 290 | self.control.accept(stage) | 296 | self.control.accept(stage) |
diff --git a/examples/nrf/src/bin/usb_hid_keyboard.rs b/examples/nrf/src/bin/usb_hid_keyboard.rs index 483d86b81..fb3a198a7 100644 --- a/examples/nrf/src/bin/usb_hid_keyboard.rs +++ b/examples/nrf/src/bin/usb_hid_keyboard.rs | |||
| @@ -121,20 +121,20 @@ async fn main(_spawner: Spawner, p: Peripherals) { | |||
| 121 | 121 | ||
| 122 | if SUSPENDED.load(Ordering::Acquire) { | 122 | if SUSPENDED.load(Ordering::Acquire) { |
| 123 | info!("Triggering remote wakeup"); | 123 | info!("Triggering remote wakeup"); |
| 124 | USB_COMMANDS.send(DeviceCommand::RemoteWakeup); | 124 | USB_COMMANDS.send(DeviceCommand::RemoteWakeup).await; |
| 125 | } else { | ||
| 126 | let report = KeyboardReport { | ||
| 127 | keycodes: [4, 0, 0, 0, 0, 0], | ||
| 128 | leds: 0, | ||
| 129 | modifier: 0, | ||
| 130 | reserved: 0, | ||
| 131 | }; | ||
| 132 | match hid_in.serialize(&report).await { | ||
| 133 | Ok(()) => {} | ||
| 134 | Err(e) => warn!("Failed to send report: {:?}", e), | ||
| 135 | }; | ||
| 125 | } | 136 | } |
| 126 | 137 | ||
| 127 | let report = KeyboardReport { | ||
| 128 | keycodes: [4, 0, 0, 0, 0, 0], | ||
| 129 | leds: 0, | ||
| 130 | modifier: 0, | ||
| 131 | reserved: 0, | ||
| 132 | }; | ||
| 133 | match hid_in.serialize(&report).await { | ||
| 134 | Ok(()) => {} | ||
| 135 | Err(e) => warn!("Failed to send report: {:?}", e), | ||
| 136 | }; | ||
| 137 | |||
| 138 | button.wait_for_high().await; | 138 | button.wait_for_high().await; |
| 139 | info!("RELEASED"); | 139 | info!("RELEASED"); |
| 140 | let report = KeyboardReport { | 140 | let report = KeyboardReport { |
