aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-11-08 19:13:12 -0600
committerxoviat <[email protected]>2023-11-08 19:13:12 -0600
commitda4feb3693f01c8dc045ec4c5b5bae9c7246c354 (patch)
treee8c67676b1db2001e62c151a8e42c22d30bee5a9 /embassy-usb
parent05a4bb3a4acdb5a980efbb6f807696c1c702e01c (diff)
parent1977acdb11c32f2b92c31885a8a1dc8c10425e56 (diff)
Merge branch 'main' of github.com:embassy-rs/embassy into low-power
Diffstat (limited to 'embassy-usb')
-rw-r--r--embassy-usb/Cargo.toml1
-rw-r--r--embassy-usb/src/builder.rs18
-rw-r--r--embassy-usb/src/lib.rs23
-rw-r--r--embassy-usb/src/msos.rs2
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]
14defmt = ["dep:defmt", "embassy-usb-driver/defmt"] 14defmt = ["dep:defmt", "embassy-usb-driver/defmt"]
15usbd-hid = ["dep:usbd-hid", "dep:ssmarshal"] 15usbd-hid = ["dep:usbd-hid", "dep:ssmarshal"]
16msos-descriptor = []
17default = ["usbd-hid"] 16default = ["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;
3use crate::config::MAX_HANDLER_COUNT; 3use crate::config::MAX_HANDLER_COUNT;
4use crate::descriptor::{BosWriter, DescriptorWriter}; 4use crate::descriptor::{BosWriter, DescriptorWriter};
5use crate::driver::{Driver, Endpoint, EndpointType}; 5use crate::driver::{Driver, Endpoint, EndpointType};
6#[cfg(feature = "msos-descriptor")]
7use crate::msos::{DeviceLevelDescriptor, FunctionLevelDescriptor, MsOsDescriptorWriter}; 6use crate::msos::{DeviceLevelDescriptor, FunctionLevelDescriptor, MsOsDescriptorWriter};
8use crate::types::{InterfaceNumber, StringIndex}; 7use crate::types::{InterfaceNumber, StringIndex};
9use crate::{Handler, Interface, UsbDevice, MAX_INTERFACE_COUNT, STRING_INDEX_CUSTOM_START}; 8use 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
313impl<'a, 'd, D: Driver<'d>> Drop for FunctionBuilder<'a, 'd, D> { 302impl<'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
220impl<'d, D: Driver<'d>> UsbDevice<'d, D> { 215impl<'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>