From 56da5a2c575b71d20c35a62f3a5c94bbcfc97f30 Mon Sep 17 00:00:00 2001 From: bae <73325521+baeuric@users.noreply.github.com> Date: Mon, 29 May 2023 17:59:17 -0700 Subject: [PATCH] fix(embassy-usb): Make BOS descriptor optional --- embassy-usb/src/builder.rs | 21 ++++++++++++++------- embassy-usb/src/lib.rs | 15 ++++++++++----- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/embassy-usb/src/builder.rs b/embassy-usb/src/builder.rs index 6b68bcd7..9f263626 100644 --- a/embassy-usb/src/builder.rs +++ b/embassy-usb/src/builder.rs @@ -131,7 +131,7 @@ pub struct Builder<'d, D: Driver<'d>> { device_descriptor: DescriptorWriter<'d>, config_descriptor: DescriptorWriter<'d>, - bos_descriptor: BosWriter<'d>, + bos_descriptor: Option>, #[cfg(feature = "msos-descriptor")] msos_descriptor: MsOsDescriptorWriter<'d>, @@ -148,7 +148,7 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { config: Config<'d>, device_descriptor_buf: &'d mut [u8], config_descriptor_buf: &'d mut [u8], - bos_descriptor_buf: &'d mut [u8], + bos_descriptor_buf: Option<&'d mut [u8]>, #[cfg(feature = "msos-descriptor")] msos_descriptor_buf: &'d mut [u8], control_buf: &'d mut [u8], ) -> Self { @@ -170,11 +170,13 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { let mut device_descriptor = DescriptorWriter::new(device_descriptor_buf); let mut config_descriptor = DescriptorWriter::new(config_descriptor_buf); - let mut bos_descriptor = BosWriter::new(DescriptorWriter::new(bos_descriptor_buf)); + let mut bos_descriptor = bos_descriptor_buf.map(|buf| BosWriter::new(DescriptorWriter::new(buf))); device_descriptor.device(&config); config_descriptor.configuration(&config); - bos_descriptor.bos(); + if let Some(descriptor) = bos_descriptor.as_mut() { + descriptor.bos(); + } Builder { driver, @@ -199,12 +201,16 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { let msos_descriptor = self.msos_descriptor.build(&mut self.bos_descriptor); self.config_descriptor.end_configuration(); - self.bos_descriptor.end_bos(); + if let Some(descriptor) = self.bos_descriptor.as_mut() { + descriptor.end_bos(); + } // Log the number of allocator bytes actually used in descriptor buffers info!("USB: device_descriptor used: {}", self.device_descriptor.position()); info!("USB: config_descriptor used: {}", self.config_descriptor.position()); - info!("USB: bos_descriptor used: {}", self.bos_descriptor.writer.position()); + if let Some(descriptor) = self.bos_descriptor.as_ref() { + info!("USB: bos_descriptor used: {}", descriptor.writer.position()); + } #[cfg(feature = "msos-descriptor")] info!("USB: msos_descriptor used: {}", msos_descriptor.len()); info!("USB: control_buf size: {}", self.control_buf.len()); @@ -215,7 +221,8 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { self.handlers, self.device_descriptor.into_buf(), self.config_descriptor.into_buf(), - self.bos_descriptor.writer.into_buf(), + self.bos_descriptor + .map(|descriptor| descriptor.writer.into_buf() as &[u8]), self.interfaces, self.control_buf, #[cfg(feature = "msos-descriptor")] diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index d8563d59..796c95be 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs @@ -173,7 +173,9 @@ pub struct UsbBufferReport { /// Number of config descriptor bytes used pub config_descriptor_used: usize, /// Number of bos descriptor bytes used - pub bos_descriptor_used: usize, + /// + /// Will be `None` if "bos_descriptor_buf" was not supplied to builder + pub bos_descriptor_used: Option, /// Number of msos descriptor bytes used /// /// Will be `None` if the "msos-descriptor" feature is not active. @@ -196,7 +198,7 @@ struct Inner<'d, D: Driver<'d>> { config: Config<'d>, device_descriptor: &'d [u8], config_descriptor: &'d [u8], - bos_descriptor: &'d [u8], + bos_descriptor: Option<&'d [u8]>, device_state: UsbDeviceState, suspended: bool, @@ -224,7 +226,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { handlers: Vec<&'d mut dyn Handler, MAX_HANDLER_COUNT>, device_descriptor: &'d [u8], config_descriptor: &'d [u8], - bos_descriptor: &'d [u8], + bos_descriptor: Option<&'d [u8]>, interfaces: Vec, control_buf: &'d mut [u8], #[cfg(feature = "msos-descriptor")] msos_descriptor: crate::msos::MsOsDescriptorSet<'d>, @@ -269,7 +271,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { UsbBufferReport { device_descriptor_used: self.inner.device_descriptor.len(), config_descriptor_used: self.inner.config_descriptor.len(), - bos_descriptor_used: self.inner.bos_descriptor.len(), + bos_descriptor_used: self.inner.bos_descriptor.map(|descriptor| descriptor.len()), msos_descriptor_used: mdu, control_buffer_size: self.control_buf.len(), } @@ -726,7 +728,10 @@ impl<'d, D: Driver<'d>> Inner<'d, D> { let (dtype, index) = req.descriptor_type_index(); match dtype { - descriptor_type::BOS => InResponse::Accepted(self.bos_descriptor), + descriptor_type::BOS => match self.bos_descriptor { + Some(descriptor) => InResponse::Accepted(descriptor), + None => InResponse::Rejected, + }, descriptor_type::DEVICE => InResponse::Accepted(self.device_descriptor), descriptor_type::CONFIGURATION => InResponse::Accepted(self.config_descriptor), descriptor_type::STRING => {