diff options
Diffstat (limited to 'embassy-usb/src/lib.rs')
| -rw-r--r-- | embassy-usb/src/lib.rs | 41 |
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}; | |||
| 24 | use heapless::Vec; | 24 | use heapless::Vec; |
| 25 | 25 | ||
| 26 | pub use crate::builder::{Builder, Config, FunctionBuilder, InterfaceAltBuilder, InterfaceBuilder}; | 26 | pub use crate::builder::{Builder, Config, FunctionBuilder, InterfaceAltBuilder, InterfaceBuilder}; |
| 27 | use crate::config::*; | 27 | use crate::config::{MAX_HANDLER_COUNT, MAX_INTERFACE_COUNT}; |
| 28 | use crate::control::*; | 28 | use crate::control::{InResponse, OutResponse, Recipient, Request, RequestType}; |
| 29 | use crate::descriptor::*; | 29 | use crate::descriptor::{descriptor_type, lang_id}; |
| 30 | use crate::descriptor_reader::foreach_endpoint; | 30 | use crate::descriptor_reader::foreach_endpoint; |
| 31 | use crate::driver::{Bus, ControlPipe, Direction, Driver, EndpointAddress, Event}; | 31 | use crate::driver::{Bus, ControlPipe, Direction, Driver, EndpointAddress, Event}; |
| 32 | use crate::types::*; | 32 | use 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; |
