aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-usb/src/lib.rs')
-rw-r--r--embassy-usb/src/lib.rs41
1 files changed, 17 insertions, 24 deletions
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs
index 2e859e3d8..88d88cad7 100644
--- a/embassy-usb/src/lib.rs
+++ b/embassy-usb/src/lib.rs
@@ -24,12 +24,12 @@ use embassy_futures::select::{select, Either};
24use heapless::Vec; 24use heapless::Vec;
25 25
26pub use crate::builder::{Builder, Config, FunctionBuilder, InterfaceAltBuilder, InterfaceBuilder}; 26pub use crate::builder::{Builder, Config, FunctionBuilder, InterfaceAltBuilder, InterfaceBuilder};
27use crate::config::*; 27use crate::config::{MAX_HANDLER_COUNT, MAX_INTERFACE_COUNT};
28use crate::control::*; 28use crate::control::{InResponse, OutResponse, Recipient, Request, RequestType};
29use crate::descriptor::*; 29use crate::descriptor::{descriptor_type, lang_id};
30use crate::descriptor_reader::foreach_endpoint; 30use crate::descriptor_reader::foreach_endpoint;
31use crate::driver::{Bus, ControlPipe, Direction, Driver, EndpointAddress, Event}; 31use crate::driver::{Bus, ControlPipe, Direction, Driver, EndpointAddress, Event};
32use crate::types::*; 32use crate::types::{InterfaceNumber, StringIndex};
33 33
34/// The global state of the USB device. 34/// The global state of the USB device.
35/// 35///
@@ -364,6 +364,8 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
364 } 364 }
365 365
366 async fn handle_control_in(&mut self, req: Request) { 366 async fn handle_control_in(&mut self, req: Request) {
367 const DEVICE_DESCRIPTOR_LEN: usize = 18;
368
367 let mut resp_length = req.length as usize; 369 let mut resp_length = req.length as usize;
368 let max_packet_size = self.control.max_packet_size(); 370 let max_packet_size = self.control.max_packet_size();
369 371
@@ -371,7 +373,6 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
371 // The host doesn't know our EP0 max packet size yet, and might assume 373 // The host doesn't know our EP0 max packet size yet, and might assume
372 // a full-length packet is a short packet, thinking we're done sending data. 374 // a full-length packet is a short packet, thinking we're done sending data.
373 // See https://github.com/hathach/tinyusb/issues/184 375 // See https://github.com/hathach/tinyusb/issues/184
374 const DEVICE_DESCRIPTOR_LEN: usize = 18;
375 if self.inner.address == 0 && max_packet_size < DEVICE_DESCRIPTOR_LEN && max_packet_size < resp_length { 376 if self.inner.address == 0 && max_packet_size < DEVICE_DESCRIPTOR_LEN && max_packet_size < resp_length {
376 trace!("received control req while not addressed: capping response to 1 packet."); 377 trace!("received control req while not addressed: capping response to 1 packet.");
377 resp_length = max_packet_size; 378 resp_length = max_packet_size;
@@ -432,7 +433,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
432 self.control.accept_set_address(self.inner.address).await; 433 self.control.accept_set_address(self.inner.address).await;
433 self.inner.set_address_pending = false; 434 self.inner.set_address_pending = false;
434 } else { 435 } else {
435 self.control.accept().await 436 self.control.accept().await;
436 } 437 }
437 } 438 }
438 OutResponse::Rejected => self.control.reject().await, 439 OutResponse::Rejected => self.control.reject().await,
@@ -545,9 +546,8 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
545 546
546 OutResponse::Accepted 547 OutResponse::Accepted
547 } 548 }
548 (Request::SET_CONFIGURATION, CONFIGURATION_NONE_U16) => match self.device_state { 549 (Request::SET_CONFIGURATION, CONFIGURATION_NONE_U16) => {
549 UsbDeviceState::Default => OutResponse::Accepted, 550 if self.device_state != UsbDeviceState::Default {
550 _ => {
551 debug!("SET_CONFIGURATION: unconfigured"); 551 debug!("SET_CONFIGURATION: unconfigured");
552 self.device_state = UsbDeviceState::Addressed; 552 self.device_state = UsbDeviceState::Addressed;
553 553
@@ -561,17 +561,15 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
561 for h in &mut self.handlers { 561 for h in &mut self.handlers {
562 h.configured(false); 562 h.configured(false);
563 } 563 }
564
565 OutResponse::Accepted
566 } 564 }
567 }, 565 OutResponse::Accepted
566 }
568 _ => OutResponse::Rejected, 567 _ => OutResponse::Rejected,
569 }, 568 },
570 (RequestType::Standard, Recipient::Interface) => { 569 (RequestType::Standard, Recipient::Interface) => {
571 let iface_num = InterfaceNumber::new(req.index as _); 570 let iface_num = InterfaceNumber::new(req.index as _);
572 let iface = match self.interfaces.get_mut(iface_num.0 as usize) { 571 let Some(iface) = self.interfaces.get_mut(iface_num.0 as usize) else {
573 Some(iface) => iface, 572 return OutResponse::Rejected;
574 None => return OutResponse::Rejected,
575 }; 573 };
576 574
577 match req.request { 575 match req.request {
@@ -647,9 +645,8 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
647 _ => InResponse::Rejected, 645 _ => InResponse::Rejected,
648 }, 646 },
649 (RequestType::Standard, Recipient::Interface) => { 647 (RequestType::Standard, Recipient::Interface) => {
650 let iface = match self.interfaces.get_mut(req.index as usize) { 648 let Some(iface) = self.interfaces.get_mut(req.index as usize) else {
651 Some(iface) => iface, 649 return InResponse::Rejected;
652 None => return InResponse::Rejected,
653 }; 650 };
654 651
655 match req.request { 652 match req.request {
@@ -753,16 +750,12 @@ impl<'d, D: Driver<'d>> Inner<'d, D> {
753 }; 750 };
754 751
755 if let Some(s) = s { 752 if let Some(s) = s {
756 if buf.len() < 2 { 753 assert!(buf.len() >= 2, "control buffer too small");
757 panic!("control buffer too small");
758 }
759 754
760 buf[1] = descriptor_type::STRING; 755 buf[1] = descriptor_type::STRING;
761 let mut pos = 2; 756 let mut pos = 2;
762 for c in s.encode_utf16() { 757 for c in s.encode_utf16() {
763 if pos + 2 >= buf.len() { 758 assert!(pos + 2 < buf.len(), "control buffer too small");
764 panic!("control buffer too small");
765 }
766 759
767 buf[pos..pos + 2].copy_from_slice(&c.to_le_bytes()); 760 buf[pos..pos + 2].copy_from_slice(&c.to_le_bytes());
768 pos += 2; 761 pos += 2;