diff options
| author | xoviat <[email protected]> | 2023-11-08 19:13:12 -0600 |
|---|---|---|
| committer | xoviat <[email protected]> | 2023-11-08 19:13:12 -0600 |
| commit | da4feb3693f01c8dc045ec4c5b5bae9c7246c354 (patch) | |
| tree | e8c67676b1db2001e62c151a8e42c22d30bee5a9 /embassy-usb | |
| parent | 05a4bb3a4acdb5a980efbb6f807696c1c702e01c (diff) | |
| parent | 1977acdb11c32f2b92c31885a8a1dc8c10425e56 (diff) | |
Merge branch 'main' of github.com:embassy-rs/embassy into low-power
Diffstat (limited to 'embassy-usb')
| -rw-r--r-- | embassy-usb/Cargo.toml | 1 | ||||
| -rw-r--r-- | embassy-usb/src/builder.rs | 18 | ||||
| -rw-r--r-- | embassy-usb/src/lib.rs | 23 | ||||
| -rw-r--r-- | embassy-usb/src/msos.rs | 2 |
4 files changed, 8 insertions, 36 deletions
diff --git a/embassy-usb/Cargo.toml b/embassy-usb/Cargo.toml index d820a2d0b..5f64b7212 100644 --- a/embassy-usb/Cargo.toml +++ b/embassy-usb/Cargo.toml | |||
| @@ -13,7 +13,6 @@ target = "thumbv7em-none-eabi" | |||
| 13 | [features] | 13 | [features] |
| 14 | defmt = ["dep:defmt", "embassy-usb-driver/defmt"] | 14 | defmt = ["dep:defmt", "embassy-usb-driver/defmt"] |
| 15 | usbd-hid = ["dep:usbd-hid", "dep:ssmarshal"] | 15 | usbd-hid = ["dep:usbd-hid", "dep:ssmarshal"] |
| 16 | msos-descriptor = [] | ||
| 17 | default = ["usbd-hid"] | 16 | default = ["usbd-hid"] |
| 18 | 17 | ||
| 19 | # BEGIN AUTOGENERATED CONFIG FEATURES | 18 | # BEGIN AUTOGENERATED CONFIG FEATURES |
diff --git a/embassy-usb/src/builder.rs b/embassy-usb/src/builder.rs index b4ddccd71..c4705d041 100644 --- a/embassy-usb/src/builder.rs +++ b/embassy-usb/src/builder.rs | |||
| @@ -3,7 +3,6 @@ use heapless::Vec; | |||
| 3 | use crate::config::MAX_HANDLER_COUNT; | 3 | use crate::config::MAX_HANDLER_COUNT; |
| 4 | use crate::descriptor::{BosWriter, DescriptorWriter}; | 4 | use crate::descriptor::{BosWriter, DescriptorWriter}; |
| 5 | use crate::driver::{Driver, Endpoint, EndpointType}; | 5 | use crate::driver::{Driver, Endpoint, EndpointType}; |
| 6 | #[cfg(feature = "msos-descriptor")] | ||
| 7 | use crate::msos::{DeviceLevelDescriptor, FunctionLevelDescriptor, MsOsDescriptorWriter}; | 6 | use crate::msos::{DeviceLevelDescriptor, FunctionLevelDescriptor, MsOsDescriptorWriter}; |
| 8 | use crate::types::{InterfaceNumber, StringIndex}; | 7 | use crate::types::{InterfaceNumber, StringIndex}; |
| 9 | use crate::{Handler, Interface, UsbDevice, MAX_INTERFACE_COUNT, STRING_INDEX_CUSTOM_START}; | 8 | use crate::{Handler, Interface, UsbDevice, MAX_INTERFACE_COUNT, STRING_INDEX_CUSTOM_START}; |
| @@ -133,7 +132,6 @@ pub struct Builder<'d, D: Driver<'d>> { | |||
| 133 | config_descriptor: DescriptorWriter<'d>, | 132 | config_descriptor: DescriptorWriter<'d>, |
| 134 | bos_descriptor: BosWriter<'d>, | 133 | bos_descriptor: BosWriter<'d>, |
| 135 | 134 | ||
| 136 | #[cfg(feature = "msos-descriptor")] | ||
| 137 | msos_descriptor: MsOsDescriptorWriter<'d>, | 135 | msos_descriptor: MsOsDescriptorWriter<'d>, |
| 138 | } | 136 | } |
| 139 | 137 | ||
| @@ -149,7 +147,7 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 149 | device_descriptor_buf: &'d mut [u8], | 147 | device_descriptor_buf: &'d mut [u8], |
| 150 | config_descriptor_buf: &'d mut [u8], | 148 | config_descriptor_buf: &'d mut [u8], |
| 151 | bos_descriptor_buf: &'d mut [u8], | 149 | bos_descriptor_buf: &'d mut [u8], |
| 152 | #[cfg(feature = "msos-descriptor")] msos_descriptor_buf: &'d mut [u8], | 150 | msos_descriptor_buf: &'d mut [u8], |
| 153 | control_buf: &'d mut [u8], | 151 | control_buf: &'d mut [u8], |
| 154 | ) -> Self { | 152 | ) -> Self { |
| 155 | // Magic values specified in USB-IF ECN on IADs. | 153 | // Magic values specified in USB-IF ECN on IADs. |
| @@ -189,14 +187,12 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 189 | config_descriptor, | 187 | config_descriptor, |
| 190 | bos_descriptor, | 188 | bos_descriptor, |
| 191 | 189 | ||
| 192 | #[cfg(feature = "msos-descriptor")] | ||
| 193 | msos_descriptor: MsOsDescriptorWriter::new(msos_descriptor_buf), | 190 | msos_descriptor: MsOsDescriptorWriter::new(msos_descriptor_buf), |
| 194 | } | 191 | } |
| 195 | } | 192 | } |
| 196 | 193 | ||
| 197 | /// Creates the [`UsbDevice`] instance with the configuration in this builder. | 194 | /// Creates the [`UsbDevice`] instance with the configuration in this builder. |
| 198 | pub fn build(mut self) -> UsbDevice<'d, D> { | 195 | pub fn build(mut self) -> UsbDevice<'d, D> { |
| 199 | #[cfg(feature = "msos-descriptor")] | ||
| 200 | let msos_descriptor = self.msos_descriptor.build(&mut self.bos_descriptor); | 196 | let msos_descriptor = self.msos_descriptor.build(&mut self.bos_descriptor); |
| 201 | 197 | ||
| 202 | self.config_descriptor.end_configuration(); | 198 | self.config_descriptor.end_configuration(); |
| @@ -206,7 +202,6 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 206 | info!("USB: device_descriptor used: {}", self.device_descriptor.position()); | 202 | info!("USB: device_descriptor used: {}", self.device_descriptor.position()); |
| 207 | info!("USB: config_descriptor used: {}", self.config_descriptor.position()); | 203 | info!("USB: config_descriptor used: {}", self.config_descriptor.position()); |
| 208 | info!("USB: bos_descriptor used: {}", self.bos_descriptor.writer.position()); | 204 | info!("USB: bos_descriptor used: {}", self.bos_descriptor.writer.position()); |
| 209 | #[cfg(feature = "msos-descriptor")] | ||
| 210 | info!("USB: msos_descriptor used: {}", msos_descriptor.len()); | 205 | info!("USB: msos_descriptor used: {}", msos_descriptor.len()); |
| 211 | info!("USB: control_buf size: {}", self.control_buf.len()); | 206 | info!("USB: control_buf size: {}", self.control_buf.len()); |
| 212 | 207 | ||
| @@ -217,10 +212,9 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 217 | self.device_descriptor.into_buf(), | 212 | self.device_descriptor.into_buf(), |
| 218 | self.config_descriptor.into_buf(), | 213 | self.config_descriptor.into_buf(), |
| 219 | self.bos_descriptor.writer.into_buf(), | 214 | self.bos_descriptor.writer.into_buf(), |
| 215 | msos_descriptor, | ||
| 220 | self.interfaces, | 216 | self.interfaces, |
| 221 | self.control_buf, | 217 | self.control_buf, |
| 222 | #[cfg(feature = "msos-descriptor")] | ||
| 223 | msos_descriptor, | ||
| 224 | ) | 218 | ) |
| 225 | } | 219 | } |
| 226 | 220 | ||
| @@ -251,7 +245,6 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 251 | builder: self, | 245 | builder: self, |
| 252 | iface_count_index, | 246 | iface_count_index, |
| 253 | 247 | ||
| 254 | #[cfg(feature = "msos-descriptor")] | ||
| 255 | first_interface, | 248 | first_interface, |
| 256 | } | 249 | } |
| 257 | } | 250 | } |
| @@ -275,7 +268,6 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 275 | StringIndex::new(index) | 268 | StringIndex::new(index) |
| 276 | } | 269 | } |
| 277 | 270 | ||
| 278 | #[cfg(feature = "msos-descriptor")] | ||
| 279 | /// Add an MS OS 2.0 Descriptor Set. | 271 | /// Add an MS OS 2.0 Descriptor Set. |
| 280 | /// | 272 | /// |
| 281 | /// Panics if called more than once. | 273 | /// Panics if called more than once. |
| @@ -283,13 +275,11 @@ impl<'d, D: Driver<'d>> Builder<'d, D> { | |||
| 283 | self.msos_descriptor.header(windows_version, vendor_code); | 275 | self.msos_descriptor.header(windows_version, vendor_code); |
| 284 | } | 276 | } |
| 285 | 277 | ||
| 286 | #[cfg(feature = "msos-descriptor")] | ||
| 287 | /// Add an MS OS 2.0 Device Level Feature Descriptor. | 278 | /// Add an MS OS 2.0 Device Level Feature Descriptor. |
| 288 | pub fn msos_feature<T: DeviceLevelDescriptor>(&mut self, desc: T) { | 279 | pub fn msos_feature<T: DeviceLevelDescriptor>(&mut self, desc: T) { |
| 289 | self.msos_descriptor.device_feature(desc); | 280 | self.msos_descriptor.device_feature(desc); |
| 290 | } | 281 | } |
| 291 | 282 | ||
| 292 | #[cfg(feature = "msos-descriptor")] | ||
| 293 | /// Gets the underlying [`MsOsDescriptorWriter`] to allow adding subsets and features for classes that | 283 | /// Gets the underlying [`MsOsDescriptorWriter`] to allow adding subsets and features for classes that |
| 294 | /// do not add their own. | 284 | /// do not add their own. |
| 295 | pub fn msos_writer(&mut self) -> &mut MsOsDescriptorWriter<'d> { | 285 | pub fn msos_writer(&mut self) -> &mut MsOsDescriptorWriter<'d> { |
| @@ -306,13 +296,11 @@ pub struct FunctionBuilder<'a, 'd, D: Driver<'d>> { | |||
| 306 | builder: &'a mut Builder<'d, D>, | 296 | builder: &'a mut Builder<'d, D>, |
| 307 | iface_count_index: Option<usize>, | 297 | iface_count_index: Option<usize>, |
| 308 | 298 | ||
| 309 | #[cfg(feature = "msos-descriptor")] | ||
| 310 | first_interface: InterfaceNumber, | 299 | first_interface: InterfaceNumber, |
| 311 | } | 300 | } |
| 312 | 301 | ||
| 313 | impl<'a, 'd, D: Driver<'d>> Drop for FunctionBuilder<'a, 'd, D> { | 302 | impl<'a, 'd, D: Driver<'d>> Drop for FunctionBuilder<'a, 'd, D> { |
| 314 | fn drop(&mut self) { | 303 | fn drop(&mut self) { |
| 315 | #[cfg(feature = "msos-descriptor")] | ||
| 316 | self.builder.msos_descriptor.end_function(); | 304 | self.builder.msos_descriptor.end_function(); |
| 317 | } | 305 | } |
| 318 | } | 306 | } |
| @@ -344,7 +332,6 @@ impl<'a, 'd, D: Driver<'d>> FunctionBuilder<'a, 'd, D> { | |||
| 344 | } | 332 | } |
| 345 | } | 333 | } |
| 346 | 334 | ||
| 347 | #[cfg(feature = "msos-descriptor")] | ||
| 348 | /// Add an MS OS 2.0 Function Level Feature Descriptor. | 335 | /// Add an MS OS 2.0 Function Level Feature Descriptor. |
| 349 | pub fn msos_feature<T: FunctionLevelDescriptor>(&mut self, desc: T) { | 336 | pub fn msos_feature<T: FunctionLevelDescriptor>(&mut self, desc: T) { |
| 350 | if !self.builder.msos_descriptor.is_in_config_subset() { | 337 | if !self.builder.msos_descriptor.is_in_config_subset() { |
| @@ -355,7 +342,6 @@ impl<'a, 'd, D: Driver<'d>> FunctionBuilder<'a, 'd, D> { | |||
| 355 | self.builder.msos_descriptor.function(self.first_interface); | 342 | self.builder.msos_descriptor.function(self.first_interface); |
| 356 | } | 343 | } |
| 357 | 344 | ||
| 358 | #[cfg(feature = "msos-descriptor")] | ||
| 359 | self.builder.msos_descriptor.function_feature(desc); | 345 | self.builder.msos_descriptor.function_feature(desc); |
| 360 | } | 346 | } |
| 361 | } | 347 | } |
diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index 9fc1e3320..241e33a78 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs | |||
| @@ -175,10 +175,7 @@ pub struct UsbBufferReport { | |||
| 175 | /// Number of bos descriptor bytes used | 175 | /// Number of bos descriptor bytes used |
| 176 | pub bos_descriptor_used: usize, | 176 | pub bos_descriptor_used: usize, |
| 177 | /// Number of msos descriptor bytes used | 177 | /// Number of msos descriptor bytes used |
| 178 | /// | 178 | pub msos_descriptor_used: usize, |
| 179 | /// Will be `None` if the "msos-descriptor" feature is not active. | ||
| 180 | /// Otherwise will return Some(bytes). | ||
| 181 | pub msos_descriptor_used: Option<usize>, | ||
| 182 | /// Size of the control buffer | 179 | /// Size of the control buffer |
| 183 | pub control_buffer_size: usize, | 180 | pub control_buffer_size: usize, |
| 184 | } | 181 | } |
| @@ -197,6 +194,7 @@ struct Inner<'d, D: Driver<'d>> { | |||
| 197 | device_descriptor: &'d [u8], | 194 | device_descriptor: &'d [u8], |
| 198 | config_descriptor: &'d [u8], | 195 | config_descriptor: &'d [u8], |
| 199 | bos_descriptor: &'d [u8], | 196 | bos_descriptor: &'d [u8], |
| 197 | msos_descriptor: crate::msos::MsOsDescriptorSet<'d>, | ||
| 200 | 198 | ||
| 201 | device_state: UsbDeviceState, | 199 | device_state: UsbDeviceState, |
| 202 | suspended: bool, | 200 | suspended: bool, |
| @@ -212,9 +210,6 @@ struct Inner<'d, D: Driver<'d>> { | |||
| 212 | 210 | ||
| 213 | interfaces: Vec<Interface, MAX_INTERFACE_COUNT>, | 211 | interfaces: Vec<Interface, MAX_INTERFACE_COUNT>, |
| 214 | handlers: Vec<&'d mut dyn Handler, MAX_HANDLER_COUNT>, | 212 | handlers: Vec<&'d mut dyn Handler, MAX_HANDLER_COUNT>, |
| 215 | |||
| 216 | #[cfg(feature = "msos-descriptor")] | ||
| 217 | msos_descriptor: crate::msos::MsOsDescriptorSet<'d>, | ||
| 218 | } | 213 | } |
| 219 | 214 | ||
| 220 | impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | 215 | impl<'d, D: Driver<'d>> UsbDevice<'d, D> { |
| @@ -225,9 +220,9 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 225 | device_descriptor: &'d [u8], | 220 | device_descriptor: &'d [u8], |
| 226 | config_descriptor: &'d [u8], | 221 | config_descriptor: &'d [u8], |
| 227 | bos_descriptor: &'d [u8], | 222 | bos_descriptor: &'d [u8], |
| 223 | msos_descriptor: crate::msos::MsOsDescriptorSet<'d>, | ||
| 228 | interfaces: Vec<Interface, MAX_INTERFACE_COUNT>, | 224 | interfaces: Vec<Interface, MAX_INTERFACE_COUNT>, |
| 229 | control_buf: &'d mut [u8], | 225 | control_buf: &'d mut [u8], |
| 230 | #[cfg(feature = "msos-descriptor")] msos_descriptor: crate::msos::MsOsDescriptorSet<'d>, | ||
| 231 | ) -> UsbDevice<'d, D> { | 226 | ) -> UsbDevice<'d, D> { |
| 232 | // Start the USB bus. | 227 | // Start the USB bus. |
| 233 | // This prevent further allocation by consuming the driver. | 228 | // This prevent further allocation by consuming the driver. |
| @@ -242,6 +237,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 242 | device_descriptor, | 237 | device_descriptor, |
| 243 | config_descriptor, | 238 | config_descriptor, |
| 244 | bos_descriptor, | 239 | bos_descriptor, |
| 240 | msos_descriptor, | ||
| 245 | 241 | ||
| 246 | device_state: UsbDeviceState::Unpowered, | 242 | device_state: UsbDeviceState::Unpowered, |
| 247 | suspended: false, | 243 | suspended: false, |
| @@ -251,8 +247,6 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 251 | set_address_pending: false, | 247 | set_address_pending: false, |
| 252 | interfaces, | 248 | interfaces, |
| 253 | handlers, | 249 | handlers, |
| 254 | #[cfg(feature = "msos-descriptor")] | ||
| 255 | msos_descriptor, | ||
| 256 | }, | 250 | }, |
| 257 | } | 251 | } |
| 258 | } | 252 | } |
| @@ -261,16 +255,11 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { | |||
| 261 | /// | 255 | /// |
| 262 | /// Useful for tuning buffer sizes for actual usage | 256 | /// Useful for tuning buffer sizes for actual usage |
| 263 | pub fn buffer_usage(&self) -> UsbBufferReport { | 257 | pub fn buffer_usage(&self) -> UsbBufferReport { |
| 264 | #[cfg(not(feature = "msos-descriptor"))] | ||
| 265 | let mdu = None; | ||
| 266 | #[cfg(feature = "msos-descriptor")] | ||
| 267 | let mdu = Some(self.inner.msos_descriptor.len()); | ||
| 268 | |||
| 269 | UsbBufferReport { | 258 | UsbBufferReport { |
| 270 | device_descriptor_used: self.inner.device_descriptor.len(), | 259 | device_descriptor_used: self.inner.device_descriptor.len(), |
| 271 | config_descriptor_used: self.inner.config_descriptor.len(), | 260 | config_descriptor_used: self.inner.config_descriptor.len(), |
| 272 | bos_descriptor_used: self.inner.bos_descriptor.len(), | 261 | bos_descriptor_used: self.inner.bos_descriptor.len(), |
| 273 | msos_descriptor_used: mdu, | 262 | msos_descriptor_used: self.inner.msos_descriptor.len(), |
| 274 | control_buffer_size: self.control_buf.len(), | 263 | control_buffer_size: self.control_buf.len(), |
| 275 | } | 264 | } |
| 276 | } | 265 | } |
| @@ -684,7 +673,7 @@ impl<'d, D: Driver<'d>> Inner<'d, D> { | |||
| 684 | } | 673 | } |
| 685 | _ => InResponse::Rejected, | 674 | _ => InResponse::Rejected, |
| 686 | }, | 675 | }, |
| 687 | #[cfg(feature = "msos-descriptor")] | 676 | |
| 688 | (RequestType::Vendor, Recipient::Device) => { | 677 | (RequestType::Vendor, Recipient::Device) => { |
| 689 | if !self.msos_descriptor.is_empty() | 678 | if !self.msos_descriptor.is_empty() |
| 690 | && req.request == self.msos_descriptor.vendor_code() | 679 | && req.request == self.msos_descriptor.vendor_code() |
diff --git a/embassy-usb/src/msos.rs b/embassy-usb/src/msos.rs index 13d5d7c4b..3858c0f51 100644 --- a/embassy-usb/src/msos.rs +++ b/embassy-usb/src/msos.rs | |||
| @@ -1,5 +1,3 @@ | |||
| 1 | #![cfg(feature = "msos-descriptor")] | ||
| 2 | |||
| 3 | //! Microsoft OS Descriptors | 1 | //! Microsoft OS Descriptors |
| 4 | //! | 2 | //! |
| 5 | //! <https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-os-2-0-descriptors-specification> | 3 | //! <https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-os-2-0-descriptors-specification> |
