aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-usb/src/lib.rs30
-rw-r--r--examples/nrf/src/bin/usb_hid_keyboard.rs24
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 {